Вызов хранимой процедуры Oracle с переменным массивом ввода параметров из C#
У меня есть хранимая процедура в Oracle, которая получает входной параметр типа varchar2
переменный массив. Процедура работает, и если вы вызываете ее из SQL, то, что мне нужно, вызывается из C#.
Мой сценарий такой:
CREATE OR REPLACE PROCEDURE INTEGRATOR.PRC_TEST_PARAM_ARRAY (p_nros_moviles integrator.NROMOVIL_ARRAY) IS
BEGIN
FOR i IN 1..p_nros_moviles.count LOOP
IF p_nros_moviles(i) IS NOT NULL THEN
INSERT INTO INTEGRATOR.TEST_PARAM_ARRAY VALUES (p_nros_moviles(i));
END IF;
END LOOP;
END;
/
Мой тип пользователя:
CREATE OR REPLACE TYPE INTEGRATOR.NROMOVIL_ARRAY AS
VARYING ARRAY(100) OF VARCHAR2(15);
/
Мой вызов из PLSQL
DECLARE
v_array integrator.NROMOVIL_ARRAY;
BEGIN
v_array := integrator.NROMOVIL_ARRAY('9999999', '66666666');
integrator.prc_test_param_array(v_array);
END;
И я пытаюсь таким образом из C#
try
{
using (OracleConnection connection = new OracleConnection())
{
connection.ConnectionString = "Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)" +
"(HOST=10.10.10.10)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)" +
"(SID=PORTANODE)));User Id=user;Password=*****;";
using (OracleCommand cmd = new OracleCommand("INTEGRATOR.PRC_TEST_PARAM_ARRAY", connection))
{
cmd.CommandType = CommandType.StoredProcedure;
OracleParameter p = new OracleParameter();
p.ParameterName = "P_NROS_MOVILES";
p.OracleDbType = OracleDbType.Array;
p.Direction = ParameterDirection.Input;
p.UdtTypeName = "INTEGRATOR.NROMOVIL_ARRAY";
//p.CollectionType = OracleCollectionType.PLSQLAssociativeArray;
p.Value = new string[] { "XXXX", "YYYY" };
cmd.Parameters.Add(p);
connection.Open();
cmd.ExecuteNonQuery();
MessageBox.Show("Ejecutado");
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
Кто-то может направить меня, мне нужно изменить, чтобы это работало
2 ответа
Наберись терпения, подожди и подожди... это чертовски долго... это мой опыт
Я не уверен, но я думаю, что System.Data.OracleClient на самом деле не поддерживает пользовательские массивы.
Я бы попытался написать вспомогательную хранимую функцию, которая берет, например, строку, разделенную запятыми (это будут значения вашего типа varray), и разделяет ее на значения, используя WHILE LOOP и SUBSTR. Затем на каждой итерации он добавляет фактическую переменную VARCHAR2 к временной переменной типа integrator.NROMOVIL_ARRAY, используя EXTEND(1), чтобы освободить место для нового значения.
В конце функция возвращает временный интегратор. NROMOVIL_ARRAY, и это значение может быть использовано в хранимой процедуре.