2009-12-21 5 views
7

존재하지 않는 테이블에 커서를 선언하고 싶습니다. 물론, 내 프로 시저가 컴파일되지 않습니다.Oracle PLSQL - 존재하지 않는 테이블에 커서 선언

이 테이블은 임시 테이블이며 사전 프로세스로 생성됩니다. 그것은 런타임에 존재하지만, 컴파일 타임에 또 다른 이야기. 내 선택에 대한

는/내가

EXECUTE IMMEDIATE 'operation from tmp_table'

을 사용했습니다하지만 난 커서에 대한 해결 방법을 찾을 수없는, 타 DML 작업을 업데이트합니다.

방법이 있습니까?

SQL> declare 
    2 c sys_refcursor; 
    3 BEGIN 
    4 open c for 'select * from pepito'; -- 'pepito' does not exist 
    5 close c; 
    6 end; 
    7/
declare 
* 
ERROR at line 1: 
ORA-00942: table or view does not exist 
ORA-06512: at line 4 

가, 감사 CREATE PROCEDURE에 사용해야합니다

는 기본적으로, 나는이

drop table test; 

/*from this on should compile*/ 
DECLARE 
cursor c is select * from test; 

BEGIN 
    for reg in c LOOP 
    /*...*/ 
    END LOOP; 
END; 

갱신 지금까지 컴파일하지

를 컴파일합니다.

미리 감사드립니다.

+0

발생하지 것이다 오라클, 좋은 실례로 간주되지 않습니다. 'declare'를'CREATE PROCEDURE test_cursor AS'로 바꾸어 코드를 컴파일하십시오. –

+0

: facepalm 15cccc – Tom

+0

TOAD에는 컴파일 버튼이 없습니다. : S 이것은 사소한 일입니다! – Tom

답변

7

이 같은 커서를 정의 할 수 있어야한다 : 또한 인수를 결합 할 수

DECLARE 
    c SYS_REFCURSOR; 
BEGIN 
    OPEN c FOR 'SELECT * FROM dual'; 
    CLOSE c; 
END; 

: 자세한 내용은 OPEN-FOR Statement의 Oracle 설명서를 참조하십시오

OPEN c FOR 'SELECT * FROM dual WHERE DUMMY = :1' USING 'X'; 

하십시오. 저장 프로 시저

CREATE OR REPLACE PROCEDURE test IS 
    c SYS_REFCURSOR; 
BEGIN 
    OPEN c FOR 'SELECT * FROM fdfdfdfdfd'; 
    CLOSE c; 
END; 
/
+0

감사하지만 이중 테이블은 기존 테이블입니다. 런타임에 기존 테이블이 없습니다. – Tom

+0

오타가 있습니다. 컴파일 시간은 – Tom

+0

입니다. 의미가 확실하지 않습니다. 'SELECT * FROM some_not_existing_table'을 사용하여 제공된 소스를 변경할 수도 있습니다. 테이블이 여전히 존재하지 않습니다. –

3

를 사용

예 당신은 피터 랭 설명 심판 커서 방법보다 더 많은 유연성을 얻을 수 DBMS_SQL을 사용할 수 있습니다. 그러나 그것은 더 많은 일을 의미합니다. 필요에 따라 임시 테이블을 생성

5

일반적으로 글로벌 임시 테이블이 더 나은 당신이 실제로 코드를 실행하기 때문에 당신은 예외가이 문제

+0

마음에두고 있지만 시간은 짧습니다. 아마 다음 번에. – Tom

+1

+1 글로벌 임시 테이블은 즉시 테이블을 생성/삭제하는 것보다 훨씬 낫습니다. 즉석에서 테이블을 생성하는 것은 오류가 발생하기 쉽고 유지 관리가 더 어려워집니다. –

관련 문제