0

我需要構建一個從源表中獲取數據並將其插入到目標表中的PL/SQL過程。源表有ITEM1列,ITEM2列和SRC_CODE列。 SRC_CODE列包含一個SQL Select語句的字符串,即SELECT KEY FROM SOMETABLE WHERE DAY = V_DAY。所以,我需要執行SRC_CODE列中的語句,並在select語句中填充V_DAY變量。生成的KEY值以及來自源表的ITEM1ITEM2將進入TARGET表。如何處理包含需要執行的SQL語句字符串的表列?

邏輯上接近的過程中,我猜我需要一個行從源表,執行SRC_CODE到一個集合,然後乘坐從收集每個KEY和領帶回給ITEM1ITEM2並插入KEYITEM ,並將ITEM2納入目標表。在編程方面,我不知道如何去做這件事。

以下是我的嘗試,至少用鍵值填充目標,但無濟於事,因爲我得到一個無效的標識符錯誤。如果有人能夠糾正/擴展這個來得到我所需要的,這將是大加讚賞:

CREATE OR REPLACE PROCEDURE POPULATETARGET IS 
TYPE KEYS_T IS TABLE OF SOMETABLE.KEY%TYPE; 
L_KEYS KEYS_T; 
V_DAY NUMBER; 
SRC_CODE_FETCH VARCHAR2(200); 
V_SRC_CODE VARCHAR2 (4000); 
RC SYS_REFCURSOR; 

BEGIN 
V_DAY := 20150826; 
SRC_CODE_FETCH := 'SELECT SRC_CODE FROM SOURCE'; 

OPEN RC FOR SRC_CODE_FETCH; 
    LOOP 
     FETCH RC INTO V_SRC_CODE; 
     EXIT WHEN RC%NOTFOUND; 
      EXECUTE IMMEDIATE V_SRC_CODE BULK COLLECT INTO L_KEYS USING V_DAY; 
      FORALL x IN L_KEYS.FIRST..L_KEYS.LAST 
       INSERT INTO TARGET VALUES L_KEYS(x); 
    END LOOP; 
    CLOSE RC; 
END; 

回答

0

的問題是,你在INSERT語句缺少括號,所以你插入線應該是:

INSERT INTO TARGET VALUES (L_KEYS(x)); 

另外我建議你在這條線之後使用COMMIT

0

這工作完美:

CREATE OR REPLACE PROCEDURE POPULATETARGET IS 
    TYPE KEYS_T IS TABLE OF SOMETABLE.KEY%TYPE; 
    L_KEYS KEYS_T; 
    V_DAY NUMBER; 
    V_SRC_CODE VARCHAR2 (4000); 
    RC SYS_REFCURSOR; 

BEGIN 
    VDAY_ID := 20150826; 

    OPEN RC FOR SELECT SRC_CODE FROM SOURCE; 
    LOOP 
     FETCH RC INTO V_SRC_CODE; 
     EXIT WHEN RC%NOTFOUND; 
      EXECUTE IMMEDIATE V_SRC_CODE BULK COLLECT INTO L_KEYS USING V_DAY; 
      FORALL x IN L_KEYS.FIRST..L_KEYS.LAST 
       INSERT INTO TARGET (KEY, ITEM1, ITEM2) 
       VALUES((L_KEYS(x)), (SELECT ITEM1 FROM SOURCETBL WHERE SRC_CODE = V_SRC_CODE), (SELECT ITEM2 FROM SOURCETBL WHERE SRC_CODE = V_SRC_CODE)); 
       COMMIT; 
    END LOOP; 
    CLOSE RC; 
END;