#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);
он показывает
- 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
заполнителя инструкции. Поэтому я боюсь, что ответ «нет».