好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Oracle在DML语句中使用returing into子句

一、概述:

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

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

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

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

?

1

2

3

4

5

6

7

8

9

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 ;

三、更新和删除语句。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

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语句将值返回到一个集合中。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

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。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

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中使用。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

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 ;

注意:

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

using在returning前面

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

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

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

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

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();

}

到此这篇关于Oracle在DML语句中使用returing into子句的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://www.cnblogs.com/springsnow/p/9394794.html

查看更多关于Oracle在DML语句中使用returing into子句的详细内容...

  阅读:27次