动态SQL无法按预期工作

时间:2010-04-06 08:27:20

标签: sql oracle plsql

create or replace procedure createtables
  Authid current_user as
begin
  execute immediate 'create table newcustomer as select * from customer';
end;

create or replace procedure e
is
begin
 createtables;
 select * from newcustomer; 
end;

我上面有两个程序。第一个将创建一个名为newcustomer的新表,第二个过程将调用第一个过程并查询newcustomer表。当我尝试编译这段代码时,它表示该表尚未创建,我并没有真正得到它,因为我已经调用了createtables过程,因此我假设我创建了该表。

任何帮助将不胜感激。感谢

1 个答案:

答案 0 :(得分:3)

编译第二个程序没有执行第一个程序将首先失败,因为尚未创建表。

您无法编译依赖于不存在的对象的过程。

在创建程序EXEC createtables之前使用e,不要在其中调用createtables


程序e也不会编译,因为您没有使用select * from newcustomer的结果作为游标或将结果存储到变量中。


修改

您可以使用匿名块代替过程。将以下内容放入文件并执行(例如,通过SQL * Plus):

Create Table newcustomer As Select * From customer;

Begin
  Null; --# Do something with your new table in here.
End;
/