IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Oracle Discussion :

[Oracle 9] Problème SQL dynamique


Sujet :

Oracle

  1. #1
    Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 112
    Points : 62
    Points
    62
    Par défaut [Oracle 9] Problème SQL dynamique
    Bonjour,

    pour récupérer un curseur en paramètre de sortie dans ma procédure stockée j'ai créé un code dynamique.

    Ma première version était la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    CREATE OR REPLACE PROCEDURE PS_GET_DETAILS_LOCALISATION
    (NOM_TABLE IN VARCHAR2,
    ID_TABLE IN VARCHAR2,
    io_cursor IN OUT LP_LOCALISATION.C_ST_LOCALISATION )
    AS
    BEGIN
    OPEN io_cursor FOR
    SELECT ID, CODE, DESI FROM aii.VW_LOCALISATION_UP
    WHERE ID = TO_NUMBER(ID_TABLE);
    END;
    /
    Show errors
    Avec le test suivant pas de problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    SET SERVEROUTPUT ON;  
    DECLARE  
            CUR LP_LOCALISATION.C_ST_LOCALISATION;  
            rec VW_LOCALISATION_UP%ROWTYPE ;  
    BEGIN  
            PS_GET_DETAILS_LOCALISATION('UP','174',CUR);  
            LOOP  
                    FETCH CUR INTO rec ;  
                    EXIT 
            WHEN CUR%NOTFOUND ;  
                    dbms_output.put_line( rec.ID || ' ' ||rec.CODE ) ;  
            END LOOP ;  
            CLOSE CUR ;  
    END;
    Maintenant si je créé mon curseur dynamiquement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    CREATE OR REPLACE PROCEDURE PS_GET_DETAILS_LOCALISATION
    (NOM_TABLE IN VARCHAR2,
    ID_TABLE IN VARCHAR2,
    io_cursor IN OUT LP_LOCALISATION.C_ST_LOCALISATION )
    AS
     
    vlStr	VARCHAR2(500) ;
    BEGIN
     
    vlStr := ' OPEN io_cursor FOR ' ;
    vlStr := vlStr || ' SELECT ID, CODE, DESI ' ;
    vlStr := vlStr || ' FROM aii.VW_LOCALISATION_' || NOM_TABLE ;
    vlStr := vlStr || ' WHERE ID = TO_NUMBER(' || ID_TABLE || ')' ;
     
    DBMS_UTILITY.EXEC_DDL_STATEMENT(vlStr);
    END;
    /
    Show errors
    La procédure compile mais mon test ne passe plus et ressort avec l'erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    DECLARE
    *
    ERREUR à la ligne 1 :
    ORA-00900: Instruction SQL non valide
    ORA-06512: à "SYS.DBMS_SYS_SQL", ligne 826
    ORA-06512: à "SYS.DBMS_SQL", ligne 32
    ORA-06512: à "SYS.DBMS_UTILITY", ligne 550
    ORA-06512: à "AII.PS_GET_DETAILS_LOCALISATION", ligne 15
    ORA-06512: à ligne 5
    Merci par avance de votre aide.

  2. #2
    Membre expert
    Avatar de bouyao
    Inscrit en
    Janvier 2005
    Messages
    1 778
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 778
    Points : 3 033
    Points
    3 033
    Par défaut
    Bonjour,

    Ca peut être un problème de privilège :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grant select on aii.VW_LOCALISATION_UP to utilisateur
    utilisateur : c'est le nom de ton utilisateur qui execute la procedure

  3. #3
    Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 112
    Points : 62
    Points
    62
    Par défaut
    Bonjour,
    ben j'ai bien peur que non puisque je suis connectée en tant qu'admistrateur de la base, en tant que AII justement.

  4. #4
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    Etes-vous sûr que DBMS_UTILITY.EXEC_DDL_STATEMENT soit la bonne fonction pour ouvrir un curseur
    pour moi, DDL a toujours voulu dire Data Description Language...
    Rédacteur Oracle (Oracle ACE)
    Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
    Je ne réponds pas aux questions techniques par MP
    Blogs: Forms-PL/SQL-J2EE - Forms Java Beans

  5. #5
    Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 112
    Points : 62
    Points
    62
    Par défaut
    Ben justement non je ne suis pas sûre que ce soit la bonne méthode.
    Si j'essaie avec execute immediate il me retourne l'erreur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    DECLARE
    *
    ERREUR à la ligne 1 :
    ORA-00900: Instruction SQL non valide
    ORA-06512: à "AII.PS_GET_DETAILS_LOCALISATION", ligne 15
    ORA-06512: à ligne 5

  6. #6
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    Essayez plutôt cette syntaxe:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    DECLARE
      cur SYS_REFCURSOR ;
      req VARCHAR2(2000) ;
      var EMP%ROWTYPE ;
    BEGIN  
      req := 'select * from emp' ;
      OPEN cur FOR req ;
      LOOP
        FETCH cur INTO var ;
    	EXIT WHEN cur%NOTFOUND ;
    	dbms_output.put_line( 'ename = ' || var.ENAME ) ;
      END LOOP ;
      CLOSE cur ;
    END;
    Rédacteur Oracle (Oracle ACE)
    Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
    Je ne réponds pas aux questions techniques par MP
    Blogs: Forms-PL/SQL-J2EE - Forms Java Beans

  7. #7
    Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 112
    Points : 62
    Points
    62
    Par défaut
    J'avais déjà essayé de la façon suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    SET SERVEROUTPUT ON;   
    DECLARE   
            io_cursor LP_LOCALISATION.C_ST_LOCALISATION;   
            rec VW_LOCALISATION_UP%ROWTYPE ;   
    begin   
            --PS_GET_DETAILS_LOCALISATION('UP','174',io_cursor);   
            OPEN io_cursor FOR SELECT ID, CODE, DESI FROM VW_LOCALISATION_UP WHERE ID = TO_NUMBER(174);   
            LOOP   
                    FETCH io_cursor INTO rec ;   
                    EXIT   
            WHEN io_cursor%NOTFOUND ;   
                    dbms_output.put_line( rec.ID || ' ' ||rec.CODE ) ;   
            END LOOP ;   
            CLOSE io_cursor ;   
    END;
    Où OPEN io_cursor FOR SELECT ID, CODE, DESI FROM VW_LOCALISATION_UP WHERE ID = TO_NUMBER(174); correspond à la valeur de vlStr dans ma PS.

    Cela fonctionne très bien mais je ne teste pas ma PS en fait.

  8. #8
    Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 112
    Points : 62
    Points
    62
    Par défaut
    En fait je suis en train de réaliser des pages d'un site Web avec VS 2005, qui doit fonctionner aussi bien avec Oracle que SqlServer 2005 et je souhaite remplir mes grilles de données avec des procédures stockées, des vues, ...
    Je ne rencontre aucun problème avec Sql Server pour qui j'ai créé la PS suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    CREATE PROCEDURE [PS_GET_DETAILS_LOCALISATION]
    @nomTable VARCHAR(50),
    @id VARCHAR(50)
    AS
     
    DECLARE @REQUETE VARCHAR(4000)
     
    SET @REQUETE =	'SELECT ID, CODE, DESI ' +
    ' FROM aii.VW_LOCALISATION_' + @nomTable +
    ' WHERE ID = ' + @id
     
    EXEC(@REQUETE)
     
    GO

  9. #9
    Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 112
    Points : 62
    Points
    62
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    CREATE OR REPLACE PROCEDURE PS_GET_DETAILS_LOCALISATION
    (NOM_TABLE IN VARCHAR2,
    ID_TABLE IN VARCHAR2,
    IO_CURSOR IN OUT SYS_REFCURSOR)
    AS
     
    vlStr	VARCHAR2(500) ;
    BEGIN
    vlStr := 'SELECT ID, CODE, DESI ' ;
    vlStr := vlStr || ' FROM VW_LOCALISATION_' || NOM_TABLE ;
    vlStr := vlStr || ' WHERE ID = TO_NUMBER(' || ID_TABLE || ')' ;
     
    OPEN IO_CURSOR FOR vlStr;
     
    END;

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème SQL dynamique
    Par samoussa dans le forum PL/SQL
    Réponses: 2
    Dernier message: 15/05/2009, 14h04
  2. Oracle 8 : Problème SQL
    Par davy.g dans le forum Oracle
    Réponses: 2
    Dernier message: 26/07/2007, 16h36
  3. [Oracle 9i] Bind variables et sql dynamique
    Par jld_33 dans le forum Oracle
    Réponses: 17
    Dernier message: 09/06/2006, 11h49
  4. Réponses: 3
    Dernier message: 23/05/2006, 15h09
  5. Réponses: 4
    Dernier message: 30/01/2005, 14h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo