1.The
RETURNING INTO clause allows us to return column values for rows
affected by DML statements. The following test table is used to
demonstrate this clause.
DROP TABLE t1;
DROP SEQUENCE t1_seq;
CREATE TABLE t1 (
ID NUMBER(10),
DESCRIPTION VARCHAR2(50),
CONSTRAINT t1_pk PRIMARY KEY (id));
CREATE SEQUENCE t1_seq;
INSERT INTO t1 VALUES (t1_seq.nextval, 'ONE');
INSERT INTO t1 VALUES (t1_seq.nextval, 'TWO');
INSERT INTO t1 VALUES (t1_seq.nextval, 'THREE');
COMMIT;
2.When we insert data using a sequence to generate our primary key value, we can return the primary key value as follows.
SET SERVEROUTPUT ON
DECLARE
v_id t1.id%TYPE;
BEGIN
INSERT INTO t1
VALUES (t1_seq.nextval, 'FOUR')
RETURNING id INTO v_id;
COMMIT;
DBMS_OUTPUT.put_line('ID=' || v_id);
END;
/
ID
=
4
3.The syntax is also available for update and delete statements.
SET SERVEROUTPUT ON
DECLARE
v_id t1.id%TYPE;
BEGIN
UPDATE t1
SET description = description
WHERE description = 'FOUR'
RETURNING id INTO v_id;
DBMS_OUTPUT.put_line('UPDATE ID=' || v_id);
DELETE FROM t1
WHERE description = 'FOUR'
RETURNING id INTO v_id;
DBMS_OUTPUT.put_line('DELETE ID=' || v_id);
COMMIT;
END;
/
UPDATE
ID
=
4
DELETE
ID
=
4
4.When
DML affects multiple rows we can still use the RETURNING INTO, but now
we must return the values into a collection using the BULK COLLECT
clause.
SET SERVEROUTPUT ON
DECLARE
TYPE t_tab IS TABLE OF t1.id%TYPE;
v_tab t_tab;
BEGIN
UPDATE t1
SET description = description
RETURNING id BULK COLLECT INTO v_tab;
FOR i IN v_tab.first .. l_tab.last LOOP
DBMS_OUTPUT.put_line('UPDATE ID=' || l_tab(i));
END LOOP;
COMMIT;
END;
/
UPDATE
ID
=
1
UPDATE
ID
=
2
UPDATE
ID
=
3
5.We can also use the RETURNING INTO clause in combination with bulk binds.
SET SERVEROUTPUT ON
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;
/
INSERT
ID
=
5
DESC
=FIVE
INSERT
ID
=
6
DESC
=SIX
INSERT
ID
=
7
DESC
=SEVEN
6.This functionality is also available from dymanic SQL.
SET SERVEROUTPUT ON
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'
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;
/
UPDATE
ID
=
1
UPDATE
ID
=
2
UPDATE
ID
=
3
分享到:
相关推荐
Oracle的RETURNING子句是数据库操作中的一个强大特性,它允许在执行INSERT、UPDATE或DELETE语句时直接获取处理的数据结果。这在处理事务时非常有用,尤其是当你需要基于新插入或更新的数据进行进一步操作时。 1. **...
Oracle PL/SQL语句 PL/SQL语句是Oracle数据库中的一种编程语言,用于创建存储过程、函数、触发器等数据库对象。PL/SQL语句可以用于实现复杂的业务逻辑,提高数据库的性能和安全性。 知识点一:存储过程的创建和...
在 Oracle 中,使用 Using 语句可以实现动态 SQL 的绑定变量,提高 SQL 语句的灵活性和安全性。本文将对 Oracle 中 Using 用法进行详细的介绍,并提供实际开发的示例和技巧。 一、静态 SQL 和动态 SQL 在 Oracle ...
本文将探讨Oracle本地动态SQL的使用方法和技巧。 动态SQL的使用场景广泛,它允许开发者在程序中动态地构建SQL语句,而不是在编译时静态定义。这种方法特别适用于那些在编译时无法确定要执行的SQL语句的情况,比如在...
- 解释了连接字符串的使用方法和连接池的概念。 - 涉及了数据库驻留连接池(Database Resident Connection Pooling, DRCP)。 - 还有代理认证、外部认证和特权连接的建立方法。 ### 4. 连接池与安全连接...
### Oracle存储过程使用详解 在Oracle数据库环境中,存储过程是一种重要的数据库对象,它允许...存储过程是提高数据库性能、简化复杂业务逻辑处理的关键工具,熟练掌握其使用方法对于Oracle数据库开发者来说至关重要。
7. **在函数或存储过程中执行一条插入语句并返回主键ID值**:Oracle提供了`RETURNING INTO`子句,能在插入数据后立即获取自增主键的值,常用于PL/SQL块。 8. **将一个查询结果值动态赋值给一个变量**:在PL/SQL中,...
### Oracle 使用存储过程插入文件至数据库操作方法 在Oracle数据库管理中,经常需要处理大量数据与文件的操作。本文将详细介绍如何使用存储过程将文件插入到Oracle数据库中的具体步骤及注意事项。 #### 一、创建...
**注意:** Oracle使用`RETURNING`子句来获取更新后的值,而DB2则需要使用`FETCH`语句来实现。 #### 十五、查询DUAL **Oracle:** ```sql SELECT 1 FROM DUAL; ``` **DB2:** ```sql SELECT 1 FROM SYSIBM....
在Oracle SQL中,Model子句是一种强大的功能,允许进行复杂的行处理和模拟迭代计算,通常用于解决无法通过标准SQL更新语句简单实现的问题。 9.4小节“Returning Updated Rows”讨论了在执行Model操作后如何获取更新...
ORACLE存储过程语言也使用LET语句赋值,例如: 变量 := 表达式; 变量 := 函数; SELECT 字段1[段2[...]] INTO 变量1[,变量2[...]] FROM 表 WHERE 条件; SELECT INTO 表记录变量 FROM 表 WHERE 条件; 四、存储...
- **RETURNING INTO**:在`DELETE`或`UPDATE`语句后,使用`BULK COLLECT`来获取受影响行的信息。 #### 四、示例 ##### 1. 在SELECT INTO语句中使用BULK COLLECT ```plsql DECLARE TYPE sal_list IS TABLE OF emp...
如果DML语句包含returning子句,如更新或删除后需要获取返回的值,可以使用returning into子句。 游标在Oracle中扮演着重要的角色,尤其是在处理多行结果集时。游标分为显式游标和隐式游标。显式游标需要显式声明、...
在Oracle数据库中,当需要存储超过VARCHAR2类型最大限制(4000个字符或2000个汉字)的数据时,可以使用LOB(Large Object)类型,包括BLOB(Binary Large OBject)、CLOB(Character Large OBject)以及BFILE。...
在PL/SQL中,可以使用`UTL_FILE`包读取文件,然后用`DBMS_LOB`包的`BULK COLLECT INTO`和`INSERT`语句将数据存入数据库。 ```plsql DECLARE file_handle UTL_FILE.FILE_TYPE; lob_loc BLOB; buffer RAW(32767)...
例如,MySQL的`LAST_INSERT_ID()`在Oracle中可能需要使用`RETURNING INTO`语句。 5. **性能优化**:Oracle提供了许多高级特性,如分区、物化视图、索引等,用于提升性能。迁移后,根据业务需求对新数据库进行性能...
- 注意点: Oracle使用 `EXECUTE IMMEDIATE` 执行动态SQL,而DB2则需要先使用 `PREPARE` 准备SQL,然后再执行。 #### 3. 游标转换 - **Oracle** 和 **DB2** 都支持游标,但语法有所不同。 - Oracle示例: ```sql ...
4. **使用`FORALL`**:当需要批量更新或插入数据时,可以使用`FORALL`语句来提高效率,如下所示: ```sql DECLARE TYPE num_list IS VARRAY(20) OF NUMBER; v_id num_list := num_list(100, 101); BEGIN FOR...
在Oracle的编程环境中,动态SQL作为一种灵活的解决方案,能够根据不同的业务需求动态构建SQL语句,从而提供更加个性化的数据操作能力。本文将深入探讨Oracle中动态SQL的基本概念、执行原理以及具体的开发实践,旨在...