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
我也无法做到这一点。任何人都可以帮助我
答案 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)||')';
...