C # имеет тип OracleCollectionType.PLSQLAssociativeArray
для передачи массивов в тип данных PL / SQL Associative Array, но его нельзя использовать в запросах SQL, поскольку это только структура данных PL / SQL.
Это, к сожалению,, не поддерживает передачу массива в тип данных SQL Collection (который может использоваться в запросе SQL).
Обходной путь для этого - попросить вашего администратора баз данных создать простую функцию для преобразования PL /Ассоциативный массив SQL в коллекцию SQL, а затем используйте его в качестве промежуточного шага в запросе:
CREATE TYPE varchar2s_array_type IS TABLE OF VARCHAR2(100)
/
CREATE PACKAGE utils IS
TYPE varchar2s_assoc_array_type IS TABLE OF VARCHAR2(100) INDEX BY PLS_INTEGER;
FUNCTION assoc_array_to_collection(
p_assoc_array IN varchar2s_assoc_array_type
) RETURN varchar2s_array_type DETERMINISTIC;
END;
/
CREATE PACKAGE BODY utils IS
FUNCTION assoc_array_to_collection(
p_assoc_array IN varchar2s_assoc_array_type
) RETURN varchar2s_array_type DETERMINISTIC
IS
p_array varchar2s_array_type := varchar2s_array_type();
i PLS_INTEGER;
BEGIN
IF p_assoc_array IS NOT NULL THEN
i := p_assoc_array.FIRST;
LOOP
EXIT WHEN i IS NULL;
p_array.EXTEND();
p_array(p_array.COUNT) := p_assoc_array(i);
i := p_assoc_array.NEXT(i);
END LOOP;
END IF;
RETURN p_array;
END;
END;
/
Затем вы можете изменить свой код, чтобы использовать MEMBER OF
вместо IN
в операторе SQL:
UPDATE MYTABLE
SET STATUS = 'X'
WHERE TABLEID MEMBER OF utils.assoc_array_to_collection(:ids)
И связать параметр, используя что-то вроде ( Я не пользователь C #, так что это просто для того, чтобы дать вам общее представление о методе, даже если синтаксис не совсем корректен ):
var par = cmd.Parameters.Add(":ids", OracleDbType.Varchar2, ParameterDirection.Input);
par.CollectionType = OracleCollectionType.PLSQLAssociativeArray;
par.Value = ids;
par.Size = ids.Length;
cmd.ExecuteQuery();
Затем вы можете повторно использовать универсальную функцию во многих запросах.