2009-12-21 3 views
7

Ich möchte einen Cursor auf eine Tabelle deklarieren, die nicht vorhanden ist. Natürlich kompiliert meine Prozedur nicht.Oracle PLSQL - Deklarieren Sie einen Cursor auf eine nicht vorhandene Tabelle

Diese Tabelle ist eine temporäre Tabelle und wird von einem Vorprozess erstellt. Es wird zur Laufzeit existieren, aber zur Kompilierzeit ist es eine andere Geschichte.

Für meine select/aktualisiert eine andere Operationen DML, ich

EXECUTE IMMEDIATE 'operation from tmp_table'

verwendet habe, aber ich kann nicht eine Lösung für Cursor finden.

Gibt es einen Weg?

Grundsätzlich möchte ich diese

drop table test; 

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

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

Update

Bisher nicht kompilieren kompilieren:

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 

verwenden CREATE PROCEDURE Sollte Dank.

Vielen Dank im Voraus.

+0

Sie erhalten die Ausnahme, da Sie tatsächlich den Code ausführen. Ersetzen Sie Ihr 'declare' durch ein' CREATE PROCEDURE test_cursor AS', um den Code zu kompilieren. –

+0

: facepalm 15cccc – Tom

+0

TOAD hat keine Kompilier-Taste. : S Das sollte trivial sein !!! – Tom

Antwort

7

sollten Sie in der Lage sein, den Cursor wie folgt zu definieren:

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

Sie auch Argumente binden:

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

Für weitere Informationen, um die Oracle-Dokumentation des OPEN-FOR Statement sehen.

Beispiel eine gespeicherte Prozedur

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

Danke, aber Dual ist eine vorhandene Tabelle. Ich muss das für eine tun nicht existierende Tabelle zur Laufzeit – Tom

+0

Tippfehler dort, seine Kompilierzeit – Tom

+0

Ich bin mir nicht sicher, was du meinst.Sie ​​können die bereitgestellte Quelle auch mit 'SELECT * FROM some_not_existing_table' ändern.Es wird gut kompiliert und bricht zur Laufzeit ab, wenn Die Tabelle existiert immer noch nicht –

3

Sie können DBMS_SQL mit verwenden noch mehr Flexibilität als der Ref Cursor-Methode von Peter Lang beschrieben zu erhalten. Aber es bedeutet auch mehr Arbeit.

5

Erstellen von temporären Tabellen in der Regel nicht erforderlich ist gute Praxis in Oracle betrachtet, wo globalen temporären Tabellen besser und würden dieses Problem nicht verursachen

+0

Ich behalte das im Hinterkopf, aber die Zeit ist kurz. Vielleicht nächstes Mal. – Tom

+1

+1 Globale temporäre Tabellen sind so viel besser als das Erstellen/Löschen von Tabellen im laufenden Betrieb. Das Erstellen von Tabellen im laufenden Betrieb ist viel fehleranfälliger und schwieriger zu warten. –

Verwandte Themen