经验分享:Informix和Oracle数据库存储过程的异同(2)_Oracle数据库_黑客防线网安服务器维护基地--Powered by WWW.RONGSEN.COM.CN

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

作者:黑客防线网安Oracle维护基地 来源:黑客防线网安Oracle维护基地 浏览次数:0

黑客防线网安网讯:   create or replace package TestRefCursorPkg as type TestRefCursorTyp is ref cursor; procedure pReturnSet(RefCursor out TestRefCursorTyp); end TestRefCursorPkg;create or repla...
   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;
    黑客防线网安服务器维护方案本篇连接:http://www.rongsen.com.cn/show-13288-1.html
网站维护教程更新时间:2012-03-23 00:53:18  【打印此页】  【关闭
我要申请本站N点 | 黑客防线官网 |  
专业服务器维护及网站维护手工安全搭建环境,网站安全加固服务。黑客防线网安服务器维护基地招商进行中!QQ:29769479

footer  footer  footer  footer