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
Version imprimable
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 ?Citation:
"... au moment de l'exécution..."
De la création de la vue
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:
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 ;
à 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:
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.
merci de penser aux balises à l'avenir :roll:
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:
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) ;
Moi je suis sur que non! ;)Citation:
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...
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....)Citation:
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:
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
8O
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 :koi:
Plus je lis ce sujet moins j'en comprends l'intérêt :aie:
Effectivement ça tourne au loufoque l'histoire... :mrgreen:
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:
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... :)