【问题标题】:Use SYS_REFCURSOR with CTE (includes Update statement)将 SYS_REFCURSOR 与 CTE 一起使用(包括更新语句)
【发布时间】:2017-11-15 21:37:41
【问题描述】:

我正在使用 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 有一些我想在更新语句清除之前捕获的标识数据。谁能指导我如何捕获此列数据并作为过程输出返回。

OPEN SYS_REFCURSOR FOR

【问题讨论】:

    标签: oracle common-table-expression toad


    【解决方案1】:

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

    因此,如果要保存旧值,则必须在 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 类型,否则包体将无法编译。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-05
      • 1970-01-01
      相关资源
      最近更新 更多