Вызов хранимой процедуры 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, и это значение может быть использовано в хранимой процедуре.

Другие вопросы по тегам