2011-10-22 5 views
3
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입니다. 나는 당신이 privilages 다음 줄 필요가 있음을 언급 한 일부 웹 사이트에서 ... 그것에 대해 확인 ...pl/sql을 사용하여 테이블을 만들 수 없습니다.

grant select on sys.v_$paramenter to abc 

내가 also..Can 어떤 몸이

+0

플러스. 여기 절차 또는 커서의 개념을 사용하고 싶지 않습니다 ..... – Tarun

답변

11
좀 도와 것을 할 수없는입니다 이 2 연속 단계에서 실행되도록 (NOT 한 PL/SQL 익명 블록에서 지금처럼) 변경

: THEN

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 블록 전에 존재해야합니다입니다 실행했습니다 ...

+0

고맙습니다. 모든 DDL은 pl/sql의 1 블록이 성공적으로 실행될 때까지 적용되지 않습니다. – Tarun

+0

목표 : PL/SQL을 배우는 중에 아무것도 할 필요가 없습니다. 단지 실험을하고 있었고 .. 실수 및 오류가 발생했습니다 .... – Tarun

+2

아니요 - 실행되기 전에 실행되기 전에 전체 PL/SQL 블록이 구문 분석되므로 PL/SQL 블록이 실행되기 전에 PL/SQL 블록에 사용 된 모든 객체가 존재해야합니다 ... upvote/도움이되었던 어떤 대답이라도 받아 들여진 것처럼 ... – Yahia

3

두 개의 별도 블록으로 처리해야합니다.

번째 블록은 :

begin 
... 
end; 
/

슬래시은 버퍼가 DBMS에 전송되고 평가되어야 함을 나타낸다. PL/SQL 코드가 끝나고 평가가 시작될 수있는 위치를 나타냅니다.

그런 다음 다음 :

declare 
... 
begin 
... 
end; 
/

따라서, 당신은 : 그것은 SQL * Plus를 SQLDeveloper에서 작동

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

.

관련 문제