首页 数据库 mysql教程 Informix和Oracle存储过程的异同

Informix和Oracle存储过程的异同

Jun 07, 2016 pm 05:45 PM
date oracle procedure

建立存储过程的语法:

  一、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;

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1664
14
CakePHP 教程
1423
52
Laravel 教程
1317
25
PHP教程
1268
29
C# 教程
1244
24
oracle打不开怎么办 oracle打不开怎么办 Apr 11, 2025 pm 10:06 PM

Oracle 打不开的解决办法包括:1. 启动数据库服务;2. 启动监听器;3. 检查端口冲突;4. 正确设置环境变量;5. 确保防火墙或防病毒软件未阻止连接;6. 检查服务器是否已关闭;7. 使用 RMAN 恢复损坏的文件;8. 检查 TNS 服务名称是否正确;9. 检查网络连接;10. 重新安装 Oracle 软件。

oracle游标关闭怎么解决 oracle游标关闭怎么解决 Apr 11, 2025 pm 10:18 PM

解决 Oracle 游标关闭问题的方法包括:使用 CLOSE 语句显式关闭游标。在 FOR UPDATE 子句中声明游标,使其在作用域结束后自动关闭。在 USING 子句中声明游标,使其在关联的 PL/SQL 变量关闭时自动关闭。使用异常处理确保在任何异常情况下关闭游标。使用连接池自动关闭游标。禁用自动提交,延迟游标关闭。

oracle怎么循环创建游标 oracle怎么循环创建游标 Apr 12, 2025 am 06:18 AM

Oracle 中,FOR LOOP 循环可动态创建游标, 步骤为:1. 定义游标类型;2. 创建循环;3. 动态创建游标;4. 执行游标;5. 关闭游标。示例:可循环创建游标,显示前 10 名员工姓名和工资。

HDFS配置CentOS需要哪些步骤 HDFS配置CentOS需要哪些步骤 Apr 14, 2025 pm 06:42 PM

在CentOS系统上搭建Hadoop分布式文件系统(HDFS)需要多个步骤,本文提供一个简要的配置指南。一、前期准备安装JDK:在所有节点上安装JavaDevelopmentKit(JDK),版本需与Hadoop兼容。可从Oracle官网下载安装包。环境变量配置:编辑/etc/profile文件,设置Java和Hadoop的环境变量,使系统能够找到JDK和Hadoop的安装路径。二、安全配置:SSH免密登录生成SSH密钥:在每个节点上使用ssh-keygen命令

oracle日志写满怎么办 oracle日志写满怎么办 Apr 12, 2025 am 06:09 AM

Oracle 日志文件写满时,可采用以下解决方案:1)清理旧日志文件;2)增加日志文件大小;3)增加日志文件组;4)设置自动日志管理;5)重新初始化数据库。在实施任何解决方案前,建议备份数据库以防数据丢失。

甲骨文在商业世界中的作用 甲骨文在商业世界中的作用 Apr 23, 2025 am 12:01 AM

Oracle不仅是数据库公司,还是云计算和ERP系统的领导者。1.Oracle提供从数据库到云服务和ERP系统的全面解决方案。2.OracleCloud挑战AWS和Azure,提供IaaS、PaaS和SaaS服务。3.Oracle的ERP系统如E-BusinessSuite和FusionApplications帮助企业优化运营。

oracle数据库怎么停止 oracle数据库怎么停止 Apr 12, 2025 am 06:12 AM

要停止 Oracle 数据库,请执行以下步骤:1. 连接到数据库;2. 优雅关机数据库(shutdown immediate);3. 完全关机数据库(shutdown abort)。

centos上weblogic的数据库连接如何配置 centos上weblogic的数据库连接如何配置 Apr 14, 2025 pm 02:06 PM

在CentOS系统上配置WebLogic数据库连接,需要完成以下步骤:JDK安装与环境配置:确保服务器已安装与WebLogic版本兼容的JDK(例如,WebLogic14.1.1通常需要JDK8)。正确设置JAVA_HOME、CLASSPATH和PATH环境变量。WebLogic安装与解压:从Oracle官方网站下载适用于CentOS系统的WebLogic安装包,并将其解压到指定目录。WebLogic用户与目录创建:创建一个专用的WebLogic用户账户,并设置安全密码

See all articles