Невозможно создать таблицу, используя pl / sql - PullRequest
5 голосов
/ 22 октября 2011
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 ]

12 голосов
/ 22 октября 2011

измените его так, чтобы он выполнялся в 2 последовательных шага (НЕ в одном анонимном блоке 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;

РЕДАКТИРОВАТЬ - согласно комментарию:

Перед выполнением анализируется весь блок PL / SQL - все объекты, используемые в блоке PL / SQL, должны существовать ДО того, как будет выполнен блок PL / SQL ...

3 голосов
/ 22 октября 2011

Вы должны сделать это в двух отдельных блоках.

Первый блок:

begin
...
end;
/

Косая черта указывает, что ваш буфер должен быть отправлен в СУБД и оценен.Он указывает, где заканчивается ваш PL / SQL-код и может начинаться оценка.

Затем следующее:

declare
...
begin
...
end;
/

Таким образом, у вас есть:

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

Это работает вSQL * Plus и SQLDeveloper.

1 голос
/ 27 апреля 2018

Если вы работаете в пределах блока SQLPlus, все изменения DDL должны выполняться с немедленным выполнением .К сожалению, эти изменения остаются невидимыми до тех пор, пока блок не завершит выполнение.

Чтобы обойти эту проблему, используйте последовательно execute немедленный для всех следующих операторов, которые зависят от прежних «скрытых» изменений.Это относится и к операторам DML.В вашем случае:

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