01008. 00000 — «не все переменные связаны»

#oracle

#Oracle

Вопрос:


 declare
.
.
.
.
begin.
.
.
  for i in (Select * from bpt_mapping_logic where master = tab_name and CHILD = 'MI9_CST_TEMP' ) loop

          str1 := i.all_cols;
          str2 := i.default_val;

          select 'insert into '||i.child||'_temp 
          ('||str1||' )
          values 
          (' ||str2||' )' into str3 from dual;

          select i.mapping into str5 from dual;    

          dbms_output.put_line (str3);
          EXECUTE IMMEDIATE  STR3;

end loop;

end;
  

для приведенного выше кода я получаю
01008. 00000 — ошибка «не все переменные привязаны»

вывод СУБД для str3 ::::::::

 str3 =  

insert into  
MI9_CST_TEMP_temp (  A , B , C , D )
values
('aaa'  , 'bbb' , amp;C . amp;D);
  

он показывает

  1. 00000 — «не все переменные связаны» * Причина:

ошибка во время выполнения

Комментарии:

1. Вы используете переменные amp;C и amp;D в вашем INSERT — где вы их определили / присвоили им значения?

2. Ваш код неполный. У вас в строке запроса есть двоеточие (:) или амперсанд (amp;)? Тогда, конечно, НЕМЕДЛЕННОЕ ВЫПОЛНЕНИЕ выдаст ошибку. убедитесь, что генерируемая вами строка синтаксически корректна, если вы вообще определяете какую-либо переменную, попробуйте ВЫПОЛНИТЬ НЕМЕДЛЕННО … ИСПОЛЬЗОВАНИЕ ..

Ответ №1:

EXECUTE IMMEDIATE не удается получить доступ к переменным SQL * PLUS таким образом; если вы знаете, что будет ровно две переменные узла, которые будут называться amp;C и amp; D, вы можете попробовать

 str3 := replace(replace(str3, chr(38)||'C', ':1'), chr(38)||'D', ':2');

EXECUTE IMMEDIATE  STR3 using 'amp;C', 'amp;D';
  

Комментарии:

1. Привет, спасибо за ответ. могу ли я использовать EXECUTE IMMEDIATE STR3 с использованием strx; (strx: = amp; c, amp; d)

2. В предложении USING вам нужен один аргумент для каждого :n заполнителя инструкции. Поэтому я боюсь, что ответ «нет».