Oracle “DANS la clause” de paramètre
Je suis très familier avec Oracle et je suis juste essayer d'obtenir que cela fonctionne. J'ai regardé ici et ici, mais n'ont aucune idée de comment faire fonctionner le tout. Voici ce dont j'ai besoin. J'ai besoin d'un proc qui va accepter une chaîne délimitée par des virgules comme un paramètre que je peux utiliser dans la "clause" de la requête et retourne un curseur de résultat. Est-il un moyen de le faire dans un tout inclus proc? Si non, quelles sont les différentes étapes que j'ai besoin de prendre? Encore une fois, je m'excuse pour mon manque de connaissance de l'Oracle, c'est juste essayer d'obtenir quelque chose à travailler très vite.
Grâce
Voici le proc (p_Scope serait délimité par des virgules d'entrée):
create or replace PROCEDURE CU_SELECTION_ID
(
p_Scope IN varchar2,
p_ResultSet OUT SYS_REFCURSOR
)
is
BEGIN
OPEN p_ResultSet FOR
select
b.addr1,
b.addr2,
b.city,
b.country_code,
a.customer_no,
b.des1,
a.entity,
b.main_phone_no,
b.phone_area_code,
b.status,
b.wb_site_url,
b.zip
from
ar_customer a,
ct_addr b
where b.main_loc_flag = 'Y' and
a.customer_no = b.customer_no and
a.entity = b.cust_entity and
b.stk_loc_no = '3' and
b.customer_no in (p_Scope);
END;
S'il vous plaît montrer ce que vous avez déjà essayé.
Ce sont préexistants oracle procs qui ont besoin de changements. Si cela peut être fait sans grandes modifications de la structure, qui serait préférable à ce stade. Pour répondre à votre question, non je n'ai pas regardé le code sql dynamique...je ne sais pas par où commencer avec ce soit :).
J'ai essayé de variations sur les deux liens dans la question...la plupart du temps à essayer de comprendre si le
table(cast(array as type_array))
genre de chose serait de travailler. Je vais ajouter le proc à ma question, mais c'est le retour à la base proc à ce point.Dynamiquement que j'aie encore à boucle à travers la délimité par des virgules paramètre de construire la chaîne. Cela peut être viable, mais je suis tellement hors de mon élément ici que c'est même pas drôle. J'ai à peine touché Oracle.
OriginalL'auteur Metallicraft | 2011-07-08
Vous devez vous connecter pour publier un commentaire.
Je crois qu'il ya une "meilleure façon", mais je ne suis pas sûr de ce qu'il est maintenant...
Cela devrait fonctionner pour vous si:
remplacer:
avec
Cette recherche p_Scope et renvoie une valeur de > 0 si b.customer_no apparaît dans la liste.
Assurez-vous que le premier et dernier caractère dans la liste, c'est une virgule (',')
(également, en tant que nouveau venu sur Oracle, j'ai trouvé Tech République être très utile rapide des ressources.)
...et merci pour le lien, trop!
À portée de main. A voté.
Ne pas il y avoir des problèmes avec cette si deux numéros de client arrive à la fin, avec les mêmes chiffres (par exemple 12345 et 2345)? Vous devriez support b.customer_no avec une virgule sur côtés.
bon point...va modifier dans une solution pour que. @Metallicraft prendre note de cette question et de mettre à jour
OriginalL'auteur Cos Callis
En supposant déclaration
la requête
donne le même résultat que
Vous pouvez utiliser des deuxième et passer PLSQL collection en fonction de table. Je le fais de cette façon à partir de Java où
...table(?)
fonctionne parfaitement. Expliquer le plan ne semble pas trop mauvaise en comparaison avec les traditionnels clause.Des Solutions basées sur la recherche de texte avec séparateurs peuvent être la performance du tueur.
Un article très intéressant sur les détails et les pièges d'une telle solution: pontis.biz/resources/articles/collection_card.php
OriginalL'auteur Tomáš Záluský
Vous pouvez l'utiliser de cette façon:
MYPARAM- '368134,181956'
u appel .net code?
OriginalL'auteur Rajesh D
Pour mémoire, voici un autre laid façon de le faire.
OriginalL'auteur Cortright