inofrmix笔记(点点滴滴)

本文记录了Informix 7.0版本的一些常用操作,包括判断不等于、空值检查、NVL函数的多种用法、日期转换、SQL执行过程查看、存储过程创建、UPDATE语句的特殊用法、CASE语句示例、统计优化、字符串连接以及LIKE与[]的使用。还涉及了JDBC事务处理、数据备份与导入、更改表名、COUNT函数区别和锁表问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Informix7.0版本,一直都是使用此版本)

1、不等于 <>

2、判断是否为空:is null

3nvl函数
   NVL(expr1,expr2)
:如果expr1NULL,则返回expr2,否则返回expr1.返回值与expr1类型相同,除非expr1是字符串类,在这种情况下将返回VARCHAR2类型.这个函数用于确保查询记录集中不包含NULL值。   
   NVL(expr1,expr2,expr3) 
:如果expr1NULL,则返回expr2,否则返回expr3.返回值与expr2类型相同,除非expr2是字符类型,在这种情况下返回VARCHAR2类型;
   NULLIF(a,b) 
:如果a等于b返回NULL,如果不等于返回b

4substr()函数:substr(str,startindex,count);其他数据库一般用substring(str,startindex,count)

5string转换成sqldate型:to_date(' 2006-12-25 ','%Y-%m-%d')

6、得到昨天的日期:today-1

7、查看sql的执行过程:
    1)
登录:su - informix
    2)
建立SQL文件,里面放要执行的sql语句,同时在前面加一行,set explain on;sql 语句;
    3)
导入sql文件执行:isql -s databasename<filename
    4)
查看执行过程:cat sqexplain.out

8、建立临时表:
    into temp tablename with no log ;
最好加上with no log;

9、建立存储过程:
    1)
文件命名为zeng.sql
   drop procedure zeng;
   create procedure zeng(deptstr varchar(20),time1 char(10),time2 char(10))
   returning decimal(14,2);
   define mysum decimal(14,2);
   select a.ownid,a.masterid,c.sendsum from distribute a,order_bankbill b,bankbill c where a.orderid=b.orderid and b.bankbillid=c.id and a.deptno=deptstr and c.sendtime >=time1 and c.sendtime <=time2 into temp mytemp with no log ;
   select nvl(sum(sendsum),0) into mysum from mytemp where ownid=masterid;
   return mysum WITH  RESUME;
   end procedure
   2)
导入到数据库:
   dbaccess databasename zengchao.sql
   3)
进入数据库,执行
   dbaccess databasename
    ……
   execute procedure zeng ('00xm010101',' 2006-03-01 ',' 2006-03-25 ');

10update的一种用法
     update distribute set (masterid,mastername)=
((select nvl(groupmanager,0),nvl(groupmanagername,'') from department where distribute.deptno=department.departmentno ))
where opertime>=' 2007-02-11 ';//
注意后面不要漏掉一层括号

11uniquedistinct的区别:
   unique
distinct的同义词,功能完全相同。distinct是标准语法,其他数据库 sql serverdb2oraclesybasemysql等都支持。uniqueinformix数据库认识,其他数据库有的认识,有的不认识。

12Case语句用法:
    select name,case when id=9188 then ' tt t' else name end from employee where departmentno ='00xm';

13、使用优化器(update statistics):
  
优化使系统表的信息与实际一致,使搜索树的路径最优。同时,整理索引树。例:
   1. update statistics for table
   2. update statistics for procedure
   3. update statistics for table rta1(bm_cert)
   4. update statistics high for table rta1(bm_cert) resolution 0.5

14、连接字符串(||)
   select id ||':'|| name from employee

15JDBC事务与游标
  
先关闭ResultSet然后提交事务;

16informix备份表数据(isql)
   1)
导出:unload to "zengchao.data" select * from position;
   2)
导入:load from "zengchao.data" insert into position;

17、关于like[]
   select count(*) from employee where departmentno like '00xm01%';
   select count(*) from employee where departmentno[1,6]='00xm01';
  
这两条语句,执行差不多,但是估计成本是第二个比第一个好

18informix下更改表名
   update systables set tabname='oldredeploy' where tabname='redeploy';

19count(name)count(*)
  
如果name列有null,那么如下两条语句得到的返回值不等
   select count(*) from tablename
   select count(name) from tablename

20、锁表的解决方法

1、找到被锁表的partnum:select  hex(partnum) from systables  where  tabname = ”tabalname”;
2、onstat -k|grep partnum 找到该锁的owner;
3、onstat -u | grep owner 找到用户会话session号;
4、onmode -z sesid 杀掉该session;
5、如果第4步失败,则进一步onstat -g ses | grep sesid 找到该发起该会话的pid;
6、kill pid 或 kill -9 pid;
7、特殊情况:在第2步中,如果发现锁的owner为0,则检查:
 onstat -x
 onstat -G
看是否存在全局事务,若有全局事务,则继续以下步骤:select hex(tx_addr) trans_addr,hex(tx_lklist) lock_addr from systrans where hex(tx_addr) like '%c000000007674c58%';需要说明的是,c000000007674c58是使用onstat -x 或 onstat -G得到的全局事务的地址。上面SQL语句提供出该全局事务对应的锁地址,这时如果得到的锁地址与锁表的锁地址相同的话,你就必需从应用端(通常是三层结构的中间件)发命令让该全局事务回滚或提交,否则该锁会被一直持有,直到你执行oninit -i。

21、从数据库的数据导成Excel格式

方法一:
1)导成csv文件:unload to data.csv select * from tablename;
2)转换成Excel:用Excel中的“数据”->“导入外部数据”->“导入文本文件”,选择分隔符为'|';

方法二:
用Excel中的“数据”->“导入外部数据”->“新建数据库查询”,然后配置数据源。

22、配置Informix-CLI

1、配置Informix-Setnet32

2)2)配置Odbc-Administrator
a)新建一用户DNS

b)配置DNS

c)高级属性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值