资源描述:
《如何编写informix存储过程》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、如何编写INFORMIX的存储过程(2000/4/4)一、定义及概述存贮过程是已命名的、预编译的、典型的SQL集。数据库存贮过程使程序员能够在数据库中定义所有应用程序都可以使用的过程化SQL语句。用存贮过程来完成数据库的修改使程序员能够增强数据库的安全性、完整性并提高性能。由于存贮过程提供了条件执行,因此也可以用来执行附加商务规则。存贮过程是SQL语句和SPL的集合。它们存放在数据库中,而SQL则被分析、优化,并产生一执行规划,永久地存放在当前库(非SYSMASTER库)的SYSPROCEDURES(过程名)、SYSPROCBODY(代码)、SYSPROCPLAN(编译
2、后的规划)系统表中。当存贮过程被执行时,直接从库中调用优化后的代码进行运行,因此大大提高了SQL的性能、效率,极大增强了SQL语句和批处理的性能。1、编辑存贮过程:可用通用的文本编辑器对存贮过程进行编辑,然后将文件放到主机上。注意,如果采用在DBACCESS中以批处理方式编译存贮过程,则存贮过程的源文件名的后缀必须以sql结尾,文件存放的目录必须在启动DBACCESS的目录下。2、创建(编译)存贮过程:产生一执行规划(编译后的代码),永久存放在数据库系统表中。存贮过程由SQL语句CREATEPROCEDURE“过程名”创建。当该语句被执行时(如在DBACCESS中按批处
3、理运行),包含在CREATEPROCEDURE和ENDPROCEDURE之间的所有代码首先进行语法检查,然后被解析、优化,以过程名为标识符,存放在数据库中,等待执行。可以用WITHLISTINGIN‘PATHNAME’关键字把编译的警告信息存放到指定的文件中。3、执行存贮过程:调用执行规划。用SQL语句EXECUTEPROCEDURE或SPL语句CALL/LET按存贮过程名进行调用,则库中编译好的执行规划将被调出直接运行,这样可得到较高的运行效率。可把存贮过程当作一个函数,直接在SELECT语句中调用,如:selectchar_ascii(‘a’)asvaluefrom
4、dw;SELECTcustomer_num,lname,get_orders(customer_num)n_ordersFROMcustomer;类似于表、视图、用户等,存贮过程也是一个数据库对象,其名称必须符合标识符命名规则(18字符长,以字符或_开始),也只能在当前数据库中创建,并赋予一定的权限。SYSPRC表的内容:prc_hashno24prc_chainno0prc_id1505prc_refcnt0prc_delete0prc_heapptr388571168prc_heapsz1prc_servernameoncq97dataprc_dbnamedev_d
5、ataprc_ownernamedevelopprc_namewd_proc1当修改wd_proc1,再次创建后,SYSPRC表中查不到此存贮过程的记录;当执行存贮过程后,SYSPRC表中又出现该记录;??二、存贮过程的总体结构存贮过程的输入、输出参数都必须显式给出;--******创建TS表INSERT触发器的存贮过程******/--功能:根据TS表中处理单位的信息,在CL表中向相关单位--生成一条或多条处理记录(每个单位一条记录,最多三个单位);--传入参数:dw,id,status,signDROPPROCEDUREti_ts_proc;CREATEPROCED
6、UREti_ts_proc(idchar(12),dwchar(9),statuschar(1),signchar(1))DEFINEdddate;DEFINEfirst_dwchar(3);DEFINEsecond_dwchar(3);DEFINEsql_err,isam_errINT;DEFINEerrorchar(80);--------出错处理----------------------ONEXCEPTIONSETsql_err,isam_err,errorTRACE'SQLerrno:'
7、
8、sql_err;TRACE'ISAMerrno:'
9、
10、isam_err
11、;TRACE'errormessage:'
12、
13、error;ENDEXCEPTIONSETDEBUGFILETO'/export/home/app180/debug_wd';TRACE'begintrace:'
14、
15、current;-------------------------------------LETdd=TODAY;TRACE'DD='
16、
17、dd;IFstatus>'2'orsign='1'THENRETURN;ENDIF;TRACE'lengthofdwis'
18、
19、length(dw);TRACE'Length(trim(dw))=