динамический sql с кавычками и немедленным выполнением
Я запутался, используя динамический sql и кавычки. Когда я dbms_output sql_stmt, он выводит допустимый / рабочий код. Как должна быть записана строка sql_stmt:=, чтобы я мог ее динамически выполнить? Я пробовал ":1, используя " синтаксис переменной bind, а также без успеха.
Смысл этого кода заключается в сборе статистики для подмножества таблиц.
set serveroutput on
--create this test table for working example.
--create table test3 as select table_name from user_tables where rownum <= 5;
declare
sql_stmt varchar2(500);
begin
for rec in (select table_name from test3)
loop
sql_stmt := 'exec dbms_stats.gather_table_stats (''SCOTT'',''' || rec.table_name || ''')';
dbms_output.put_line(sql_stmt);
execute immediate sql_stmt; -- <---Error is here---
end loop;
end;
Ошибки, которые я получаю из строки execute immediate sql_stmt; : ORA-00900: недопустимая инструкция SQL ORA-06512: в строке 8
2 ответа:
EXEC-это команда SQL * Plus. Вы можете обернуть вызов в DBMS_STATS.GATHER_TABLE_STATS в анонимном блоке, если вы настаиваете на использовании динамического SQL.
Тем не менее, вы должны иметь возможность вызвать процедуру напрямую, например:
declare sql_stmt varchar2(500); begin for rec in (select table_name from test3) loop dbms_stats.gather_table_stats ('SCOTT',rec.table_name); end loop; end;