语句 报告程序错误 执行程序 语句终止符 Informix SPL RAISE EXCEPTION EXECUTE 分号(;)
14声明变量
Informix DEFINE VSSN CHAR(9); VFNAME VARCHAR(12); VLNAME VARCHAR(20); VBIRTH_DATE DATE; VLOAN_AMOUNT NUMBER(12,2);
15为变量赋值
Informix LET variable = value 法 无 其它 SET @variable = value SELECT @var=
DECLARE VSSN CHAR(9); DEFINE VFNAME VARCHAR(12); DEFINE VLNAME VARCHAR(20); BEGIN
LET VSSN = '123448887';
SELECT FNAME, LNAME INTO VFNAME, VLNAME FROM STUDENTS WHERE SSN=VSSN; END;
16数据类型映射
Informix数据类型 BYTE CHAR DATE DATETIME YEAR TO FRACTION(F) DATETIME YEAR TO DAY DATETIME HOUR TO SECOND DECIMAL FLOAT INTERVAL YEAR(P) TO YEAR INTERVAL YEAR(P) TO MONTH INTERVAL MONTH(P) TO MONTH INTERVAL DAY(P) TO DAY INTERVAL DAY(P) TO HOUR INTERVAL DAY(P) TO MINUTE INTERVAL DAY(P) TO SECOND INTERVAL DAY(P) TO FRACTION(F) INTERVAL HOUR(P) TO HOUR INTERVAL HOUR(P) TO MINUTE INTERVAL HOUR(P) TO SECOND INTERVAL HOUR(P) TO FRACTION(F) INTERVAL MINUTE(P) TO MINUTE INTERVAL MINUTE(P) TO SECOND INTERVAL SECOND(P) TO SECOND ODBC SQL数据类型 SQL_LONGVARBINARY SQL_CHAR SQL_TIMESTAMP SQL_TYPE_TIMESTAMP SQL_TYPE_DATE SQL_TYPE_TIME SQL_DECIMAL SQL_DOUBLE SQL_INTERVAL_YEAR SQL_INTERVAL_YEAR_TO_MONTH SQL_INTERVAL_MONTH SQL_INTERVAL_DAY SQL_INTERVAL_DAY_TO_HOUR SQL_INTERVAL_DAY_TO_MINUTE SQL_INTERVAL_DAY_TO_SECOND SQL_INTERVAL_DAY_TO_SECOND SQL_INTERVAL_HOUR SQL_INTERVAL_HOUR_TO_MINUTE SQL_INTERVAL_HOUR_TO_SECOND SQL_INTERVAL_HOUR_TO_SECOND SQL_INTERVAL_MINUTE SQL_INTERVAL_MINUTE_TO_SECOND SQL_INTERVAL_SECOND INTERVAL MINUTE(P) TO FRACTION(F) SQL_INTERVAL_MINUTE_TO_SECOND INTERVAL SECOND(P) TO FRACTION(F) SQL_INTERVAL_SECOND INTERVAL FRACTION TO FRACTION(F) SQL_VARCHAR MONEY SERIAL SMALLFLOAT SMALLINT TEXT VARCHAR SQL_DECIMAL SQL_INTEGER SQL_REAL SQL_SMALLINT SQL_LONGVARCHAR SQL_VARCHAR
17外部联接
ODBC Extended SQL and SQL-92 SELECT STUDENT.SSN, FNAME, LNAME, CCODE, GRADE FROM {oj STUDENT LEFT OUTER JOIN Informix SELECT STUDENT.SSN, FNAME, LNAME, CCODE, GRADE Microsoft SQL Server SELECT STUDENT.SSN, FNAME, LNAME, CCODE, GRADE FROM STUDENT LEFT GRADE ON STUDENT.SSN = GRADE.SSN} FROM STUDENT, OUTER GRADE WHERE STUDENT.SSN = GRADE.SSN OUTER JOIN GRADE ON STUDENT
18日期、时间与时间戳数值
SQL SELECT SSN, FNAME, LNAME, BIRTH_DATE FROM STUDENT WHERE BIRTH_DATE < {D '1970-07-04'} Informix SELECT BIRTH_DATE FROM STUDENT WHERE BIRTH_DATE < '1970-07-04' Microsoft SQL Server SELECT SSN, FNAME, BIRTH_DATE FROM STUDENT WHERE BIRTH_DATE < '1970 SSN, FNAME, LNAME, LNAME,
19调用存储过程
Generic ODBC Extended SQL {?=} call procedure_name[(parameter(s))]} = call owner.procedure(?)}\SQL_NTS); Informix SQLExecDirect(hstmt1, (SQLCHAR*)\? = call SHOW_RELUCTANT _STUDENTS(?)}\, SQL_NTS); Microsoft SQL Server SQLExecDirect(hstmt1, (SQLCHAR*)\ STUDENT_ADMIN. SHOW_RELUCTANT _STUDENTS}\, SQL_NTS); SQLExecDirect(hstmt1,(SQLCHAR *)\STUDENT_ADMIN.P1.
数据库维护
1数据库查询用户的建立
银行Informix_on_line数据库由于存储了储户的大量重要信息,为了数据库的安全性必需要对数据的操作 有严格的规定,如进入on_line数据库要履行严格的手续,这在某些时候又给查找问题带来不便,因此有必要专门建立一个动态查询用户,该用户仅有对数据库的可读权限。
具体做法是:
1.建立查询用户,该查询用户应具有数据库使用的环境
2.将查询用户与数据库作连接(work用户为例)
ln-s/homel/work/homel/read(将查询用户read与数据库用户作连接);
3.由work用户使用数据库,将connect权限赋予read用户 grant connect to read;
4.对数据库中每一张表放select权给read用户
grant select on abc to read.(将select权限赋给read用户)
这样,以read用户注册,对数据库拥有了可读操作,给查找问题等带来方便。
2数据库一致性检查
a.以informix登录
b.将数据库状态置为off_line onmode-ky
用onstat-检查数据库状态为off_line c.将数据库状态置为单用户模式 onmode -s
用onstat-检查数据库状态为quiesent d.检查数据库保留页状态
oncheck-cr 1>/tmp/oncheck.cr 2>&1 e.检查数据库目录页一致性
oncheck-cc 1 >/tmp/oncheck.cc 2>&1 f.检查数据库数据的一致性
oncheck-cD workdb 1>/tmp/oncheck.cd 2>&1 g.检查数据库索引的一致性
oncheck-cI workdb 1>/tmp/oncheck.ci 2>&1
h.检查/tmp下oncheck.cr,oncheck.cc,oncheck.cd,oncheck.ci文件,查看有无错误信息,如没有,则数据库状态正常,反之亦然。 i.将数据库状态置为online
onmode-m
用onstat-检查数据库状态为online
3数据库的备份与恢复
1.dbexport备份与dbexport恢复
dbexport备份是一文体文件备份,该备份将数据库中信息以文本文件方式保存,要注意的是,在备份时必须保证没有对数据库有访问者,否则做dbexport不会成功,dbexport备份的一般格式为(以数据库workdb为例) dbexport workdb-d -s workdbs /path
2.dbimport恢复是将用dbexport备份的文件恢复到数据库中
a.停止一切数据库操作→删除数据库; b.$dbimport workdb-d workdbs -i/path;
c.用工具onmonitor将参数TAPEDEV改为/dev/null; d.ontap -s -u workdb.
e.检查workdb是否改为U状态. f.将TAPEDEV值改回原先的值.
需要指出的是在dbimport恢复过程中,有大量的信息要写在逻辑日志文件中,采用上述方式,可避免写逻辑日志文件,加快dbimport的速度。
3.数据库的零级备份
数据库零级备份是重要的备份手段,日常一般用磁带备份,经常用于做重大操作之前的备份,数据往往需要恢复,而磁带上的零级备份数据由于数据量大,恢复起来花费时间较长,因此,可采用在硬盘上做零级备份的办法。
a.在硬盘上划一个足够大的空间,用于备份文件的存放。
b.用onmonitor将参数TAPEDEV改定指向零级备份文件。
如把/cs2000在作为零级备份文件oback的存放空间,可将参数改为TAPEDEV=/cs2000/oback,这样可做硬盘零级备份,备份恢复时间只是磁带机的1/6。在恢复过程中应该用tail -f online.log监控。恢复过程,一直到数据库状态变为online..
c.将参数TAPEDEV=/cs2000/oback改为TAREDEV=/dev/rmt/0m;
4数据库常见故障处理
1.检查:用onstat_-1检查逻辑日志的使用情况,是否中止进程,根据finder col.数据库故障的一般检查,首先要检查数据库状态,经常用onstat_de查找可能出现的错误,同时检查online.log是否报错。
2.数据库表的跟踪:遇到在对数据库表作大规模操作时,有时我们不知道对该表的操作是否得以在继续进行,因为isql进入,操作该表,数据库报“该表已被锁”信息,这时可用查询语句:
首先:set retrieved to drity read
然后:select count(*)from abc,
通过不断对abc表进入统计,如统计数在不断增加,则对该表的操作仍在进行,否则,以停止了对该表的操作。还有,当批量执行SQL命令,如update,……insert等时如不能成功执行,可采用增加判断条件,缩小范围的方法去执行,往往可以获得成功,遇有些语句涉及的记录在处理过程中被锁定,直到处理过程结束可能超过系统关于同时锁定界限,遇这种错误,可以在开始处理时锁定该表。
3.故障排除举例:
故障现象:在银行批量结息向结息数据表插入记录时出现informix sqlcode错误号为-239。
故障检查:经查,从现象看,似乎有重复记录插入表中,但经核查数据,可以肯定数据绝无重复记录,考虑到表文件长期使用,表文件的相关信息受到某种破坏,为此,做以下操作:
a.unload to “/tmp/abc.txt”select*from abc.卸出abc中全部数据;
b.drop table abc.(删除表文件abc); c.create tabk abc (abc_swo mteger; abc_ano smallint) …
);建立数据库表文件abc.
d.load form“tmp/abc.txt”insert into abc.
(将原数据装入表文件abc中)。
e.重新执行结息操作,新产生的结息数据顺利装入表文件abc中,故障得以排除。