2017-03-17 199 views
-1

我想重寫下面的代碼,以避免ORA-00942錯誤(表或視圖不存在)。這是因爲在編譯我的代碼時,表(MY_TABLE_NAME)仍然不存在,因此我需要使其成爲動態的。oracle plsql動態循環

下面是代碼(使用通用名稱)

DECLARE 
    C INTEGER := 0; 
BEGIN 
SELECT COUNT(1) INTO C FROM USER_TABLES WHERE TABLE_NAME = 'MY_TABLE_NAME'; 
IF C > 0 THEN 
     DECLARE  
     CURSOR c_var IS SELECT COLUMN_1, COLUMN_2 FROM MY_TABLE_NAME WHERE ACTIVE = 1; 
     v_id NUMBER(15); 
     BEGIN 
     FOR prec IN c_var LOOP 
      ......testcode 
     END LOOP; 
     EXECUTE IMMEDIATE 'testcode'; 
     END; 
END IF; 
END; 
/

這是沒有必要使用cursor..so我試圖重寫它,並用正常的循環,因爲我覺得它更容易使代碼更加動感,但是我仍然在努力

+0

你到底要帶'MY_TABLE_NAME'做什麼?選擇一行,多行,插入,更新,刪除? –

+1

看看[這裏](http://stackoverflow.com/questions/41855482/select-from-table-that-does-not-exist/41855631#41855631)。爲什麼這個問題有所不同? – Aleksej

+0

@Aleksej well..it並不像我以前的帖子那麼容易..我只是不能解決這個問題與執行立即或至少我試過但失敗,因爲這裏的代碼更復雜 – NoName123

回答

2

假設你只想要得到的光標工作:

DECLARE 
    C INTEGER := 0; 
    TYPE MyCurTyp IS REF CURSOR; 
    v_my_cursor MyCurTyp; 
    v_col1  varchar2(20); -- replace varchar2(20) with correct data type 
    v_col2  varchar2(20); -- replace varchar2(20) with correct data type 
BEGIN 
SELECT COUNT(1) INTO C FROM USER_TABLES WHERE TABLE_NAME = 'MY_TABLE_NAME'; 
IF C > 0 THEN 
    OPEN v_my_cursor FOR 'SELECT COLUMN_1, COLUMN_2 FROM MY_TABLE_NAME WHERE ACTIVE = 1'; 
    LOOP 
     FETCH v_my_cursor into v_col1, v_col2; 
     EXIT WHEN v_my_cursor%notfound; 

     -- prepare testcode from v_col1, v_col2 

     EXECUTE IMMEDIATE 'testcode'; 
     END LOOP; 
     close v_my_cursor; 
END IF; 
END; 
/