динамический 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 2

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;

Использовать

sql_stmt := 'BEGIN dbms_stats.gather_table_stats (''SCOTT'','''
    || rec.table_name || '''); END;';

Вместо этого.