一、概述:
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子句的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持编程网。