2013-06-05 2 views
2

Я получаю сбой с использованием динамических sql и котировок. Когда я dbms_output sql_stmt, он выдает действительный/рабочий код. Как должна быть написана строка sql_stmt: =, чтобы я мог ее динамически выполнить? Я пробовал использовать: 1, используя синтаксис связывания переменных, но не повезло.динамический sql с кавычками и выполнить немедленный

Точка этого кода предназначена для сбора статистики для подмножества таблиц.

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; 

Ошибки, которые я получаю от выполнения непосредственного sql_stmt; строка: ORA-00900: неверный оператор SQL ORA-06512: строка 8

ответ

7

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; 
1

Использование

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

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

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