一、概述:

ORACLE的DML语句中可以指定RETURNING语句。使用起来也很简单,和SELECT INTO语句没有多大区别。RETURNING语句的使用在很多情况下可以简化PL/SQL编程。

  • INSERT操作: 返回INSERT之后的结果;
  • UPDATE操作: 返回UPDATE操作之后的结果。
  • DELETE操作: 返回DELETE之前的结果;

INSERT INTO SELECT和MERGE语句不支持RETURNING语句。RETURNING和return通用。

二、当插入使用序列生成主键值的数据时,能返回此主键值。

DECLARE
l_id t1.id%TYPE;
BEGIN
INSERT INTO t1 VALUES (t1_seq.nextval, 'FOUR')
RETURNING id INTO l_id;
COMMIT; DBMS_OUTPUT.put_line('ID=' || l_id);
END;

三、更新和删除语句。

DECLARE
l_id t1.id%TYPE;
BEGIN
UPDATE t1 SET description = description WHERE description = 'FOUR'
RETURNING id INTO l_id; DBMS_OUTPUT.put_line('UPDATE ID=' || l_id); DELETE FROM t1 WHERE description = 'FOUR'
RETURNING id INTO l_id; DBMS_OUTPUT.put_line('DELETE ID=' || l_id); COMMIT;

四、当DML影响多行时,使用returing into,借助bulk collection语句将值返回到一个集合中。

DECLARE
TYPE t_tab IS TABLE OF t1.id%TYPE;
l_tab t_tab;
BEGIN
UPDATE t1 SET description = description
RETURNING id BULK COLLECT INTO l_tab; FOR i IN l_tab.first .. l_tab.last LOOP
DBMS_OUTPUT.put_line('UPDATE ID=' || l_tab(i));
END LOOP; COMMIT;
END;

五、在For All语句中使用returing into。

DECLARE
TYPE t_desc_tab IS TABLE OF t1.description%TYPE;
TYPE t_tab IS TABLE OF t1%ROWTYPE;
l_desc_tab t_desc_tab := t_desc_tab('FIVE', 'SIX', 'SEVEN');
l_tab t_tab;
BEGIN
FORALL i IN l_desc_tab.first .. l_desc_tab.last
INSERT INTO t1 VALUES (t1_seq.nextval, l_desc_tab(i))
RETURNING id, description BULK COLLECT INTO l_tab; FOR i IN l_tab.first .. l_tab.last LOOP
DBMS_OUTPUT.put_line('INSERT ID=' || l_tab(i).id || ' DESC=' || l_tab(i).description);
END LOOP; COMMIT;
END;

六、在动态sql中使用。

DECLARE
TYPE t_tab IS TABLE OF t1.id%TYPE;
l_tab t_tab;
BEGIN
EXECUTE IMMEDIATE 'UPDATE t1 SET description = description RETURNING id INTO :l_tab'
  using 7369
RETURNING BULK COLLECT INTO l_tab; FOR i IN l_tab.first .. l_tab.last LOOP
DBMS_OUTPUT.put_line('UPDATE ID=' || l_tab(i));
END LOOP; COMMIT;
END;

注意:

  1. returning into在动态sql内部和外面都要写,且外面的returning后面不加字段直接into。

  2. using在returning前面

  3. 动态sql内部into后面变量名不固定,注意冒号(:),可以是命名规则下的任意字符。

  4. returning bulk collect into要写在外面,且后面不能是record。

七、在C# 中使用returing into子句。

using (OracleCommand cmd = Globals.Db.Connection.CreateCommand())
{
cmd.CommandText = "INSERT INTO table (Col1, Col2) VALUES (:ParamCol1, :ParamCol2) RETURNING ROWIDTOCHAR(ROWID) INTO :OutputROWID";
cmd.Parameters.Add(paramCol1, data["Col1"]);
cmd.Parameters.Add(paramCol2, data["Col2"]);
OracleParameter outputRowId = new OracleParameter(":OutputROWID", OracleDbType.Varchar2, 30)
{
Direction = ParameterDirection.ReturnValue
};//一定要有Size参数。
cmd.Parameters.Add(outputRowId);
cmd.BindByName = true; cmd.ExecuteNonQuery();
string rtnValue = outputRowId.Value.ToString();
}

DML子句returing into用法举例的更多相关文章

  1. c++ stl容器set成员函数介绍及set集合插入,遍历等用法举例

    c++ stl集合set介绍 c++ stl集合(Set)是一种包含已排序对象的关联容器.set/multiset会根据待定的排序准则,自动将元素排序.两者不同在于前者不允许元素重复,而后者允许. 1 ...

  2. 【转】awk 里的substr函数用法举例

    awk 里的substr函数用法举例: 要截取的内容:2007-08-04 04:45:03.084 - SuccessfulTradeResult(status: 1, currencyPair: ...

  3. 12. nc/netcat 用法举例

    nc命令用法举例 什么是nc nc是netcat的简写,有着网络界的瑞士军刀美誉.因为它短小精悍.功能实用,被设计为一个简单.可靠的网络工具 nc的作用 (1)实现任意TCP/UDP端口的侦听,nc可 ...

  4. 线程框架Executor的用法举例

    java5线程框架Executor的用法举例 Executor 是 java5 下的一个多任务并发执行框架(Doug Lea),可以建立一个类似数据库连接池的线程池来执行任务.这个框架主要由三个接口和 ...

  5. java8中的localdate和localtime用法举例

    java8中的localdate和localtime用法举例如下:这两个方法使我们可以方便的实现将旧的日期类转换为新的日期类,具体思路都是通过Instant当中介,然后通过Instant来创建Loca ...

  6. sql的游标用法举例(Cursor)

    sql的游标用法举例 ), ) Declare authors_cursor Cursor For Select Name,TrueName From Account Open authors_cur ...

  7. mysql操作查询结果case when then else end用法举例

    Case具有两种格式.简单Case函数和Case搜索函数. --简单Case函数 CASE sex          WHEN '1' THEN '男'          WHEN '2' THEN ...

  8. python yield用法举例说明

    1  yield基本用法 典型的例子: 斐波那契(Fibonacci)數列是一个非常简单的递归数列,除第一个和第二个数外,任意一个数都可由前两个数相加得到.1 2 3 5 8…… def fab(ma ...

  9. django models 中choices之用法举例

    CHOICES常用做单选属性,下面举例在django models中人物性别的用法: 我们先定义一个模型,名字为Students ,这个Students 包含了名字和性别两个字段,代码如下: from ...

随机推荐

  1. PDO 查询mysql返回字段int变为String型解决方法

    PDO 查询mysql返回字段int变为String型解决方法使用PDO查询mysql数据库时,执行prepare,execute后,返回的字段数据全都变为字符型. 例如id在数据库中是Int的,查询 ...

  2. LeetCode 100. 相同的树(Same Tree) 2

    100. 相同的树 100. Same Tree 题目描述 给定两个二叉树,编写一个函数来检验它们是否相同. 如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的. 每日一算法2019/5 ...

  3. DateTimeFormatter 的操作与使用 -- 通俗易懂

    在上一章我们讲解了LocalDate.LocalTime.LocalDateTime.Instant的操作与使用,下面讲解它们之间是如何进行格式化 DateTimeFormatter这个类它只提供了时 ...

  4. SpringBoot之分页插件PageHelper的使用

    在springboot中使用PageHelper插件有两种较为相似的方式,接下来我就将这两种方式进行总结. 方式一:使用原生的PageHelper 1.在pom.xml中引入依赖 <depend ...

  5. JDK1.8 的 HashMap 源码之文件注释

    文章目录 null 插入,key的位置变化 迭代操作时间 性能因素 负载因子 Comparable 加锁 迭代器修改 null 插入,key的位置变化,迭代操作时间,性能因素,负载因子,Compara ...

  6. pip install 遇到的问题

    执行pip命令时遇到 Fatal error in launcher: Unable to create process using '"'   电脑同时安装了python-2.7.13跟p ...

  7. python 之 前端开发(CSS三大特性、字体属性、文本属性、背景属性)

    11.38 css三大特性 11.381 继承性 1.定义:给某一个元素设置一些属性,该元素的后代也可以使用,这个我们就称之为继承性​2.注意:    1.只有以color.font-.text-.l ...

  8. 1010 Radix:猥琐的测试数据

    谨以此题纪念边界测试数据浪费了我多少时间:https://pintia.cn/problem-sets/994805342720868352/problems/994805507225665536 # ...

  9. Ubuntu中更改默认的root用户密码,以及怎样修改用户密码

    新安装的Ubuntu系统中默认的root用户密码是多少?该怎么修改? 如题,相信许多刚接触Ubuntu系统的新手大多会遇到这个问题,那么我们该如何解决这个问题呢?Ubuntu在安装过程中并没有让我们设 ...

  10. 如何自定义xml文件

    在定义文件之前,首先要弄清楚什么是xml文件和dtd文件. 一:什么是xml文件? xml是一种可扩展标记性语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有构造性的标记语言. 二:什么事d ...