2009-12-21 5 views
7

Je veux déclarer un curseur sur une table qui n'existe pas. Bien sûr, ma procédure ne compile pas.Oracle PLSQL - Déclare un curseur sur une table inexistante

Cette table est une table temporaire créée par un pré-traitement. Il existera à l'exécution, mais au moment de la compilation, c'est une autre histoire.

Pour ma sélection/met à jour une autre opération DML, je l'ai utilisé

EXECUTE IMMEDIATE 'operation from tmp_table'

mais je ne peux pas trouver une solution de contournement pour les curseurs.

Y a-t-il un moyen?

Fondamentalement, je veux que cela compiler

drop table test; 

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

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

mise à jour

Jusqu'à présent, pas la compilation:

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 

devez utiliser CREATE PROCEDURE, merci.

Merci d'avance.

+0

Vous obtenez l'exception puisque vous exécutez en fait le code. Remplacez votre 'declare' par un' CREATE PROCEDURE test_cursor AS' pour compiler le code. –

+0

: facepalm 15cccc – Tom

+0

TOAD n'a pas de bouton de compilation. : S Cela devrait être trivial !!! – Tom

Répondre

7

Vous devriez être en mesure de définir votre curseur comme ceci:

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

Vous pouvez également lier des arguments:

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

Pour plus d'informations, consultez la documentation Oracle du OPEN-FOR Statement.

Exemple en utilisant une procédure stockée

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

Merci, mais dual est une table existante. pas table existante au moment de l'exécution. il y a faute de frappe – Tom

+0

, son temps de compilation. – Tom

+0

Je ne suis pas sûr de ce que vous voulez dire. vous pouvez également modifier la source fournie par 'SELECT * FROM some_not_existing_table. Il compilera bien et briser lors de l'exécution si le table n'existe pas encore. –

3

Vous pouvez utiliser DBMS_SQL pour obtenir encore plus de flexibilité que la méthode du curseur ref décrit par Peter Lang. Mais cela signifie aussi plus de travail.

5

Création de tables temporaires au besoin est généralement pas considéré comme une bonne pratique dans Oracle, où les tables temporaires globales sont meilleures et ne causeraient pas ce problème

+0

Je vais garder cela à l'esprit, mais le temps presse. Peut-être la prochaine fois. – Tom

+1

+1 Les tables temporaires globales sont tellement mieux que créer/détruire des tables à la volée. Créer des tables à la volée est beaucoup plus sujet aux erreurs et plus difficile à maintenir. –

Questions connexes