欢迎投稿

今日深度:

INFORMIX-4GL实用手册(四)(1)

INFORMIX-4GL实用手册(四)(1)


Informix-SPL(过程)语法详解
Informix数据库用户一般都熟悉的使用SQL语句进行简单的查询和统计,而在Informix-Online的数据库服务器中提供了用结构化查询语言SQL语句和流程控制存储语言SPL创建存储例程,以减少Informix的处理。存储例程是SQL语句和SPL的集合。它们存放在数据库中,SQL语句会被分析.优化,在例程的执行中,高速缓存中会有一执行规划,使后续操作的执行速度很快。而单独的SQL语句只有在执行时才会被优化,并且存储例程可以被不同的开发工具调用4GL、ESQL/C、POWERBUILDER.DELPHI),在SELECT语句中也调用过程。例程调试简单,不必重新编译应有软件包。在例程创建时Informix查询处理器会分析它,并产生一执行规划,永久存放于SPROCEDURES.SYSPROBODY.和SYSPROPLAN中,其后例程按此规划执行,由于大部分查询处理已经完成,存储例程可以在瞬间执行完毕。由于存储例程所具有的优越性,它已成为进行Informix数据库核心开发的有力工具,掌握它对Informix的开发人员有积极意义,现将我在实际工作中使用的语法和例子详解于下,疏漏和错误请来信指教。

1.创建和执行例程

①.创建例程语法:
CRAETEPROCEDURE[OWNER.]PROCEDURE_NAME(参数1参数类型=[DEFAULT],参数2参数类型=[DEFAULT],参数n参数类型=[DEFAULT])
RETURNING值1类型,值2类型,值n类型;
<......>语句体;ENDRPOCEDURE
例程大小不可超过64K,这包括所有的SQL.SPL.空格.跳格符,例程名最多18个字符,并在数据库中唯一存在,语句间用";"分隔,例程只能在当前数据库中创建,例程创建后是一标准
执行模板块,可在不同的应有中对其调用,这对开发不同版本的应用将更为便利。例:
createprocedure"test".upwage()
definerev_rev_item_codevarchar(2,0);
definerev_p_rev_datedate;
defineacc_rec_prem_nodecimal(8,2);definerev_p_rev_amtdecimal(10,2);definerev_I_info_branchvarchar(6,0);definerev_I_info_appl_nodecimal(8,0);definerev_I_info_datedate;definerev_o_rev_datedate;
definerev_o_rev_amtdecimal(10,2);
defineacc_ac_rev_amntdecimal(10,2);
defineacc_rec_prem_datedate;
beginwork;
foreachcur_revforselectI_info_appl_branch,I_info_appl_no,I_info_date,
o_rev_date,o_rev_amtintorev_I_info_branch,
rev_I_info_appl_no,rev_I_info_date,rev_o_rev_date,rev_o_rev_amtfromrev_rec_tblwhere
(rev_item_code="PS")andp_rev_dateisnulland
p_rev_amt=0and(I_info_appl_noisnotnullor
I_info_dateisnotnull);
selectmax(rec_prem_acc_no)intoacc_rec_prem_nofromrec_prem_accwhereI_info_appl_branch=rev_I_info_branch
andI_info_appl_no=rev_I_info_appl_no
andI_info_date=rev_I_info_date
ando_rev_date=rev_o_rev_date
andrev_item_code="PS"and
ac_rev_amnt=rev_o_rev_amt;
selectdate(rec_prem_date)intoacc_rec_prem_date
fromrec_prem_accwhereI_info_appl_branch=rev_I_info_branch
andI_info_appl_no=rev_I_info_appl_no
andI_info_date=rev_I_info_date
ando_rev_date=rev_o_rev_date
andrev_item_code="PS"and
ac_rev_amnt=rev_o_rev_amtand
rec_prem_acc_no=acc_rec_prem_no;
selectac_rev_amntintoacc_ac_rev_amnt
fromrec_prem_acc
whereI_info_appl_branch=rev_I_info_branch
andI_info_appl_no=rev_I_info_appl_no
andI_info_date=rev_I_info_date
ando_rev_date=rev_o_rev_date
andrev_item_code="PS"
andrec_prem_acc_no=acc_rec_prem_no
andac_rev_amnt=rev_o_rev_amt;
ifacc_ac_rev_amntisnulloracc_rec_prem_dateisnullthen
continueforeach;
endif;
updaterev_rec_tbl
setp_rev_date=acc_rec_prem_date,
p_rev_amt=acc_ac_rev_amnt
whereI_info_appl_branch=rev_I_info_branch
andI_info_date=rev_I_info_date
andI_info_appl_no=rev_I_info_appl_no
ando_rev_date=rev_o_rev_date;
endforeach;
commitwork;
endprocedure;

②.执行例程语法:
A):在dbaccess中
EXECUTEPROCEDUREDBNAME@SERVER_NAME:例程名(参数1,参数2,.....)用这种方法可对例程进行调试。
B):在Informix-4GL中
PREPAREPREPSTATTEMENTFROM"EXECUTEPROCEDUREDBNAME@SERVER_NAME:例程名?,?,?,...)
DECLAREP_CURSSURSORFORPREPSTMT
OPENP_CURSUSING参数1,参数2,....
FETCHP_CURSINTO返回值1,返回值2,...
CLOSEP_CURS
当应用程序不支持EXECUTPROCEDURE语法,则需使用PREPARE命令,如INFORMIX-4GL中,而使用INFORMIX-NEWEAR则无此限制,需注意的是PREPARE语句中变量用?号代替,其个数要与例程的参数个数和类型一致,返回值也是一样。
C):在Informix-ESQL/C中
EXECSQLEXECUTEPROCEDURE例程名(参数1,参数2,...)INTO返回值1,返回值2,...)在EC5.0或更高版本可使用EXECUTEPROCEDURE语法,在ESQL/C中宿主变量用于想存储例程传递值,同时也接收返回值.
D):在POWERBUILDER中
DECLARE逻辑名PROCEDUREFOR例程名(:参数1,:参数2:...)INTO:返回值1,:返回值2,..USING事物名
EXEC例程名(:参数1,:参数2,.....)
PB要求为例程制定逻辑名,以后的SQL语句将以逻辑名为准指向后台数据库例程,当例程即便没有参数也必须有小扩号.


www.htsjk.Com true http://www.htsjk.com/shujukujc/19289.html NewsArticle INFORMIX-4GL实用手册(四)(1) Informix-SPL(过程)语法详解 Informix数据库用户一般都熟悉的使用SQL语句进行简单的查询和统计,而在Informix-Online的数据库服务器中提供了用结构化查询语言SQL语...
评论暂时关闭