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 :

Créer une vue avec du SQl dynamique


Sujet :

Oracle

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2006
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Créer une vue avec du SQl dynamique
    Bonjour,
    Je dois rédiger une procedure avec du sql dynamique qui génére une vue avec un SELECT où les paramtres de la clause WHERE sont précisés au moment de l'éxécution et je suis complétement bloquée est ce que quelqu'un pourrait m'aider.THANKS

  2. #2
    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
    "... au moment de l'exécution..."
    de l'exécution de la création de la vue ou de l'ordre SELECT sur cette vue ?
    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

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2006
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    De la création de la vue

  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
    Et bien il faut constituer l'ordre de création dans une chaine de caractères et utiliser ensuite l'instruction execute immediate (qui ne fonctionne que coté serveur)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Declare
      sql_order  Varchar2(4000) ;
    Begin
      sql_order := 'CREATE OR REPLACE VIEW ...' ;
      sql_order := sql_order || ' where ...' ;
      execute immediate sql_order ;
    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

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    à mon avis c'est plutôt une fonction qui retourne un REF_CURSOR qui serait adapté

  6. #6
    Nouveau Candidat au Club
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2006
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    J'ai essaye de faire ceci et ca marche:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    CREATE PROCEDURE COMMISSION_PAYS (i_PAYS IN VARCHAR2)
    AS
    STMT_STR VARCHAR2(2000); 
    WHERE_CLAUSE VARCHAR2(200); 
    BEGIN
    STMT_STR :='SELECT * FROM COMMISSION';
    WHERE_CLAUSE :=' WHERE CODEPAYS =:1';
     IF i_PAYS = NULL THEN 
      WHERE_CLAUSE = NULL; 
     END IF;
    EXECUTE IMMEDIATE (STMT_STR ||WHERE_CLAUSE)
             USING i_PAYS;
    END;
    Mais quand je transforme STMT_STR en STMT_STR := 'CREATE VIEW COMMISSION_PAYS AS SELECT * FROM COMMISSION'
    ça ne marche plus. est ce que quelqu'un pourrait m'aider.
    thanks.

  7. #7
    Membre habitué
    Inscrit en
    Septembre 2006
    Messages
    142
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 142
    Points : 170
    Points
    170
    Par défaut
    Pour créer des objets il faut utilisé le package DBMS_SQL.
    DBA ORACLE

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    merci de penser aux balises à l'avenir

    Arturius -> EXECUTE IMMEDIATE remplace DBMS_SQL

  9. #9
    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
    Je ne pense pas que les bind variable (=:1') soient prises en compte dans le ordres du DDL comme CREATE VIEW par example.
    Il vous faut constituer la requête dans la chaine de caractères:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     IF i_PAYS IS NOT NULL THEN 
       WHERE_CLAUSE :=' WHERE CODEPAYS =''' || i_PAYS || '''';
     END IF;
    EXECUTE IMMEDIATE (STMT_STR ||WHERE_CLAUSE) ;
    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

  10. #10
    Membre éprouvé
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Points : 1 294
    Points
    1 294
    Par défaut
    Citation Envoyé par SheikYerbouti
    Je ne pense pas que les bind variable (=:1') soient prises en compte dans le ordres du DDL
    Moi je suis sur que non!

    Les variables bind servent à optimiser l'execution de requête SQL (réutilisation des compilatons existantes etc...), le DDL est un tout autre processus...

  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 : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    il faut concaténer les valeurs c'est bien ça ?

  12. #12
    Membre éprouvé
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Points : 1 294
    Points
    1 294
    Par défaut
    Citation Envoyé par Fred_D
    il faut concaténer les valeurs c'est bien ça ?
    Oui, un DDL, c'est une bête commande qui ne supporte pas de paramètre (enfin pour ce que j'en ai vu jusqu'a présent....)

  13. #13
    Nouveau Candidat au Club
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2006
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Merci à tous pour vos réponses mais ça ne marche toujours pas.
    Je crois que je vais garder le premier code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    CREATE PROCEDURE COMMISSION_PAYS (i_PAYS IN VARCHAR2)
    AS
    STMT_STR VARCHAR2(2000); 
    WHERE_CLAUSE VARCHAR2(200); 
    BEGIN
    STMT_STR :='SELECT * FROM COMMISSION';
    WHERE_CLAUSE :=' WHERE CODEPAYS =:1';
     IF i_PAYS = NULL THEN 
      WHERE_CLAUSE = NULL; 
     END IF;
    EXECUTE IMMEDIATE (STMT_STR ||WHERE_CLAUSE)
             USING i_PAYS;
    END;
    Est ce quelqu'un saurait comment afficher le résultats de la sélection (les lignes sélectionnées).
    Merci

  14. #14
    Membre éprouvé
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Points : 1 294
    Points
    1 294
    Par défaut

    ben si te lis pas ce qu'on écrit...

    Ce code ne peux pas fonctionner, il faut que tu concatène comme le disait SheikYerbouti.

    Si ça ne marche pas, c'est surement qu'il y a une petite erreur qui s'est glissé dans la génération automatique du DDL (il y a toujours une erreur qui se glisse dans ce genre de chose.... )

    Pour débuguer, il faut que tu concatène toute ta chaine dans une variable, et avant de faire l'EXECUTE, il faut que tu trace cette variable (soit par dmbs_output, soit en l'insérant dans une table de traces...)

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    et puis c'est quoi l'intérêt de générer une vue dynamique... quand on peut passer par du SQL dynamique ??? Pour rappel, la vue c'est qu'une requête SQL stockée

    Plus je lis ce sujet moins j'en comprends l'intérêt

  16. #16
    Membre éprouvé
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Points : 1 294
    Points
    1 294
    Par défaut
    Effectivement ça tourne au loufoque l'histoire...

    Si le but est de faire une requête qui ramène un filtrage sur un pays ou bien le contenu entier de la table lorsque ce pays est null pourquoi ne pas faire un truc du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT * FROM COMMISSION 
     WHERE ( CODEPAYS = <pays> or <pays> is null)
    Apres c'est une autre affaire que de vouloir mettre le resultat dans un curseur passé en paramètre...

    En fait, il manque le contexte, applicativement, c'est quoi le but? c'est pour insérer dans quel programme? pour obtenir quel resultat ? dans quelle interface utilisateur ? etc...

    Peut etre qu'on pourra répondre plus simplement en sachant ça...

Discussions similaires

  1. Créer une vue avec un champ Blob
    Par Taoueret dans le forum SQL
    Réponses: 4
    Dernier message: 16/05/2008, 16h18
  2. Créer une vue avec une image au format postscript *.eps
    Par pobsteta dans le forum SWT/JFace
    Réponses: 2
    Dernier message: 22/11/2007, 15h12
  3. Impossible de créer une vue avec un champ spatial
    Par M Roncheau dans le forum SQL
    Réponses: 2
    Dernier message: 24/08/2007, 09h11
  4. Créer une vue avec des onglets
    Par Flackou dans le forum MFC
    Réponses: 2
    Dernier message: 14/06/2007, 11h43
  5. Créer une vue avec des requêtes UNION ?
    Par webtheque dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 04/04/2005, 12h37

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