2016-06-26 2 views
0
create or replace procedure p1(p_deptno in number) 
is 
type t is table of emp%rowtype 
index by binary_integer; 
v_emp t; 
begin 
execute immediate 'create table test as select * from emp where ename is null'; 
select * bulk collect into v_emp from emp where deptno=p_deptno; 
for i in v_emp.first..v_emp.last 
loop 
insert into test(empno, ename, job, mgr, hiredate, sal, comm, deptno) values (v_emp(i).empno, v_emp(i).ename, v_emp(i).job, v_emp(i).mgr, v_emp(i).hiredate, v_emp(i).sal, v_emp(i).comm, v_emp(i).deptno); 
end loop; 
exception 
when value_error then 
dbms_output.put_line('Give proper deptno'); 
end p1; 
/

나는이 오류가 무엇입니까 :테이블에 데이터를 삽입하는 방법. 하지만 런타임에 테이블을 만드는 것이 가능할까요?

PL/SQL: SQL Statement ignored
PL/SQL: ORA-00942: table or view does not exist

+1

이것이 유효한 검색어입니까? ''select * from emp에서 테이블 테스트를 생성합니다. 여기서 ename은 null입니다 ';'저장 프로 시저에서 실행하려고 시도 했습니까? –

+0

런타임에 테이블을 만들고 런타임시에 프로 시저와 동적 SQL을 사용하여 테이블에 데이터를 삽입하려고한다고 가정합니다. –

+0

가능하지만 코드가 작동하는지 확인해야합니다. –

답변

2

당신이 삽입을 수행하는 동적 SQL을 사용해야합니다 런타임에 테이블을 만드는 경우. 또 다른 문제점은 데이터를 인 메모리 테이블에 빨아 들인 다음 삽입을 하나씩 수행한다는 것입니다. 당신은 여전히 ​​하나씩 동적 SQL을 사용하여 삽입을 할 수

create or replace procedure p1(p_deptno in number) is 
    type t is table of emp%rowtype 
    index by binary_integer; 
    v_emp t; 
begin 
    execute immediate 'create table test as select * from emp where ename is null'; 

    execute immediate 
    'insert into test 
     select * 
     from emp 
     where deptno = :1' USING p_deptno; 
exception 
    when value_error then 
    dbms_output.put_line('Give proper deptno'); 
end p1; 

, 그러나 그것은 시간과 노력의 낭비처럼 보인다 : 내가 좋아하는 뭔가를 제안한다.

행운을 빈다.

+0

동적 'insert' 문에서 바인드 변수를 사용하지 않는 이유는 무엇입니까? –

+0

@JustinCave - 좋은 아이디어 ... –

0

Oracle에서 저장 프로 시저를 만들 때 해당 저장 프로 시저의 모든 참조 된 개체 (사례 테이블 "test"및 "emp")는 컴파일 할 때 참조 된 개체의 적절한 부여/소유권에 대해 미리 검사됩니다. "테스트"개체가 컴파일 타임에 존재하지 않으므로 자연적으로 저장 프로 시저의 소유자에게 적절한 권한/소유권이 없으며 지정한 오류가 발생합니다. 상황을 해결하려면 @Bob Jarvis가 명시한 것처럼 "EXECUTE IMMEDIATE"문에 insert 문을 넣을 수 있습니다. 이렇게하면 컴파일 타임에 검사가 수행되지 않고 런타임에 객체가 런타임에 생성되기 때문에 검사가 성공합니다 적절한 보조금/소유권과 함께 존재합니다.

execute immediate 'insert into test select * from emp where deptno = '|| p_deptno; 
관련 문제