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

SQL Oracle Discussion :

[Oracle 8.1.7] Requête dynamique


Sujet :

SQL Oracle

  1. #1
    Futur Membre du Club
    Inscrit en
    Décembre 2007
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 15
    Points : 6
    Points
    6
    Par défaut [Oracle 8.1.7] Requête dynamique
    J'ai effectué plusieurs recherches ici et sur google, et il semblerait que la fonction "EXECUTE IMMEDIATE" ne soit pas gérée par cette version d'Oracle. Cette fonction semble remplacer le package DBMS_SQL des versions antérieures à la 9. Seulement je ne trouve pas l'équivalent à utiliser.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    REQ_TABLE := 'SELECT ID FROM INSTANCE.'||NOM_TABLE;
    EXECUTE IMMEDIATE REQ_TABLE;
    Je cherche juste à exécuter un SELECT sur une table dont j'aurais récupéré le nom en amont dans un curseur, et je me fais jeter par mon serveur SQL.

  2. #2
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Si, ça existe déjà en 8i. Ce serait quand même plus malin de nous donner l'erreur en question et lire l'article concernant le EXECUTE IMMEDIATE pour savoir comment récupérer le résultat

  3. #3
    Futur Membre du Club
    Inscrit en
    Décembre 2007
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 15
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par orafrance Voir le message
    Si, ça existe déjà en 8i. Ce serait quand même plus malin de nous donner l'erreur en question et lire l'article concernant le EXECUTE IMMEDIATE pour savoir comment récupérer le résultat
    J'ai lu la doc, après j'ai surement mal compris ce que j'ai lu mais j'ai au moins fait l'effort de la regarder.

    L'erreur en question :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SQL> @curseur_tables;
            EXECUTE IMMEDIATE REQ_TABLE;
                    *
    ERROR at line 20:
    ORA-06550: line 20, column 10:
    PLS-00103: Encountered the symbol "IMMEDIATE" when expecting one of the
    following:
    := . ( @ % ;

  4. #4
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    c'est trop demandé d'avoir le code complet ?

  5. #5
    Invité
    Invité(e)
    Par défaut
    execute immediate, c'est du pl*sql pas du sql.
    Si tu veux le lancer par SQL*Plus, il te faut déjà faire ça dans un bloc pl/sql.

    Pour la suite voir : http://sheikyerbouti.developpez.com/execute_immediate/

  6. #6
    Futur Membre du Club
    Inscrit en
    Décembre 2007
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 15
    Points : 6
    Points
    6
    Par défaut
    Je sais bien que tu rends service à pas mal de monde sur le forum (je viens souvent ici pour lire sans poster) mais un poil d'aimabilité en plus ne serait pas pour me déplaire

    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
    20
    DECLARE
    	CURSOR LISTE_TABLE_CUR IS 
    	SELECT TABLE_NAME FROM SYS.DBA_TAB_COLUMNS Vw 
    		WHERE TABLE_NAME 
    		LIKE '_DATA' 
    		AND OWNER = 'INSTANCE' 
    		AND COLUMN_NAME = 'ID';
    	NOM_TABLE VARCHAR2(80);
    	REQ_TABLE VARCHAR2(512);
    BEGIN
    	OPEN LISTE_TABLE_CUR;
    	LOOP
    		FETCH LISTE_TABLE_CUR INTO NOM_TABLE;
    		EXIT WHEN LISTE_TABLE_CUR%NOTFOUND;
    		DBMS_OUTPUT.PUT_LINE(nom_table);
    	        REQ_TABLE := 'ID FROM INSTANCE.'||NOM_TABLE;
    		EXECUTE IMMEDIATE REQ_TABLE;	
    	END LOOP;
    	CLOSE LISTE_TABLE_CUR;
    END;

  7. #7
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Citation Envoyé par CrazyLiam Voir le message
    Je sais bien que tu rends service à pas mal de monde sur le forum (je viens souvent ici pour lire sans poster) mais un poil d'aimabilité en plus ne serait pas pour me déplaire
    Je veux bien être aimable mais un minimum d'effort dans la complétude des informations nous ferait gagner un temps précieux

    T'es bien sûr d'être en 8i ? Tu peux essayer en commentant EXECUTE IMMEDIATE STP ?

  8. #8
    Futur Membre du Club
    Inscrit en
    Décembre 2007
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 15
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par orafrance Voir le message
    T'es bien sûr d'être en 8i ? Tu peux essayer en commentant EXECUTE IMMEDIATE STP ?
    Sans le EXECUTE IMMEDIATE ça marche.

    Je viens de vérifier la version : comme j'utilisais SQL*PLUS 8.1.7 je pensais que j'étais dans cette version mais en fait je suis en 8.0.5.1.0

    Je viens de débarquer ici il y'a une semaine, et on m'a pas filé toutes les informations....

  9. #9
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    il y a effectivement une erreur. Pour débugger, affiche ce que EXECUTE IMMEDIATE est sensé exécuter, ça devrait t'aider à répondre à la question

  10. #10
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    REQ_TABLE := 'SELECT ID FROM INSTANCE.'||NOM_TABLE
    à la place du
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    REQ_TABLE := 'ID FROM INSTANCE.'||NOM_TABLE

  11. #11
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Citation Envoyé par CrazyLiam Voir le message
    Je viens de vérifier la version : comme j'utilisais SQL*PLUS 8.1.7 je pensais que j'étais dans cette version mais en fait je suis en 8.0.5.1.0
    donc EXECUTE IMMEDIATE n'est probablement pas dispo

  12. #12
    Futur Membre du Club
    Inscrit en
    Décembre 2007
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 15
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par orafrance Voir le message
    donc EXECUTE IMMEDIATE n'est probablement pas dispo
    En gros ça va être la galère si je résume bien

  13. #13
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    DBMS_SQL n'est pas si horrible... y'a juste à détailler les 3 phases : parse, execute et fetch

  14. #14
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073

  15. #15
    Futur Membre du Club
    Inscrit en
    Décembre 2007
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 15
    Points : 6
    Points
    6
    Par défaut
    Merci, je vais regarder ça en détail

  16. #16
    Futur Membre du Club
    Inscrit en
    Décembre 2007
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 15
    Points : 6
    Points
    6
    Par défaut
    Ca fait 3 heures que je suis dessus et je n'arrive à rien de satisfaisant :

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    SET serveroutput on;
    DECLARE
    	CURSOR LISTE_TABLE_CUR IS 
    	SELECT TABLE_NAME FROM SYS.DBA_TAB_COLUMNS Vw 
    		WHERE TABLE_NAME 
    		LIKE '_DATA' 
    		AND OWNER = 'INSTANCE' 
    		AND COLUMN_NAME = 'ID';
    	NOM_TABLE VARCHAR2(80);
     
    	REQ_TABLE VARCHAR2(512);
    	req_cur INTEGER;
    	row_processed INTEGER;
    	cas_id VARCHAR(25);
     
    BEGIN
    	DBMS_OUTPUT.ENABLE(1000000);
    	OPEN LISTE_TABLE_CUR;
    	LOOP
    		FETCH LISTE_TABLE_CUR INTO NOM_TABLE;
    		EXIT WHEN LISTE_TABLE_CUR%NOTFOUND;
    		DBMS_OUTPUT.PUT_LINE(nom_table);
     
    		REQ_TABLE := 'SELECT ID FROM INSTANCE.'||NOM_TABLE;
    		DBMS_OUTPUT.PUT_LINE(REQ_TABLE);
    		REQ_CUR := dbms_sql.open_cursor;
    		dbms_sql.parse(REQ_CUR, REQ_TABLE,dbms_sql.native);
    		DBMS_SQL.DEFINE_COLUMN(req_cur,1,cas_id);
    		row_processed := dbms_sql.execute(REQ_CUR);
    		LOOP
    			IF DBMS_SQL.FETCH_ROWS (req_cur) > 0
    			THEN
    			DBMS_SQL.COLUMN_VALUE(req_cur,1,cas_id);
    			DBMS_OUTPUT.PUT_LINE(cas_id);
    			END IF;
    		END LOOP;
    		DBMS_SQL.CLOSE_CURSOR(req_cur);
    	END LOOP;
    	CLOSE LISTE_TABLE_CUR;
    END;
    J'obtiens ça comme erreur :
    SQL> @curseur_tables;
    DBMS_SQL.DEFINE_COLUMN(req_cur,1,cas_id);
    *
    ERROR at line 30:
    ORA-06550: line 30, column 3:
    PLS-00307: too many declarations of 'DEFINE_COLUMN' match this call
    ORA-06550: line 30, column 3:
    PL/SQL: Statement ignored
    J'imagine que c'est un problème de PARSE mais je vois pas où.

  17. #17
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    mets la ligne DEFINE_COLUMN en commentaire STP

  18. #18
    Futur Membre du Club
    Inscrit en
    Décembre 2007
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 15
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par orafrance Voir le message
    mets la ligne DEFINE_COLUMN en commentaire STP
    J'obtiens cette erreur :

    SQL> @curseur_tables;
    TABLE_DATA
    SELECT ID FROM INSTANCE.TABLE_DATA
    DECLARE
    *
    ERROR at line 1:
    ORA-01002: fetch out of sequence
    ORA-06512: at "SYS.DBMS_SYS_SQL", line 792
    ORA-06512: at "SYS.DBMS_SQL", line 333
    ORA-06512: at line 33

  19. #19
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    faut peut-être une sortie dans ta boucle LOOP... on va quand même pas débugger à ta place

Discussions similaires

  1. [pb requête sql] Requête dynamique
    Par viny dans le forum PostgreSQL
    Réponses: 6
    Dernier message: 15/09/2005, 12h31
  2. Erreur de conversion et requête dynamique dans une procédure
    Par franculo_caoulene dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 01/08/2005, 15h12
  3. [ADO.Net][C#/Oracle] Comment utiliser une requête paramètrée ?
    Par kaboume dans le forum Accès aux données
    Réponses: 4
    Dernier message: 05/07/2005, 14h50
  4. [Procs stockées] [Débutant] Requête dynamique
    Par stailer dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 25/04/2005, 14h29
  5. Requête dynamique en pagination
    Par pascal_fluck@hotmail.com dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 30/03/2005, 16h04

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