无法使用pl / sql创建表

时间:2011-10-22 10:32:36

标签: oracle plsql oracle10g oracle11g relational-database

declare
type yy is table of t12.name%type index by binary_integer;
y yy;
n number:=1;
begin
execute immediate 'create table rat1 ( name varchar2(10) )';
commit;

select name bulk collect into y from t12;
for i in (select id,name from t12)
loop
dbms_output.put_line(y(n));
n:=n+1;
end loop;
forall i in y.first..y.last
insert into rat1 values(y(i));
end;

给予ora-00942。 我查了一下......在某个网站上提到你必须提供以下特权......

grant select on sys.v_$paramenter to abc

我也无法做到这一点。任何人都可以帮助我

3 个答案:

答案 0 :(得分:12)

更改它以便在两个连续的步骤中执行(不像现在那样在一个PL / SQL匿名块中执行):

首先这个

begin
execute immediate 'create table rat1 ( name varchar2(10) )';
commit;
end;

然后作为第二块这个

declare
type yy is table of t12.name%type index by binary_integer;
y yy;
n number:=1;
begin

select name bulk collect into y from t12;
for i in (select id,name from t12)
loop
dbms_output.put_line(y(n));
n:=n+1;
end loop;
forall i in y.first..y.last
insert into rat1 values(y(i));
end;

编辑 - 根据评论:

在执行之前解析WHOLE PL / SQL块 - PL / SQL块中使用的所有对象必须在执行PL / SQL块之前存在...

答案 1 :(得分:3)

你应该在两个不同的区块中进行。

第一块:

begin
...
end;
/

斜杠表示应将缓冲区发送到DBMS并进行评估。它指示PL / SQL代码的结束位置并开始评估。

然后是下一个:

declare
...
begin
...
end;
/

因此,你有:

begin
...
end;
/
declare
...
begin
...
end;
/

它适用于SQL * Plus和SQLDeveloper。

答案 2 :(得分:1)

如果在SQLPlus块中使用,则所有DDL更改都应使用 execute immediate 执行。 不幸的是,在块完成执行之前,这些更改是不可见的。

要解决此问题,请使用立即执行以用于以下所有依赖于前者"隐藏"变化。这也适用于DML语句。在你的情况下:

...
execute immediate 'insert into rat1 values('||y(i)||')';
...