|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||||
|
Membre habitué
![]() Inscription : décembre 2004 Messages : 643 ![]() |
Bonjour,
Je suis dans une procédure stockée. Suivant la valeur de ma variable V_PARAM, la liste des identifiants en paramètre va être variable (cf exemple ci-dessous). Une liste, ça ne marche pas : Code :
Code :
Code :
Merci pour votre aide. |
||||||
|
|
00
|
|
|
#2 | |||||
|
Membre Expert
![]() Inscription : août 2008 Messages : 1 271 ![]() |
Effectivement tu ne peux pas utiliser CASE avec de multiples valeurs, ou du moins je ne vois pas comment à part remplacer IN par plusieurs OR.
Citation:
Code :
Dans ton cas ça pourrait donner : Code :
|
|||||
|
|
00
|
|
|
#3 |
|
Membre habitué
![]() Inscription : décembre 2004 Messages : 643 ![]() |
Merci pour ta réponse.
1°/Ca confirme qu'on peut donc pas faire avec les CASE 2°/J'avais oublié, mais ça je connais les OPEN FOR, donc ça semble faisable ![]() 3°/Je suis désolé mais là je ne comprend absolument rien -job nocturne : c'est un terme technique? Quel rapport, en fait non ces traitements vont tourner en journée -j'ai quand-même vaguement essayé de suivre le truc, mais la procédure my_ctx_procedure a des erreurs de compilation à cause du CREATE OR REPLACE context my_ctx USING my_ctx_procedure où j'ai insufficient privileges -mais où se trouve ma requête dans tout ça? |
|
|
00
|
|
|
#4 | |||||
|
Membre Expert
![]() Inscription : août 2008 Messages : 1 271 ![]() |
Tu peux peut être aussi te faire une CTE de paramétrage ou -1 correspondrait au ELSE du CASE, quelque chose comme :
Code :
Citation:
Donc si cette requête est fortement utilisée la base parsera inutilement de nombreuses fois la requête. Si cette requête est assez peu exécutée, c'est moins problématique. Citation:
Citation:
Code :
open c FOR SELECT * FROM t WHERE col IN (SELECT * FROM IN_LIST); |
|||||
|
|
00
|
|
|
#5 | ||
|
Membre éclairé
![]() |
Code :
|
||
|
|
00
|
|
|
#6 | ||||
|
Membre habitué
![]() Inscription : décembre 2004 Messages : 643 ![]() |
Ah, mais attendez, il y a mieux!!
Code :
Code :
|
||||
|
|
00
|
|
|
#7 |
|
Membre Expert
![]() Inscription : août 2008 Messages : 1 271 ![]() |
Oui ça fonctionne aussi, c'est la version "If you are in Oracle 8i" du lien "Varying in lists" proposé ci-dessus.
|
|
|
00
|
|
|
#8 |
|
Membre habitué
![]() Inscription : décembre 2004 Messages : 643 ![]() |
A peu de choses près oui, c'est vrai
Bon, par contre c'est bien beau de passer '1, 20, 150' en dur, mais c'est autre chose d'aller chercher une liste d'integer dans une table suivant certains critères à la place... |
|
|
00
|
|
|
#9 | |
|
Membre Expert
![]() Inscription : août 2008 Messages : 1 271 ![]() |
Citation:
Si ce sont des id stockés dans une table, il y a forcément moyen de faire plus simple et plus performent que concaténer puis déconcaténer. Donne nous peut être un exemple réaliste de ce que tu veux faire. Sinon pour concaténer en liste des valeurs d'une colonne, c'est par là : String Aggregation Techniques |
|
|
|
00
|
|
|
#10 | ||||
|
Membre habitué
![]() Inscription : décembre 2004 Messages : 643 ![]() |
OK, bon, pour résumer :
-si c'est 2 requêtes différentes suivant les valeurs de "V_PARAM", je fais un OPEN FOR -si c'est une condition sur une liste dont les valeurs vont dépendre de "V_PARAM", je peux certes faire selon certaines solutions proposées ici mais plus logiquement, il faut surtout faire une table de correspondance COR_champ3 qui ressemble à Code :
Code :
|
||||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com