oracle - 将 SYS_REFCURSOR 与 CTE 结合使用(包括 Update 语句)

标签 oracle common-table-expression toad

我使用 CTE 获取一些值,然后使用 UPDATE 语句从数据库表中清除返回的值。

这发生在存储过程内。

UPDATE TABLE1
   SET AA = NULL, BB = NULL
 WHERE EXISTS
          (WITH T1 AS (SELECT AA, BB, CC FROM TABLEABC)
               ,T2
                AS (SELECT AA, BB, CB
                      FROM T1
                     WHERE T1.AA > 100)
           SELECT *
             FROM T2
            WHERE TABLE1.CC = T2.CC

我的 BB 列有一些标识数据,我想在 Update 语句清除这些数据之前捕获这些数据。谁能指导我如何捕获此列数据并作为过程输出返回。

OPEN SYS_REFCURSOR FOR

最佳答案

不幸的是,UPDATE 语句的 RETURNING INTO 子句将为您提供更新后的值,而不是之前的值。 p>

因此,如果您想保存旧值,则必须在 UPDATE 语句之前执行此操作。请注意锁定行,并且仅实际更新已保存的行,因为在保存数据和更新数据之间,您的表可能会被修改。

然后,返回引用游标中保存的数据。

这是将所有这些组合在一起的代码:

CREATE TABLE TABLE1 ( AA number, BB number );

CREATE OR REPLACE PACKAGE so_test AS

  TYPE TABLE1_LIST_TAB IS TABLE OF TABLE1%ROWTYPE;

  FUNCTION do_it return sys_refcursor;

END so_test;


CREATE OR REPLACE PACKAGE BODY so_test AS

  FUNCTION do_it RETURN SYS_REFCURSOR IS
    l_old_data TABLE1_LIST_TAB;
    l_rc SYS_REFCURSOR;
  BEGIN

    SELECT AA, BB 
    BULK COLLECT INTO l_old_data
    FROM table1
    WHERE -- put your conditions here of what you intend to update
    FOR UPDATE;

    UPDATE TABLE1
      SET AA = NULL, BB = NULL
    WHERE EXISTS ( SELECT 'record old data is captured'
                 FROM   TABLE(l_old_data) od
                 WHERE  od.aa = table1.aa   -- Assuming AA is a primary key
               ) 
    RETURNING AA, BB BULK COLLECT INTO l_old_data;

    OPEN l_rc FOR SELECT * FROM TABLE(l_old_data);

    RETURN l_rc;

  END do_it;
END so_test;

注意:如果您不是使用 12c,则需要将 TABLE1_LIST_TAB 定义为数据库中的 OBJECT 类型,而不是在包规范中,否则包主体无法编译。

关于oracle - 将 SYS_REFCURSOR 与 CTE 结合使用(包括 Update 语句),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47317696/

相关文章:

sql - 在表中保存嵌套 XML 时出现 PL/SQL 错误

c# - 如果连接已经打开,可以调用 OracleConnection.Open() 吗?

sql - 对于每个字符串,执行一个函数/过程

mysql - 如何比较和应用 toad for mySQL 中的更改

oracle - 使用 Toad for Oracle 检索存储过程、 View 、函数、触发器

oracle - "who_called_me"相当于 Hibernate

sql - 我可以更新 cte 吗?

sql - TSQL - 递归 CTE 效率低下 - 需要替代方案

SQL 递归 CTE 链接链

java - 我应该如何开始分析/优化我的 java 应用程序/oracle 数据库?