2017-02-19 152 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语句是自动提交的,但在这种情况下,我必须在执行immediate语句后添加一个提交语句来解决问题。

回答

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甚至不会“编译”。在EXECUTE immediate字符串中的任何SQL在编译期间都将被忽略。只有在编译成功后,执行立即执行的SQL才会真正执行。 –

+0

谢谢你。那么为什么当我在execute immediate之后向代码添加一个提交时它会工作? – Satyaki