ORACLE开发: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通用。

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

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;

注意:

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

  • using在returning前面

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

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

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


数据运维技术 » ORACLE开发:Oracle在DML语句中使用returing into子句