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
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
de l'exécution de la création de la vue ou de l'ordre SELECT sur cette vue ?"... au moment de l'exécution..."
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
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
à mon avis c'est plutôt une fonction qui retourne un REF_CURSOR qui serait adapté![]()
J'ai essaye de faire ceci et ca marche:
Mais quand je transforme STMT_STR en STMT_STR := 'CREATE VIEW COMMISSION_PAYS AS SELECT * FROM COMMISSION'
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;
ça ne marche plus. est ce que quelqu'un pourrait m'aider.
thanks.
Pour créer des objets il faut utilisé le package DBMS_SQL.
DBA ORACLE
merci de penser aux balises à l'avenir![]()
Arturius -> EXECUTE IMMEDIATE remplace DBMS_SQL![]()
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
Moi je suis sur que non!Envoyé par SheikYerbouti
![]()
Les variables bind servent à optimiser l'execution de requête SQL (réutilisation des compilatons existantes etc...), le DDL est un tout autre processus...
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....)Envoyé par Fred_D
Merci à tous pour vos réponses mais ça ne marche toujours pas.
Je crois que je vais garder le premier code
Est ce quelqu'un saurait comment afficher le résultats de la sélection (les lignes sélectionnées).
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;
Merci
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...)
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![]()
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:
Apres c'est une autre affaire que de vouloir mettre le resultat dans un curseur passé en paramètre...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 SELECT * FROM COMMISSION WHERE ( CODEPAYS = <pays> or <pays> is null)
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...![]()
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager