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;

自学 PHP、MySQL和Apache 自学 PHP、MySQL和Apache

本书将PHP开发与MySQL应用相结合,分别对PHP和MySQL做了深入浅出的分析,不仅介绍PHP和MySQL的一般概念,而且对PHP和MySQL的Web应用做了较全面的阐述,并包括几个经典且实用的例子。本书是第4版,经过了全面的更新、重写和扩展,包括PHP5.3最新改进的特性(例如,更好的错误和异常处理),MySQL的存储过程和存储引擎,Ajax技术与Web2.0以及Web应用需要注意的安全

自学 PHP、MySQL和Apache 400 查看详情 自学 PHP、MySQL和Apache

  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;

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/832006.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月27日 08:33:21
下一篇 2025年11月27日 08:40:03

相关推荐

  • Oracle DATE 类型存储时间戳及如何仅存储日期

    本文旨在解释 Oracle 数据库中 DATE 类型总是包含时间戳的原因,并提供在数据库中存储日期时去除时间部分的方法,重点介绍如何通过格式化函数控制日期显示,而非修改数据库结构。 在 Oracle 数据库中,DATE 类型的设计初衷就是同时存储日期和时间信息。即使你只关心日期部分,DATE 类型仍…

    2025年12月6日 java
    000
  • mysql中事务隔离级别有哪些

    读未提交允许读取未提交数据,易引发脏读、不可重复读和幻读;2. 读已提交确保读取已提交数据,避免脏读但存在不可重复读和幻读;3. 可重复读保证事务内多次读取一致,MySQL默认级别,通过MVCC和间隙锁减少幻读;4. 串行化强制事务串行执行,避免所有并发问题但性能最差。选择隔离级别需权衡一致性与性能…

    2025年12月6日 数据库
    000
  • 优化MySQL电话号码字段搜索:解决空格与格式多样性问题

    本文详细介绍了在mysql数据库中,如何高效地搜索包含空格或多种格式的电话号码字段。针对`like`查询无法识别空格字符的问题,核心解决方案是利用`replace`函数在查询时移除字段中的空格,从而实现准确匹配。教程还将探讨更全面的数据清洗策略和性能优化建议,以提升搜索效率和数据质量。 在数据库管理…

    2025年12月6日 后端开发
    000
  • OpenJPA 在 Oracle 中处理字符串长度限制的警告与解决方案

    本文深入探讨了 openjpa 在与 oracle 数据库交互时,针对字符串字段可能遇到的“值超过 4000 字节/字符”的警告信息。该警告源于 oracle `varchar2` 数据类型的默认 4000 字节限制。教程将详细介绍两种主要的解决方案:通过 `@column(length = n)`…

    2025年12月6日 java
    000
  • Java中MANIFEST.MF的作用 详解清单文件

    manifest.mf是java中jar文件的元数据配置文件,位于meta-inf目录下,用于定义版本、主类、依赖路径等关键信息。1. 它允许指定入口类,使jar可直接运行;2. 通过class-path管理依赖,减少类加载冲突;3. 可配置安全权限,如设置沙箱运行;4. 常见属性包括manifes…

    2025年12月5日 java
    000
  • Java中枚举类型怎么定义 掌握Java枚举的定义和常用方法

    java中定义枚举类型使用enum关键字,例如public enum weekday { monday, tuesday,…};枚举可包含字段和方法,如添加中文名称字段及获取方法;可在switch语句中使用,确保覆盖所有值;常用方法包括values()、valueof()、ordinal…

    2025年12月4日 java
    000
  • oracle/mysql拼接值遇到的坑及双竖线||和concat怎么使用

    %ign%ignore_a_1%re_a_1% mysql 拼接值遇到的坑 双竖线 || concat || “||” 在oracle中是拼接值,但在mysql中是“或”的意思。 where name like ‘%’ || ‘Tony’ || ‘%’ 所以推荐使用concat() concat()…

    数据库 2025年12月4日
    000
  • Linux实现自动挂载autofs的方法详解

    ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 目录 实现自动挂载-autofs autofs工具简单使用 autofs配置详细说明 自动挂载资源有两种格式 优化Linux系统性能 安装Tuned 选择调整配置文件 检查系统推荐的调整配置文件…

    2025年12月4日
    000
  • 简易项目搭建(用于一般杂七杂八的小功能点)

    在工作中,我们常常会遇到许多需要完成的小功能点。以我自己的工作情况为例,最常见的是两个方面:1、控制台项目;2、web界面(纯前端)。 首先让我们讨论控制台项目的工作内容。在没有使用PostMan之前,工作中大量使用接口调用。在项目准备阶段,首先需要对接口的使用进行描述。在主要使用WebServic…

    2025年12月4日
    000
  • 分页功能如何实现?LIMIT与页码计算

    分页功能通过offset和limit截取数据实现。1.分页核心是计算偏移量(offset=(页码-1)每页条数)和限制数量;2.使用sql的limit子句或数据库特定语法(如sql server的offset…fetch next)执行查询;3.前端传页码和每页大小,后端计算偏移量并执行…

    2025年12月3日 后端开发
    000
  • Java中DAO模式的作用 解析DAO模式封装数据访问的价值

    dao模式通过解耦业务逻辑与数据访问,解决了数据库切换困难、sql注入风险和代码重复问题。其核心价值在于将数据访问细节封装在接口和实现类中,使业务代码仅面向接口编程,从而降低维护成本。具体步骤包括:1.定义dao接口;2.创建具体实现类;3.使用工厂模式获取实例;4.在业务逻辑中调用dao方法。技术…

    2025年12月3日 java
    000
  • Swoole如何做数据加密?加密算法如何选择?

    Swoole中数据加密依赖PHP的OpenSSL扩展,通过选择AES、RSA等算法实现;在Server或Client的接收与发送过程中进行加解密操作,结合CBC、GCM等模式保障安全与性能;密钥应通过环境变量或配置文件管理,避免硬编码;为防止中间人攻击,应启用TLS/SSL加密通信,并在WebSoc…

    2025年12月3日
    100
  • Swoole如何实现多租户?租户隔离怎么操作?

    Swoole实现多租户的核心在于协程上下文隔离,通过Coroutine::getContext()绑定租户ID、数据库连接、缓存前缀等上下文信息,在请求入口识别租户并加载配置,确保数据、缓存、文件存储、数据库连接等资源按租户隔离,避免长驻内存导致的数据泄露,结合连接池重置、缓存键前缀、独立表或库等策…

    2025年12月3日
    000
  • 2023合同管理软件排名:前10名榜单

    合同管理软件依托信息技术,结合现代企业的先进管理思想,为企业构建起一个集决策、规划、控制及经营绩效评估于一体的全方位、系统化的管理平台。企业在开展经济活动时,通常以合同为纽带,合同管理的效果直接关系到经营的成败。作为企业管理的重要组成部分,合同管理对业务流程的规范化、数据的准确性以及信息传递的安全性…

    2025年12月3日 软件教程
    000
  • 如何在PHP中配置Oracle数据库连接池的详细教程?

    在php中配置oracle数据库连接池需依赖oracle工具和配置,而非php本身。1. 安装oracle instant client并配置环境变量,安装oci8扩展并在php.ini中启用;2. 在oracle端启用drcp连接池,使用dbms_connection_pool包启动并调整参数;3…

    2025年12月3日 后端开发
    000
  • 零基础学Java课程安排建议

    it行业目前非常热门,对于大学生而言,若想在大学期间学习java但又毫无基础,以下是一份适合的课程学习流程推荐: 1、 公共基础知识:初步了解计算机网络和数据结构的基础内容,掌握基本概念即可。 2、 Java基础课程大约需要三周时间完成,建议从视频教程开始学习。学完后可以在网上找一套系统的练习题进行…

    2025年12月3日 软件教程
    000
  • Windows2003系统下MySQL安装小结

    本文承接上文在windows2003系统中配置支持php的tomcat网站内容继续进行说明。 1、 支持列表中并未列出Windows 2003版本。 2、 我下载了社区版5.7.22,但在安装过程中提示“mysqld不是有效的Win32应用程序”,令人费解。 3、 随后选择降低版本,改用5.6.40…

    2025年12月3日 软件教程
    000
  • Oracle视图应用实战

    1、 在Oracle数据库中创建视图,并通过查询语句获取视图中的数据内容。 2、 对已存在的Oracle视图进行结构或定义修改,并执行重新编译以确保其有效性。 3、 %ignore_a_1%览当前数据库中存在的视图列表,并根据需要删除指定的视图对象。 4、 执行对Oracle视图的数据查询操作,同时…

    2025年12月3日 软件教程
    000
  • sql中如何实现递归查询 递归查询的经典案例演示

    sql递归查询通过cte实现层级数据查询,核心在于锚点成员与递归成员结合,常见错误包括无限循环、性能问题、数据类型不匹配等;优化方法有索引优化、限制递归深度、使用临时表等;不同数据库如postgresql、sql server、mysql支持递归cte,oracle则使用connect by语法。 …

    2025年12月3日 数据库
    000
  • SQL变量声明怎么写 变量声明的2种语法解析

    sql变量声明主要有两种方式:使用declare关键字和mysql的@符号。1. declare用于多数数据库,如sql server和oracle,需指定数据类型及可选初始值;2. mysql用set @variablename = value形式声明会话变量,无需预定义类型。常见数据类型包括数值…

    2025年12月3日 数据库
    000

发表回复

登录后才能评论
关注微信