2014-11-18 3 views
0

Я постоянно сталкиваюсь с проблемой, связанной со следующей процедурой PL/SQL. Мне нужны переменные для создания динамического оператора SQL, но мне также нужна вложенная таблица.Вложенная таблица и EXECUTE IMMEDIATE

l_code list_code := list_code(); 

l_code := PKG_DATA.GET_CODES(in_code) ; 


v_sql := 'SELECT ' || in_var_name ||' 
       FROM view 
       WHERE supplier = '||in_supplier ||' 
       AND factory = '|| in_factory ||' 
       AND code IN ('|| (SELECT * FROM TABLE(l_code))||') '; 


EXECUTE IMMEDIATE v_sql 
       INTO v_value; 

v_value является вложенной таблицей

[Ошибка] PLS-00103 (60: 46): PLS-00103: Встречающийся символ "SELECT" когда ожидается одно из следующих действий:

(- + корпус мод новый не нулевой продолжить, [Error] PLS-00103 (60: 74): PLS-00103: Обнаружен символ ")" когда ожидается один из следующее:

,; для как группа с пересечением минус порядок начала союза wh

У кого-нибудь есть идея или отрезанная?

ТНХ

ответ

0
v_sql := 'SELECT ' || in_var_name 
     || ' FROM view ' 
     || ' WHERE supplier = :supplier AND factory = :factory ' 
     || ' AND code IN (SELECT * FROM TABLE(PKG_DATA.GET_CODES(:code)))'; 

EXECUTE IMMEDIATE v_sql INTO v_value USING in_supplier, in_factory, in_code;  
+0

спасибо, это работает ! :) –

+0

Единственная ошибка в вашем коде: 'EXECUTE IMMEDIATE v_sql using in_supplier, in_factory, in_code INTO v_value; . Исправлено: «ВЫПОЛНИТЬ IMMEDIATE v_sql INTO v_value, используя in_supplier, in_factory, in_code; ' –

+0

@michael Хорошо, спасибо – Multisync

0

Я предлагаю использовать переменные связывания

v_sql := 'SELECT :in_var_name 
      FROM view 
      WHERE supplier = :in_supplier 
      AND factory = :in_factory 
      AND code IN (SELECT * FROM TABLE(:l_code))) '; 

EXECUTE IMMEDIATE v_sql 
INTO v_value 
USING in_var_name, in_supplier, in_factory, l_code; 

Но шансы, что вам не нужен динамический SQL вообще:

SELECT in_var_name 
INTO v_value 
FROM view 
WHERE supplier = in_supplier 
    AND factory = in_factory 
    AND code IN (SELECT * FROM TABLE(l_code)); 
Смежные вопросы