当前位置:  数据库>oracle

Oracle Returning 语句用法总结

    来源: 互联网  发布时间:2017-06-24

    本文导语: 场景 在存储过程、PL/SQL块里需要返回INSERT、DELETE、UPDATE、MERGE等DML语句执行后的信息时使用,合理使用returning能够简化程序逻辑、提高程序性能。 概述 创建测试表 create table hh_emp_test as select * from scott.emp; 使用returning语句 declare v...

场景

在存储过程、PL/SQL块里需要返回INSERT、DELETE、UPDATE、MERGE等DML语句执行后的信息时使用,合理使用returning能够简化程序逻辑、提高程序性能。

概述 创建测试表

create table hh_emp_test as select * from scott.emp;

使用returning语句

declare

v_empno hh_emp_test.empno%type;

v_ename hh_emp_test.ename%type;

begin

update hh_emp_test set ename='test' where empno=7369 returning empno,ename into v_empno,v_ename;

rollback;

dbms_output.put_line(v_empno||'-'||v_ename);

end;

输出

7369-test

场景分类 dml修改单行数据

使用方法见概述,此部分较简单,略。

dml修改多行数据 使用TABLE类型

举例:

declare

type v_tp_tab_empno is table of hh_emp_test.empno%type index by pls_integer;

v_tab_empno v_tp_tab_empno;

type v_tp_tab_ename is table of hh_emp_test.ename%type index by pls_integer;

v_tab_ename v_tp_tab_ename;

begin

update hh_emp_test set ename='test' where deptno=10 returning empno,ename bulk collect into v_tab_empno,v_tab_ename;

rollback;

for i in 1..v_tab_empno.count loop

dbms_output.put_line(v_tab_empno(i)||'-'||v_tab_ename(i));

end loop;

end;

输出:

7782-test

7839-test

7934-test

注意:

  • 多行returning须用bulk collect into
  • 使用RECORD类型

    示例:

    declare

    type v_tp_rec is record(empno number,ename varchar2(50));

    type v_tp_tab is table of v_tp_rec index by pls_integer;

    v_tab v_tp_tab;

    begin

    update hh_emp_test set ename='test' where deptno=10 returning empno,ename bulk collect into v_tab;

    rollback;

    for i in 1..v_tab.count loop

    dbms_output.put_line(v_tab(i).empno||'-'||v_tab(i).ename);

    end loop;

    end;

    输出:

    7782-test

    7839-test

    7934-test

    Dml修改单行+动态sql

    示例:

    declare

    v_empno hh_emp_test.empno%type;

    v_ename hh_emp_test.ename%type;

    begin

    execute immediate 'update hh_emp_test set ename=''test'' where empno=:empno returning empno,ename into :v_empno,:v_ename'

    using 7369

    returning into v_empno, v_ename;

    rollback;

    dbms_output.put_line(v_empno || '-' || v_ename);

    end;

    输出:

    7369-test

    注意:

  • returning into在动态sql内部和外面都要写,且外面的returning后面不加字段直接into。
  • using在returning前面
  • into后面变量名不固定,注意冒号(:),可以是命名规则下的任意字符。
  • dml修改多行+动态sql 使用TABLE类型

    示例:

    declare

    type v_tp_tab_empno is table of hh_emp_test.empno%type index by pls_integer;

    v_tab_empno v_tp_tab_empno;

    type v_tp_tab_ename is table of hh_emp_test.ename%type index by pls_integer;

    v_tab_ename v_tp_tab_ename;

    begin

    execute immediate 'update hh_emp_test set ename=''test'' where deptno=:deptno returning empno,ename into :v_tab_empno,:v_tab_ename'

    using 10

    returning bulk collect

    into v_tab_empno, v_tab_ename;

    rollback;

    for i in 1 .. v_tab_empno.count loop

    dbms_output.put_line(v_tab_empno(i) || '-' || v_tab_ename(i));

    end loop;

    end;

    输出:

    7782-test

    7839-test

    7934-test

    注意:

  • 动态sql内部仍然是returning into而不是returning bulk collect into
  • returning bulk collect into要写在外面,且后面同样不能是record
  • 使用RECORD类型

    示例:

    declare

    type v_tp_rec is record(

    empno number,

    ename varchar2(50));

    type v_tp_tab is table of v_tp_rec index by pls_integer;

    v_tab v_tp_tab;

    begin

    execute immediate 'update hh_emp_test set ename=''test'' where deptno=10 returning empno,ename :v_tab'

    returning bulk collect

    into v_tab;

    rollback;

    for i in 1 .. v_tab.count loop

    dbms_output.put_line(v_tab(i).empno || '-' || v_tab(i).ename);

    end loop;

    end;

    执行报错:

    ORA-06550: 第 9 行, 第 5 列:

    PLS-00429: RETURNING 子句不支持的功能

    ORA-06550: 第 8 行, 第 3 列:

    PL/SQL: Statement ignored

    可见动态sql执行时,多行returning的多个字段须定义多个table类型的变量,目前为止(包括12c)不支持reurning record类型的语法。

    forall中的returning 使用RECORD类型

    示例:

    declare

    type v_tp_rec is record(

    empno number,

    ename varchar2(50));

    type v_tp_tab is table of v_tp_rec index by pls_integer;

    v_tab v_tp_tab;

    type t_tp_rec_source is table of hh_emp_test%rowtype index by pls_integer;

    t_tab_source t_tp_rec_source;

    cursor v_cur is

    select * from hh_emp_test;

    begin

    open v_cur;

    fetch v_cur bulk collect

    into t_tab_source limit 3;

    while t_tab_source.count > 0 loop

    forall i in 1 .. t_tab_source.count

    update hh_emp_test

    set ename = 'test'

    where empno = t_tab_source(i).empno

    returning empno, ename bulk collect into v_tab;

    rollback;

    for i in 1 .. v_tab.count loop

    dbms_output.put_line(v_tab(i).empno || '-' || v_tab(i).ename);

    end loop;

    fetch v_cur bulk collect

    into t_tab_source limit 3;

    end loop;

    close v_cur;

    end;

    输出:

    7369-test

    7499-test

    7521-test

    7566-test

    7654-test

    7698-test

    7782-test

    7839-test

    7844-test

    7900-test

    7902-test

    7934-test

    使用TABLE类型

    示例:

    declare

    type v_tp_tab_empno is table of hh_emp_test.empno%type index by pls_integer;

    v_tab_empno v_tp_tab_empno;

    type v_tp_tab_ename is table of hh_emp_test.ename%type index by pls_integer;

    v_tab_ename v_tp_tab_ename;

    type t_tp_rec_source is table of hh_emp_test%rowtype index by pls_integer;

    t_tab_source t_tp_rec_source;

    cursor v_cur is

    select * from hh_emp_test;

    begin

    open v_cur;

    fetch v_cur bulk collect

    into t_tab_source limit 3;

    while t_tab_source.count > 0 loop

    forall i in 1 .. t_tab_source.count

    update hh_emp_test

    set ename = 'test'

    where empno = t_tab_source(i).empno

    returning empno, ename bulk collect into v_tab_empno,v_tab_ename;

    rollback;

    for i in 1 .. v_tab_empno.count loop

    dbms_output.put_line(v_tab_empno(i) || '-' || v_tab_ename(i));

    end loop;

    fetch v_cur bulk collect

    into t_tab_source limit 3;

    end loop;

    close v_cur;

    end;

    输出:

    7369-test

    7499-test

    7521-test

    7566-test

    7654-test

    7698-test

    7782-test

    7839-test

    7844-test

    7900-test

    7902-test

    7934-test

    小结:

    Forall的使用和静态sql dml修改多行的方法类似。

    总结

    Oracle Returning语句随场景不同,语法有变化,要注意动态sql returning多行的情况不能使用record只能使用table类型。


        
     
     

    您可能感兴趣的文章:

  • oracle中lpad函数的用法详解
  • Oracle中decode函数的用法
  • Oracle 系统变量函数用法指南
  • oracle while的用法示例分享
  • c#中oracle to_date函数用法举例
  • oracle 下WITH CHECK OPTION用法
  • Oracle 函数用法之decode
  • Oracle sequence序列的用法
  • [Oracle] 常用工具集之SQL*Loader的用法
  • oracle case when 语句的用法详解
  • Oracle行级锁的特殊用法简析
  • Oracle merge into用法及例子
  • oracle comment命令用法示例分享
  • Oracle to_date()函数的用法介绍
  • oracle正则表达式regexp_like的用法详解
  • Oracle to_date() 用法细节
  • 深入探讨:oracle中row_number() over()分析函数用法
  • Oracle中start with...connect by prior子句用法
  • Oracle回滚段的概念,用法和规划及问题的解决
  • Oracle MERGE INTO的用法示例介绍
  • oracle导出sql语句的结果集和保存执行的sql语句(深入分析)
  • oracle用什么SQL语句判断表存不存在
  • 请问怎么用jsp语句删除oracle中的一条记录?
  • Oracle中SQL语句连接字符串的符号使用介绍
  • Oracle用什么语句查询字段?
  • 怎么在java中向一个sql语句传参数,就像oracle的proc一样啊?
  • 请问在 Linux 下如何用代码实现连接oracle数据库 并 执行 SQL 语句?
  • Oracle 9i轻松取得建表和索引的DDL语句
  • Oracle的SQL语句中如何处理‘&’符号
  • 关于Oracle中的sql语句的疑问,向大家请教。
  • Oracle Sql语句长度限制问题及解决
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Oracle 12c发布简单介绍及官方下载地址
  • 在linux下安装oracle,如何设置让oracle自动启动!也就是让oracle那个服务自动启动,不是手动的
  • oracle 11g最新版官方下载地址
  • 请问su oracle 和su - oracle有什么不同?
  • Oracle 数据库(oracle Database)Select 多表关联查询方式
  • 虚拟机装Oracle R12与Oracle10g
  • Oracle数据库(Oracle Database)体系结构及基本组成介绍
  • Oracle 数据库开发工具 Oracle SQL Developer
  • 如何设置让Oracle SQL Developer显示的时间包含时分秒
  • Oracle EBS R12 支持 Oracle Database 11g
  • Oracle 10g和Oracle 11g网格技术介绍
  • SCO unix下安装oracle,但没有光盘,请大家推荐一个oracle下载站点(unix版本的)。谢谢!!!!
  • oracle中如何把表中具有相同值列的多行数据合并成一行
  • 请问大家用oracle数据库, 用import oracle.*;下的东西么? 还是用标准库?
  • Oracle 数据库(oracle Database)性能调优技术详解
  • Linux /$ORACLE_HOME $ORACLE_HOME
  • ORACLE日期相关操作
  • Linux系统下Oracle的启动与Oracle监听的启动
  • ORACLE数据库常用字段数据类型介绍
  • 请问在solaris下安装ORACLE,用root用户和用oracle用户安装有什么区别么?
  • Oracle 12c的九大最新技术特性介绍
  • 网间Oracle的连接,远程连接Oracle服务器??


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3