经验分享:Informix和Oracle存储过程的异同(一)

日期: 2008-09-11 作者:小乔 来源:TechTarget中国 英文

在工作过程中涉及到过有时要进行INFORMIX和ORACLE之间的移植,有时应用需要既支持INFORMIX数据库又要支持ORACLE数据库,如果应用程序涉及到存储过程的话,就需要既熟悉INFORMIX存储过程的写法,又需要熟悉ORACLE存储过程的写法。


笔者将在工作中总结的一些经验写出来与大家共享。


建立存储过程的语法:


一、Informix


create procedure proc_name( [….in_parameter_list])


returning out_para_list / out_result_set;


二、Oracle


create [or replace] procedure procedue_name


[ (arg1 [ {in | out | in out }] type


(argn [ {in | out | in out }] type,)]


{is | as} –代替DECLARE关键字


[ 变量定义区]


begin


end procedure_name;


三、几个简单的例子


1、没有参数也没有返回值


1)Informix


create procedure pNoParam()


begin


on exception


rollback work;


return;


end exception


begin work;


delete from t1;


delete from t2;


commit work;


end;


end procedure;


2)Oracle


create or replace procedure pNoParam


as


begin


delete from t1;


delete from t2;


commit;


exception


when others then


begin


rollback;


end;


end pNoParam;


2、有输入输出


往t1表中插入一条记录,返回值表示插入是否成功。


1)Informix


create procedure pNormalParam(f1 integer, f2 varchar(10))


returning integer;


begin


on exception


rollback work;


return -1;


end exception


begin work;


insert into t1 values(f1, f2);


commit work;


return 0;


2)Oracle


create or replace procedure pNormalParam(f1 number,


f2 varchar2, v_Result out number)


as


begin


insert into t1 values(f1,f2);


commit;


v_Result = 0;


return;


exception


when others then


begin


rollback;


v_Result := -1;


end;


end pNormalParam;


需要注意的是,在oracle存储过程中,参数是不能加上size的,比如f1,在t1表中该字段是number(10,0),而这里只能写number,而不能写number(10,0)。


3、返回记录集


1)Informix


create procedure pReturnSet() returning integer, varchar(10);


define i integer;


define j varchar(10);


foreach


select f1, f2 into i, j from t1


return i, j with resume;


end foreach;


end procedure;


2)Oracle


create or replace package TestRefCursorPkg as type TestRefCursorTyp is ref cursor; procedure pReturnSet(RefCursor out TestRefCursorTyp); end TestRefCursorPkg;


create or replace package body TestRefCursorPkg as


procedure pReturnSet (RefCursor out TestRefCursorTyp)


as


localCursor TestRefCursorTyp;


begin


open localCursor for select f1, f2 from t1;


RefCursor := localCursor;


end pReturnSet;


end TestRefCursorPkg;


/


四、其他差异说明


1、错误捕捉


1)Informix


使用


on exception


end exception


2)Oracle


使用


exception


when others then


2、对游标的处理


1)Informix


create procedure pHasCursor()


define v_f1 integer;


begin


on exception


rollback work;


return;


end exception


begin work;


foreach curt1 with hold for


select f1 into v_f1 from t1 — 注意这里没有分号


if (v_f1 = 1) then


update t1 set f2 = ’one’ where current of curt1;


elif (v_f1 = 2) then


update t1 set f2 = ’two’ where current of curt1;


else


update t1 set f2 = ’others’ where current of curt1;


end if;


end foreach;


commit work;


end;


end procedure;


2)Oracle


create or replace procedure pHasCursor


as


v_f1 number(10,0);


cursor curt1 is


select f1 from t1 for update;


begin


open curt1;


loop


fetch curt1 into v_f1;


exit when curt1%notfound;


if (v_f1 = 1) then


update t1 set f2 = ’one’ where current of curt1;


elsif (v_f1 = 2) then


update t1 set f2 = ’two’ where current of curt1;


else


update t1 set f2 = ’others’ where current of curt1;


end if;


end loop;


commit;


return;


exception


when others then


begin


rollback;


end;


end pHasCursor;

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

相关推荐