Есть ли способ передать набор значений в качестве параметра в Oracle SQL Statement

Я хотел бы передать набор значений в качестве параметра в Sql Statement (в vb.net).

В моем случае:

Пользователям разрешено загружать набор идентификаторов, чтобы проверить доступность элемента. Я хотел бы выполнить оператор, который будет возвращать элементы, которые соответствуют любому из ID, делая следующее:

SELECT * FROM MyTable WHERE id IN ('123','456','789') 

Но я не могу передать значение ('123', '456', '789') в качестве параметра, поскольку оно будет принято как атомное значение – целая строка, т. Е. Это не будет работать:

 SELECT * FROM MyTable WHERE id IN :param where :param is ('123','456','789') 

Я не могу объединить строки (как показано выше), чтобы избежать инъекции на стороне клиента.

Есть идеи?

    С VB.net вы можете передать «Ассоциативный массив» на вызов SQL.

    В PL / SQL создайте типы и процедуры, подобные этому:

     CREATE OR REPLACE TYPE NUMBER_TABLE_TYPE AS TABLE OF NUMBER; CREATE OR REPLACE PACKAGE My_Package AS TYPE NUMBER_ARRAY_TYPE IS TABLE OF NUMBER INDEX BY BINARY_INTEGER; PROCEDURE My_Procedure(arr IN NUMBER_ARRAY_TYPE); END My_Package; CREATE OR REPLACE PACKAGE BODY My_Package AS PROCEDURE My_Procedure(arr IN NUMBER_ARRAY_TYPE) IS nested_table NUMBER_TABLE_TYPE := NUMBER_TABLE_TYPE(); BEGIN -- First transform "Associative array" to a "Nested Table" FOR i IN arr.FIRST..att.LAST LOOP nested_table.EXTEND; nested_table(nested_table.LAST) := arr(i); END LOOP; SELECT * INTO ... FROM MyTable WHERE ID MEMBER OF nested_table; END My_Procedure; END My_Package; 

    В VB.NET это выглядит так:

     Sub My_Sub(ByVal idArr As Long()) Dim cmd As OracleCommand Dim par As OracleParameter cmd = New OracleCommand("BEGIN My_Package.My_Procedure(:arr); END;"), con) cmd.CommandType = CommandType.Text par = cmd.Parameters.Add("arr", OracleDbType.Int64, ParameterDirection.Input) par.CollectionType = OracleCollectionType.PLSQLAssociativeArray par.Value = idArr par.Size = idArr.Length cmd.ExecuteNonQuery() End Sub 

    Проверьте документ Oracle для получения дополнительной информации: привязка ассоциативного массива PL / SQL

    вы можете передать значения в формате XML и проанализировать их с помощью XMLDOM.

    Смотрите: здесь

      DECLARE vXML VARCHAR2 (10000 CHAR) := '<ids><id>1</id><id>2</id><id>3</id></ids>'; BEGIN OPEN :refc FOR SELECT c."id" FROM XMLTABLE ('/ids/id' PASSING XMLTYPE (vXML) COLUMNS "id" VARCHAR2 (32)) c; END; 

    Почему вы не можете просто передать его как одно атомное значение, а затем работать с программой INSTR-function, предлагаемой Oracle. Например:

     WITH MyTable AS ( SELECT 'abc' ID FROM dual UNION ALL SELECT 'abcc' ID FROM dual UNION ALL SELECT 'bbc' ID FROM dual UNION ALL SELECT 'def' ID FROM dual UNION ALL SELECT 'abcdef' ID FROM dual) select * from MyTable where instr('(''abc'', ''def'')', '''' || id || '''') > 0;