您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

Informix和Oracle存储过程的异同

2024/4/23 10:22:09发布29次查看
建立存储过程的语法:
一、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;
3、在存储过程中调用另外一个存储过程
1)informix
call pnoparam();
call pnormalparam(1, ‘a’) returning v_result;
2)oracle
pnoparam;
pnormalparam(1, ‘a’, v_result);
4、日期操作
1)当前时间
① informix
define cur_dtime_var datetime year to second;
当前日期时间: let cur_dtime_var = current; -- datetime
② oracle
currtime date;
currtime := sysdate;
2)当前日期的增减
① informix
let tmp_date = today + 3 units day; -- 当前时间加三天
let tmp_datetime = current + 1 units second; -- 当前时间加1秒种
② oracle
tmp_date := sysdate + 3; -- 当前时间加三天
tmp_date := sysdate + 1/24/3600; --当前时间加1秒种
3)日期转换成字符串
① informix
let v_periodendtime = year(v_date)||extend(v_date,month to month)
||extend(v_date,day to day) ||extend(v_date,hour to hour)
||extend(v_date,minute to minute)|| extend(v_date,second to second);
② oracle
v_periodendtime := to_char(v_date, 'yyyymmddhh24miss');
 4)字符串转换成日期
假设字符串的形式是yyyymmddhhmiss形式的
① informix
-- 直接转换成日期
let v_begindate = substr(v_begintime,1,4)||'-'||substr(v_begintime,5,2)
||'-'||substr(v_begintime,7,2)||' '||substr(v_begintime,9,2)
||':'||substr(v_begintime,11,2)||':'||substr(v_begintime,13,2);
-- 这个月的第一天
let v_date = substr(v_begintime,1,4)||'-'
||substr(v_begintime,5,2)||'-1 00:00:00';
-- 这个星期的第一天
let v_date = substr(v_begintime,1,4)||'-'||substr(v_begintime,5,2)
||'-'||substr(v_begintime,7,2)||' 00:00:00';
let v_week = weekday(v_date);
let v_date = v_date - v_week units day;
② oracle
-- 直接转换成日期
v_begindate := to_date(v_begintime, 'yyyymmddhh24miss');
-- 这个月的第一天
v_begindate := trunc(to_date(v_begintime, 'yyyymmddhh24miss'), ‘mm’);
-- 这个星期的第一天
v_begindate := trunc(to_date(v_begintime, 'yyyymmddhh24miss'), ‘day’);
5)事务
在oracle中缺省情况下,一个事务的结束就是下一个事务的开始,所以对于一个事务来说,我们只要写commit;即可,不需要明确标出什么时候开始一个事务,而informix需要。
6)打印调试信息
7)informix
--设置跟踪模式
set debug file to trace_check; -- with append;
--说明“with append”表示以追加模式打开跟踪结果文件
trace '开始执行存储过程'
trace 'v_date='||v_date;
trace ‘存储过程执行完毕’
trace off;
执行完以后打开当前目录下的trace_check即可看到打印出来的信息。
8)oracle
dbms_output.put_line(‘开始执行存储过程’);
dbms_output.put_line('v_date='||v_date);
dbms_output.put_line(‘存储过程执行完毕’);
先设置一下缓冲区的大小
set serveroutput on size 100000; -- 如果不执行该语句,会看不到调试信息
执行完毕以后,打印出来的信息就会直接显示在界面上。
5、关于参数的说明
如果存储过程想返回一个参数,在informix中是通过返回值的形式实现的,而在oracle是通过输出参数或者输入输出参数实现的。
举例:
1)informix:
create procedure p1() returning integer;
return 0;
end procedure;
2)oracle:
create or replace procedure p1(x out number)
as
begin
x := 0;
end p1;
6、赋值
1)informix
let v_1 = 100;
2)oracle
v_1 := 100;
7、if语句
1)informix
if (v_1 =100) then
elif (v_1=200) then
else
end if;
2)oracle
if (v_1 =100) then
elsif (v_1=200) then
else
end if;
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product