2017-02-19 7 views
1

Я выполнил следующий код в базе данных Oracle, но столкнулся с ошибкой имени представления, которого нет. Может ли кто-нибудь заглянуть в нее?Выполнять немедленные по заявлениям DDL

Declare 
Stmt varchar2(2000); 
Var number; 
Begin 
Stmt:='create or replace view emp_dept_v as select * from emp'; 
Execute immediate stmt; 
Select count(*) into var from emp_dept_v; 
Dbms_output. Put_line(var); 
End; 

Я знаю, что заявления DDL являются авто поручены, но в этом случае я должен добавить совершить заявление после того, как выполнить немедленное заявление для решения этого вопроса.

ответ

4

Что вы получаете компиляция ошибка. PL/SQL будет скомпилирован до его выполнения. Поэтому во время компиляции таблица, которую вы пытаетесь сделать SELECT, будет недоступна. И, следовательно, ошибка. Только если имя вида уже существует, это будет работать. Попробуйте select тоже динамично.

Declare 
Stmt varchar2(2000); 
Var number; 
Begin 
Stmt:='create or replace view emp_dept_v as select * from emp'; 
Execute immediate stmt; 

Stmt:='Select count(*) from emp_dept_v'; 
Execute immediate stmt into var; 
Dbms_output. Put_line(var); 
End; 
/

И кстати, DDLs не нужен COMMIT;

+0

Я в порядке. Но не могли бы вы дать некоторые разъяснения, почему они не работают. Я имею в виду, что мы пытаемся получить значение представления после его создания в предыдущей строке. – Satyaki

+0

@Satyaki Как я уже упоминал, PL/SQL даже не «компилирует», когда выбранная таблица не существует. Любой SQL внутри строки «EXECUTE немедленный» будет проигнорирован во время компиляции. Только при успешной компиляции SQL в вашем выполнении немедленно будет выполнен. –

+0

Спасибо за это. Так почему это работает, когда я добавляю фиксацию кода после выполнения немедленного действия? – Satyaki