sqlplus - à l'aide d'un lier des variables dans le “dans” la clause
Je suis en train d'une liaison variable dans une PL/SQL bloc, et j'essaie de l'utiliser dans une autre requête DANS l'expression. Quelque chose comme ceci:
variable x varchar2(255)
declare
x varchar2(100);
begin
for r in (select id from other_table where abc in ('&val1','&val2','&val3') ) loop
x := x||''''||r.id||''',';
end loop;
--get rid of the trailing ','
x:= substr(x,1,length(x)-1);
select x into :bind_var from dual;
end;
/
print :bind_var;
select *
from some_table
where id in (:bind_var);
Et j'obtiens une erreur (ORA-01722: nombre non valable) sur la requête qui tente d'utiliser la liaison de la variable dans la liste.
L'instruction print yiels '123','345'
qui est ce que j'attends.
Est-il possible d'utiliser la liaison de la variable comme ceci ou devrais-je essayer une approche différente?
(à l'aide d'Oracle 10g)
Précisions:
C'est pour une réconciliation genre de chose. Je veux courir
select *
from some_table
where id in (select id from other_table where abc in ('&val1','&val2','&val3'))
avant la partie principale du script (non représentée ici) supprime tout un tas de dossiers. Je veux l'exécuter à nouveau par la suite pour vérifier que les enregistrements dans some_table
n'ont PAS été supprimés. Toutefois, les données other_table
NE supprimés par ce processus, de sorte que je ne peux pas juste faire référence aux données other_table
parce qu'il n'y a rien. J'ai besoin d'un moyen de préserver la other_table.id
valeurs afin que je puisse vérifier les enregistrements parents par la suite.
OriginalL'auteur FrustratedWithFormsDesigner | 2011-02-11
Vous devez vous connecter pour publier un commentaire.
Je voudrais stocker les
other_table.id
's en PL/SQL de la table de référence et que la table de la requête par la suite:Dans les dernières versions d'Oracle, le CASTING devrait être inutile-- vous pouvez simplement faire TABLE(v_table)
Intéressant... je vais essayer!
Hoogenboom: Est-il possible d'exécuter "stade ultérieur" instruction SQL (celui qui fait référence à
v_table
) à l'extérieur d'une PL/SQL bloc? La requête qu'il remplace est à la fin du script et à l'extérieur du PL/SQL bloc (pour faire du bobinage sur le fichier de sortie plus simple) et cela me donne un type de données non valide erreur pour t_id_table. A-t-elle à être exécuté dans le même bloc quet_id_table
est déclarée?Vous pouvez déclarer le pl/sql de la table dans un package afin de conserver les données pendant la session.
OriginalL'auteur diederikh
Vous ne pouvez pas utiliser de valeurs séparées par des virgules dans un lier des variables.
On pourrait dire:
si
Vous êtes mieux d'utiliser quelque chose comme:
Droit, mais pourquoi ne pas simplement le faire en une seule instruction?
Hm réglage de la liaison variable d'une chaîne de requête ne semble pas fonctionner non plus.
Pas de. Ce n'est pas ce que je recevais. Vous avez clarifié la question & montré exactement ce que je recevais à l' (il suffit de sélectionner dans 1 stmt).
OriginalL'auteur Gerrat
Je voudrais utiliser une table temporaire globale pour cette fin
puis
et à la fin
OriginalL'auteur Marcin Wroblewski
Ok, j'ai une espèce de moche solution qui utilise également des variables de substitution...
Il fonctionne, mais je vais accepter une réponse de quelqu'un d'autre si c'est plus élégant.
OriginalL'auteur FrustratedWithFormsDesigner
changé la boucle à utiliser listagg (malheureusement cela ne fonctionnera que dans 11gr2).
mais pour la variable dans la liste, j'ai utilisé un expression régulière pour atteindre l'objectif (mais avant 10g vous pouvez utiliser substr à faire de même) c'est levée à partir de la asktom question liée.
MODIFIER
Oups viens de remarquer que vous n'avez marque 10g, la seule chose à faire est de ne PAS utiliser le listagg que j'ai fait au début
OriginalL'auteur Harrison