2017-02-08 30 views
0

既存のオブジェクトではない(テーブルは存在しません) ここはコードの一部です(テーブルとカラムの汎用名を使用しています) ):私は、テーブル「MY_TABLE」は存在しないため、動的にこの文を書く方法を知らない動的SQL - ORACLE

DECLARE 
     C INTEGER := 0; 
    BEGIN 
    SELECT COUNT(1) INTO C FROM USER_TABLES WHERE TABLE_NAME = 'MY_TABLE'; 
    IF C > 0 THEN 
      DECLARE 
      CURSOR c_maps IS SELECT COLUM_NAME1, COLUM_NAME2 FROM MY_TABLE WHERE ACTIVE = 1; 
      BEGIN 
      FOR prec IN c_maps LOOP 
       some code...; 
      END LOOP; 
       EXECUTE IMMEDIATE 'some code..'; 
     END; 
    END IF; 
END; 
/

CURSOR c_maps IS SELECT COLUM_NAME1, COLUM_NAME2 FROM MY_TABLE WHERE ACTIVE =1; 

を私もそれが好き書き込もうとしました

CURSOR c_maps IS SELECT COLUM_NAME1, COLUM_NAME2 FROM (Select 'MY_TABLE' from dual) WHERE ACTIVE = 1; 

しかし、これはコンパイル時にも存在しない "ACTIVE"という列を参照しています... "execute immediate"ブロック内にすべての手順を記述することは可能ですか?ただし、別のバリアントを試してみましたが、成功しませんでした。

+0

列リストを作成するカーソルは、動的実行の一部でなければなりません。ダイナミック実行の2つのレイヤーがネストされています...理解してデバッグする悪夢。既存のスキーマに対してコード化する方法はありませんか? – dlatikay

答えて

3

カーソルを別の方法で開く必要があるため、既存のテーブルは動的SQLでのみ参照されます。

declare 
    c  integer := 0; 
    curs sys_refcursor; 
    v1  number; 
    v2  number; 
begin 
    select count(1) 
     into c 
     from user_tables 
    where table_name = 'MY_TABLE'; 

    if c > 0 
    then 
     open curs for 'select column_name1, column_name2 from my_table where active = 1'; 
     loop 
      fetch curs into v1, v2; 
      exit when curs%NOTFOUND; 
      dbms_output.put_line(v1 || ' - ' || v2); 
     end loop; 
    else 
     dbms_output.put_line('The table does not exist'); 
    end if; 
end; 
/