Mi código .NET usa actualmente ODP.NET para llamar un procedimiento almacenado muchas veces para operar en varias filas en muchas tablas. El código .NET tiene una matriz de filas para cambiar. Solo cambia un parámetro en cada llamada, y me gustaría pasar la matriz de .NET a PL/SQL para operar en varias filas (el número de filas cambiará).Cómo usar el operador SQL 'IN' (o 'ANY') con VARRAY en PL/SQL
he pasado con éxito una serie de .NET para PL/SQL usando:
type number_arr is table of number(10) index by pls_integer;
PROCEDURE "BLAH" (foo IN number_arr);
Nota que creo que se llama un number_arr VARRAY, pero no estoy positivo acerca de eso, y si alguien quiere para corregirme, por favor hazlo (como comentario), pero esto podría estar contribuyendo a mi confusión.
Pero ahora, en el PL/SQL, que tienen muchas instrucciones de actualización que solían ser:
UPDATE t SET a = b WHERE a = foo;
cuando foo no era una matriz. Ahora quiero escribir:
UPDATE t SET a = b WHERE a IN (foo);
Pero esta sintaxis no parece funcionar. Y no he podido encontrar un ejemplo para Oracle que combine el uso de VARRAY y 'IN' (o 'ANY', etc.). Y he visto algunas respuestas sobre cómo hacer esto con SQL Server, pero no estoy seguro de cómo traducir eso a Oracle.
Por supuesto, si hay alguna otra manera de obtener la matriz de .NET para el procedimiento almacenado para hacer esto, eso también respondería a mi pregunta. Estoy buscando ganar eficiencia con el IN, así que algo que itera sobre el arreglo en PL/SQL (para llamar las instrucciones UPDATE por separado) probablemente no ayude.
Creo que en su último fragmento de código, 'table (foo)' tendría que ser 'table (cast (foo como number_arr))'. Pero en general, buena respuesta. –
@Dave: a menudo se hace de esa manera, pero no es necesario. – Allan
¡tienes razón! Creo que en algún momento en el pasado se requirió CAST, pero las pruebas en 10.2.0.4 muestran que no es ahora. –