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;

  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;

时间: 2024-09-28 10:52:25

Informix和Oracle存储过程的异同的相关文章

《Oracle数据库管理与维护实战》——1.2 Oracle各版本异同

1.2 Oracle各版本异同 Oracle数据库管理与维护实战 Oracle数据库版本众多,为帮助了解这些版本之间的区别,这里专门作一个介绍.我们先介绍Oracle最近几个系列间的异同,然后介绍Oracle最新系列Oracle 12c,最后介绍同一系列各个版本间的异同. 1.2.1 Oracle 8i和Oracle 9i Oracle 8i和Oracle 9i的"i"代表"Internet",Oracle从8i开始提出了Internet计算的概念,表明Oracle

用PHP执行Oracle存储过程示例

oracle|存储过程|示例|执行 <?//在oracle中执行存储过程示例//供大家参考$gConn=ocilogon("test","test"); /* OCIDefineByPos example thies@digicol.de (980219) *///discrate与nEcode是out parameter,其余均是 in parameter.//存储过程get_discrate存放于package ebiz_pg中.$stmt = OCIPa

用PHP调用Oracle存储过程

oracle|存储过程 从开始学习PHP就来喜悦国际村,好几个月了,学到不少东西,自己写了个例子希望有点用处. PHP程序访问数据库,完全可以使用存储过程,有人认为使用存储过程便于维护不过仁者见仁,智者见智,在这个问题上,偶认为使用存储过程意味着必须要DBA和开发人员更紧密配合如果其中一方更变,则显然难以维护.但是使用存储过程至少有两个最明显的优点:速度和效率.使用存储过程的速度显然更快.在效率上,如果应用一次需要做一系列SQL操作,则需要往返于PHP与ORACLE,不如把该应用直接放到数据库方

使用OLE DB和ADO调用返回记录集的Oracle存储过程

摘要 OLE DB是建立在ODBC成功基础上的一种开放规范,它为访问和操纵不同类型数据提供开放的标准.ADO是OLD DB的一个消费者,它提供了对OLE DB数据源应用级的访问功能.在应用程序中使用OLE DB和ADO,可以高效地调用返回记录集的Oracle存储过程. 关键字 OLE DB ADO 存储过程 记录集 1 前言 在基于Oracle数据库的ADO应用程序的开发过程中,为了提高执行速度和降低网络流量,往往要在应用程序中调用Oracle数据库服务器端的存储过程.有的存储过程需要返回多行的

jsp中调用Bean,然后在Bean中调用oracle存储过程

新手在写程序时,一定要胆大心细,而且要有耐心,不妥协,不懂就翻书,网上查资料,问朋友,坚决进行到底. 最近一直凭着ASP的知识在摸索中前进,一跑坎坷,自不用说了.言归正传. 建立一个登录系统,要求达到以下目的. 1.用户通过Bean来认证以及得到得到用户信息. 2.记录用户登录信息,如用户登录次数,最后登录时间. 3.记录操作日志. 未解决及疑惑的问题: 1.用户登录后的Session是否可以通过Bean来判断. 2.通过Bean调用ORACLE存储过程,返回select后的记录集. 操作步骤:

大家一起分享C#调用oracle存储过程

oracle|存储过程 大家一起分享C#调用oracle存储过程 执行结果 ?????? ? ?????? ? ????? ? Oracle方面 1.创建Oracle过程存储 create or replace procedure proce_test(paramin in varchar2,paramout out varchar2,paraminout in out varchar2)as? varparam varchar2(28);begin? varparam:=paramin;? p

利用游标返回结果集的的例子(Oracle 存储过程)

oracle|存储过程|游标 在sqlplus中建立如下的内容:1.程序包 SQL> create or replace package types  2  as  3      type cursorType is ref cursor;  4  end;  5  / 程序包已创建. 2.函数SQL> create or replace function sp_ListEmp return types.cursortype  2  as  3      l_cursor    types.c

oracle 存储过程的基本语法

oracle|存储过程|语法 oracle 存储过程的基本语法 1.基本结构 CREATE OR REPLACE PROCEDURE 存储过程名字(    参数1 IN NUMBER,    参数2 IN NUMBER) IS变量1 INTEGER :=0;变量2 DATE;BEGIN END 存储过程名字 2.SELECT INTO STATEMENT  将select查询的结果存入到变量中,可以同时将多个列存储多个变量中,必须有一条  记录,否则抛出异常(如果没有记录抛出NO_DATA_FO

Jsp中调用Oracle存储过程的小例子

js|oracle|存储过程 以下的例子转自csdn论坛: *执行一条insert语句并传参数*/create or replace procedure p_test2(i in number) asbegininsert into t values (i,'x'||to_char(i));commit;end;/ <%@ page language="java" contentType="text/html;charset=gb2312"%><%