Quoi, tu ne connais pas PB ? Va falloir parcourir tout le forum alors !

Le forum (ô combien francophone) des utilisateurs de Powerbuilder.

Recherche rapide

Annonce

Certaines rubriques, dont des cours, sont uniquement visibles par les membres du forum ^^.
Dans la rubrique Liens & Références, vous avez accès à un sommaire de téléchargement, profitez-en !
Il existe maintenant un nouveau TOPIC "Votre CV en Ligne" accessible uniquement par demande.

#1 11-06-2009 13:48:54

Sweey  
N2I Power
Date d'inscription: 19-05-2008
Messages: 5
Pépites: 10,019
Banque: 0

[ASTUCE] Number Array Retrieval arguments avec Oracle

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.

Code: mssql

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 :

Code: mssql

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 :

Code: mssql

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 :

Code:

ra  NUMBER ARRAY  10 12 15 20 30 79 61 71

Dernière modification par Sweey (11-06-2009 13:51:14)

Hors ligne

 

#2 11-06-2009 14:29:09

nico  
Modérateur
Award: bf
Lieu: Plélan le grand
Date d'inscription: 08-02-2007
Messages: 273
Pépites: 13
Banque: 9,223,372,036,854,776,000

Re: [ASTUCE] Number Array Retrieval arguments avec Oracle



0000

Hors ligne

 

#3 11-06-2009 15:00:55

rincevent  
Modérateur
Award: bf
Lieu: Belgique
Date d'inscription: 06-02-2007
Messages: 722
Pépites: 100,002,023
Banque: 0

Re: [ASTUCE] Number Array Retrieval arguments avec Oracle

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)


http://img114.imageshack.us/img114/8519/userbar175801nb.gif
Pourquoi ne puis-je vivre comme n'importe quel être humain ? Pourquoi mon destin est-il de ne pouvoir cesser de me battre ?

Hors ligne

 

Pied de page des forums

Propulsé par FluxBB 1.2.22