2014-08-15 3 views
0

У меня есть этот правильный запрос (я получаю значение из процедуры, моя проблема заключается в кавычки):Запрос котировок в выполнить запрос

EXECUTE IMMEDIATE ('insert into TABLES (table_name) 
    values ('||''''||TABLE_NAME||''''||')'); 

Когда я пытаюсь добавить еще один столбец, я получаю сообщение об ошибке , может ли кто-нибудь добавить правильные цитаты? Это один неправилен:

EXECUTE IMMEDIATE ('insert into TABLES (table_name,column_name) 
    values ('||''''||TABLE_NAME||''''||'',''||column_name||''''||')'); 
+2

Там нет необходимости использовать нативный динамический SQL ('выполнить immediate' заявление), использовать статические, просто' вставить into' заявления. 2) Не говорите, что вы получаете сообщение об ошибке, также сообщайте об ошибке. –

+1

Если вам нужно использовать динамический SQL (и вы не используете этот пример), полезно поместить команду в строковую переменную, чтобы вы могли использовать 'dbms_output' для ее отображения, - тогда вы можете точно увидеть, что именно выполняется, которые делают отладку намного проще. Вы также должны использовать переменные связывания. –

ответ

2

Для утверждения у вас есть:

EXECUTE IMMEDIATE ('insert into TABLES (table_name,column_name) 
    values ('''||TABLE_NAME||''','''||column_name||''')'); 

Но вы должны использовать переменные связывания, которые гораздо проще строить и читать, а также намного безопаснее:

EXECUTE IMMEDIATE ('insert into TABLES (table_name,column_name) 
    values (:table_name,:column_name)') USING TABLE_NAME, COLUMN_NAME; 

И, как отмечено в комментариях, это не обязательно должно быть динамическим; или, по крайней мере, было бы не, если бы вы назвать ваши переменные что-то другое с именами столбцов - которые по-прежнему работает, но выглядит неоднозначно:

insert into TABLES (table_name,column_name) 
values (TABLE_NAME,COLUMN_NAME); 

Вы можете указать область, чтобы сделать вещи clerarer; при условии, ваша процедура называется MY_PROC вы можете сделать:

insert into TABLES (table_name,column_name) 
values (MY_PROC.TABLE_NAME,MY_PROC.COLUMN_NAME); 
1

Предполагая, что вы даже не нужен динамический SQL - я не знаю, контекста, в котором вы пытаетесь это - ваша проблема котировки будет отсортирована следующим образом:

EXECUTE IMMEDIATE ('insert into TABLES (table_name) values ('''||TABLE_NAME||''')'); 

EXECUTE IMMEDIATE ('insert into TABLES (table_name,column_name) values ('''||TABLE_NAME||''','''||column_name||''')'); 

Но на самом деле вы должны использовать переменные связывания:

declare v_table_name varchar2(30); 

begin 

    -- get your v_table_name here 

    EXECUTE IMMEDIATE ('insert into TABLES (table_name) values (:TABLE_NAME)') 
    USING v_table_name; 

end; 
Смежные вопросы