2017-03-17 105 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; 
/