2017-11-15 14 views
2

CTE를 사용하여 일부 값을 가져온 다음 UPDATE 문을 사용하여 데이터베이스 테이블에서 반환 된 값을 지우고 있습니다.CTE에서 SYS_REFCURSOR 사용 (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 

답변

2

불행하게도, 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에없는 경우, 데이터베이스에 OBJECT 유형으로 대신 패키지 사양에 TABLE1_LIST_TAB를 정의 할 필요가, 또는 것 그렇지 않으면 패키지 본문이 컴파일되지 않습니다.