2014-05-08 13 views
0
CREATE OR REPLACE PROCEDURE SP_PROC (
     V_P  IN VARCHAR2 DEFAULT NULL) 
    AS 
     V_DATE TIMESTAMP:=SYSDATE; 
     V_TAB  VARCHAR2(10); 
    BEGIN 
     IF V_P = 'P' THEN 

      SELECT CUR_DATE, TGT_TAB 
        INTO V_DATE, V_TAB 
      FROM TEMP_L 
       WHERE P='P' 
       AND END_TIME IS NULL 
       AND COMPLETE_IND IS NULL; 

      EXECUTE IMMEDIATE 'TRUNCATE TABLE '||V_TAB; 

       IF V_TAB = 'TEMP_V' THEN 
        INSERT INTO TEMP_V 
        SELECT V FROM REP_TAB 
       ELSE 
        EXECUTE IMMEDIATE 'TRUNCATE TABLE TEMP_V'; 
        INSERT INTO TEMP_V 
        SELECT V FROM REP_TAB 
       END IF; 

       IF V_TAB = 'TEMP_T' THEN 
        INSERT INTO TEMP_V 
        SELECT V FROM REP_TAB 
       ELSE 
        EXECUTE IMMEDIATE 'TRUNCATE TABLE TEMP_T'; 
        INSERT INTO TEMP_V 
        SELECT V FROM REP_TAB 
       END IF; 
    END; 

我上面的過程有一個IN參數,它採用'P'等值。如果輸入值爲'P' ,則將表CUR_DATE和TGT_TAB從表TEMP_L中的兩個單獨變量V_DATE和V_TAB中選擇,其中兩個列返回空值。對於返回true的記錄,然後應用這個邏輯,如果變量V_TAB從TGT_TAB獲取記錄,='TEMP_V'(我意識到它可能會返回多於一條記錄和不同的記錄,這就是爲什麼我要求幫助),然後插入.. else insert into ..我怎樣才能調整我的程序繞過確切的獲取返回多個請求的數

現在問題在於,我的SELECT INTO變量只能保存1個值,有時可能會有多個記錄在TGT_TAB中返回空值和不同值。有時它會是TEMP_V,有時會是TEMP_T等。

如何更改我的腳本以便成功運行腳本的底部部分? 由於會返回多個記錄,因此我的變量將返回錯誤:精確提取返回多個請求的數字。我嘗試使用批量收集,但收集只能在循環中工作,我不知道如何將其應用於我的以下要求。我需要基於返回值「TEMP_V」,「TEMP_T」等基本上插入它們。

    IF V_TAB = 'TEMP_V' THEN 
         INSERT INTO TEMP_V 
         SELECT V FROM REP_TAB 
        ELSE 
         EXECUTE IMMEDIATE 'TRUNCATE TABLE TEMP_V'; 
         INSERT INTO TEMP_V 
         SELECT V FROM REP_TAB 
        END IF; 

        IF V_TAB = 'TEMP_T' THEN 
         INSERT INTO TEMP_V 
         SELECT V FROM REP_TAB 
        ELSE 
         EXECUTE IMMEDIATE 'TRUNCATE TABLE TEMP_T'; 
         INSERT INTO TEMP_V 
         SELECT V FROM REP_TAB 
        END IF; 

任何幫助都可以。

回答

0

嘗試這種情況:

CREATE OR REPLACE PROCEDURE SP_PROC (
    V_P  IN VARCHAR2 DEFAULT NULL) 
AS 
BEGIN 
    IF V_P = 'P' THEN 
    FOR aRow IN (SELECT CUR_DATE, TGT_TAB 
        FROM TEMP_L 
        WHERE P='P' 
        AND END_TIME IS NULL 
        AND COMPLETE_IND IS NULL) 
    LOOP 
     EXECUTE IMMEDIATE 'TRUNCATE TABLE '|| aRow.TGT_TAB; 

     IF aRow.TGT_TAB = 'TEMP_V' THEN 
     INSERT INTO TEMP_V 
      SELECT V FROM REP_TAB; 
     ELSE 
     EXECUTE IMMEDIATE 'TRUNCATE TABLE TEMP_V'; 

     INSERT INTO TEMP_V 
      SELECT V FROM REP_TAB; 
     END IF; 

     IF aRow.TGT_TAB = 'TEMP_T' THEN 
     INSERT INTO TEMP_V 
      SELECT V FROM REP_TAB; 
     ELSE 
     EXECUTE IMMEDIATE 'TRUNCATE TABLE TEMP_T'; 

     INSERT INTO TEMP_V 
      SELECT V FROM REP_TAB; 
     END IF; 
    END LOOP; 
    END IF; 
END SP_PROC; 

這取代了單用遊標循環,其允許匹配SELECT標準的所有行進行處理的原始代碼選擇。

分享和享受。

0

您必須決定如何處理在選擇中返回多行的情況。你想處理所有的行嗎?最後一行?第一行?一旦做出決定,您可以使用FOR循環(或OPEN ... FETCH ... CLOSE循環)來處理TEMP_L中的相應行。

+0

我將使用最早的CUR_DATE。它將如下所示。 SELECT CUR_DATE,TGT_TAB INTO V_DATE,V_TAB FROM TEMP_L WHERE P = 'P' AND END_TIME IS NULL AND COMPLETE_IND IS NULL AND START_TIME =(SELECT MIN(CUR_DATE) FROM TEMP_L WHERE END_TIME IS NULL AND COMPLETE_IND是NULL AND PARA ='P'); 你能舉一個例子說明它是如何完成的嗎? – JohnD

相關問題