Votre type :
create or replace TYPE INNUMARRAY AS TABLE OF INTEGER;
est une collection définie dans la portée SQL.
Votre argument passé :
p_strings.CollectionType = OracleCollectionType.PLSQLAssociativeArray;
p_strings.Value = new int[5]{1,2,3,4,5};
est un tableau associatif qui ne peut être défini que dans une portée PL/SQL (c'est-à-dire dans un package ou dans un bloc PL/SQL) et ne peut pas être utilisé dans une portée SQL.
Ce sont deux types de données différents et incompatibles.
Au lieu de cela, vous pouvez créer un type de tableau associatif dans un package, puis extraire manuellement chaque valeur du tableau associatif dans une collection pouvant être utilisée dans la portée SQL :
CREATE PACKAGE vehicles_pkg IS
TYPE INNUMASSOCARRAY IS TABLE OF INTEGER INDEX BY BINARY_INTEGER;
PROCEDURE v1
(
VehicleGroupID_Array IN INNUMASSOCARRAY
);
END;
/
CREATE PACKAGE BODY vehicles_pkg IS
PROCEDURE v1
(
VehicleGroupID_Array IN INNUMASSOCARRAY
)
IS
p_recordset SYS_REFCURSOR;
p_array INNUMARRAY := INNUMARRAY();
i BINARY_INTEGER;
BEGIN
i := VehicleGroupID_Array.FIRST;
WHILE i IS NOT NULL LOOP
p_array.EXTEND;
p_array( p_array.COUNT ) := VehicleGroupID_Array(i);
i := VehicleGroupID_Array.NEXT(i);
END LOOP;
-- Rest of your procedure using p_array instead of the associative array.
END;
END;
/
puis-je définir le type de tableau associatif en dehors du package ? Je veux qu'ils soient autonomes.
Non, mais vous pouvez définir un package contenant uniquement le type :
CREATE PACKAGE vehicles_pkg IS
TYPE INNUMASSOCARRAY IS TABLE OF INTEGER INDEX BY BINARY_INTEGER;
END;
/
CREATE PROCEDURE v1
(
VehicleGroupID_Array IN vehicles_pkg.INNUMASSOCARRAY
)
IS
p_recordset SYS_REFCURSOR;
p_array INNUMARRAY := INNUMARRAY();
i BINARY_INTEGER;
BEGIN
i := VehicleGroupID_Array.FIRST;
WHILE i IS NOT NULL LOOP
p_array.EXTEND;
p_array( p_array.COUNT ) := VehicleGroupID_Array(i);
i := VehicleGroupID_Array.NEXT(i);
END LOOP;
-- Rest of your procedure using p_array instead of the associative array.
END;
/
Ou, mieux, créez des types nommés de manière générique et une fonction dans le package pour traduire d'un tableau associatif en une collection, puis réutilisez-les dans vos procédures :
Violon SQL
Configuration du schéma Oracle 11g R2 :
CREATE TYPE IntList AS TABLE OF INTEGER
/
CREATE PACKAGE tools IS
TYPE IntMap IS TABLE OF INTEGER INDEX BY BINARY_INTEGER;
FUNCTION IntMapToList(
i_map IntMap
) RETURN IntList;
END;
/
CREATE PACKAGE BODY tools IS
FUNCTION IntMapToList(
i_map IntMap
) RETURN IntList
IS
o_list IntList := IntList();
i BINARY_INTEGER;
BEGIN
IF i_map IS NOT NULL THEN
i := o_list.FIRST;
WHILE i IS NOT NULL LOOP
o_list.EXTEND;
o_list( o_list.COUNT ) := i_map( i );
i := i_map.NEXT( i );
END LOOP;
END IF;
RETURN o_list;
END;
END;
/
CREATE PROCEDURE v1
(
VehicleGroupID_Array IN tools.IntMap
)
IS
p_recordset SYS_REFCURSOR;
p_array IntList := tools.IntMapToList( VehicleGroupID_Array );
i BINARY_INTEGER;
BEGIN
-- Rest of your procedure using p_array instead of the associative array.
NULL;
END;
/