2017-02-08 5 views
0

У меня есть следующая процедура, которая не компилируется правильно, потому что она относится к несуществующим объектам (таблица не существует) Вот только часть кода (я использовал общие имена для таблиц и столбцов):Dynamic 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; 
/

Я не знаю, как писать это заявление динамически, так как таблица «mY_TABLE» не существует:

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; 

Однако, чем он относится к столбцу «АКТИВ», который также не существует во время компиляции ... Можно написать всю процедуру внутри «выполнить немедленный» - блок? Я пробовал разные варианты, однако без успеха

+0

курсор, который строит список столбцов, должен быть частью динамического выполнения. два слоя динамического исполнения вложены ... кошмар, чтобы понять и отладить. действительно ли нет способа кодировать существующую схему? – 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; 
/