EDIT: modification du titre pour l'adapter au code ci-dessous.Comment puis-je vérifier une condition IN par rapport à une liste dynamique dans Oracle?
J'essaie de récupérer une liste de valeurs acceptables à partir d'une table Oracle, puis d'effectuer un SELECT par rapport à un autre en comparant certains champs à cette liste. J'essayais de le faire avec des curseurs (comme ci-dessous), mais cela échoue.
DECLARE
TYPE gcur IS REF CURSOR;
TYPE list_record IS TABLE OF my_table.my_field%TYPE;
c_GENERIC gcur;
c_LIST list_record;
BEGIN
OPEN c_GENERIC FOR
SELECT my_field FROM my_table
WHERE some_field = some_value;
FETCH c_GENERIC BULK COLLECT INTO c_LIST;
-- try to check against list
SELECT * FROM some_other_table
WHERE some_critical_field IN c_LIST;
END
Fondamentalement, ce que je suis en train de faire est de mettre en cache la liste des valeurs acceptables dans une variable, parce que je vais vérifier à plusieurs reprises contre elle plus tard.
Comment procédez-vous dans Oracle?
Annoyingly, votre code fonctionnerait parfaitement si votre opération finale était un UPDATE ou un DELETE - ce sont seulement des SELECT qui n'acceptent pas le bulk-binding comme une entrée. – JulesLt
btw, vous avez une fuite de ressources - n'ont pas fermé le curseur ref. Pourquoi pas bon vieux curseur local? –