Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
On ne parle pas souvent du Number Array comme Retrieval Argument et quand on l'utilise, on a parfois du mal à trouver les infos.
Donc pour rappel, un retrieval argument peut être de type NUMBER ARRAY et dans ce cas pour son utilisation dans le script SQL de la DW passe par un WHERE x IN (:ra) en général.
SELECT * FROM T WHERE x IN (:ra) --où --T: Table --x: Colonne de la table T --ra: Un Retrieval Argument de type NUMBER ARRAY
Mais bon, voilà : Il arrive qu'on ait des contraintes qui font qu'on travaille directement avec des fonctions (ou plus précisément des TABLE FUNCTION ou encore des procédures). Et donc le code sera du genre :
SELECT * FROM T(:ra) --où --T(:ra) : Une Table Function dépendant du NUMBER ARRAY
Et là, ça coince car Oracle ne reconnaît pas le type NUMBER ARRAY (si qqun trouve l'astuce, je suis tjrs preneur )
Il nous faut trouver un contournement.
Pour ce faire,
1- Commençons par modifier la fonction sous Oracle afin qu'elle accepte un NUMBER et non un NUMBER ARRAY comme argument : T(x)
2- Utilisons le bon vieux WHERE x IN (:ra)
Secouons le tout et on aura :
SELECT * FROM S, T (x) WHERE x IN (:ra) --où --S: Table de référence contenant la colonne x --T: Table Function dépendant de la valeur de x --x: Colonne de la table S --ra: Un Retrieval Argument de type NUMBER ARRAY
Et là ! ça marche ! (du moins sous Oracle)
Bon si votre requête est un peu trop complexe et que vous ne pouvez appliquer cet astuce, ou que votre base ne supporte pas ce contournement, vous pourrez toujours utiliser le bon vieux couple "concat string/parse" :
C'est-à-dire :
1- Concaténer en string avec un séparateur le NUMBER ARRAY
2- Modifier la fonction ou la procédure pour qu'elle accepte un string comme argument
3- Et dans la base, il ne vous reste plus qu'à parser le grand string et à le convertir de nouveau en ARRAY
Google est ton ami 'aussi' pour les détails
Petite astuce lorsqu'on teste les NUMBER ARRAY dans la DW painter... et qu'on passe son temps à faire des retrieves...
Il faut lister tout simplement les différentes valeurs séparées par un espace :
ra NUMBER ARRAY 10 12 15 20 30 79 61 71
Dernière modification par Sweey (11-06-2009 13:51:14)
Hors ligne
0000
Hors ligne
Attention à la limite d'éléments pris en compte dans la clause in (max 256 je pense, ça dépends sans doute des versions PB/Oracle aussi)
Hors ligne