Sql 对DDL语句执行立即数

Sql 对DDL语句执行立即数,sql,oracle,plsql,Sql,Oracle,Plsql,我在Oracle数据库中执行了以下代码,但遇到了视图名称不存在的错误。有人能调查一下吗 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);

我在Oracle数据库中执行了以下代码,但遇到了视图名称不存在的错误。有人能调查一下吗

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

您得到的是一个编译错误。PL/SQL将在执行之前进行编译。因此,在编译期间,您尝试选择的表将不可用。这就是错误。仅当视图名称已存在时,此操作才有效。尝试选择“太动态”

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;
/
顺便说一下,DDL不需要提交

您得到的是一个编译错误。PL/SQL将在执行之前进行编译。因此,在编译期间,您尝试选择的表将不可用。这就是错误。仅当视图名称已存在时,此操作才有效。尝试选择“太动态”

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

顺便说一下,DDL不需要提交

我可以走了。但请你澄清一下为什么它不起作用。我的意思是,在上一行中创建视图后,我们试图检索视图的值。@Satyaki,正如我提到的,当您选择的表不存在时,PL/SQL甚至不会编译。。编译期间,将忽略EXECUTE immediate as字符串中的任何SQL。只有在编译成功后,您的executeimmediate中的SQL才会真正执行。谢谢。那么,为什么我在executeimmediate之后向代码中添加commit时它会起作用呢?我很乐意去做。但请你澄清一下为什么它不起作用。我的意思是,在上一行中创建视图后,我们试图检索视图的值。@Satyaki,正如我提到的,当您选择的表不存在时,PL/SQL甚至不会编译。。编译期间,将忽略EXECUTE immediate as字符串中的任何SQL。只有在编译成功后,您的executeimmediate中的SQL才会真正执行。谢谢。那么,当我在executeimmediate之后向代码添加commit时,为什么它会起作用呢?