Передать список типов классов процедуре Oracle c# - PullRequest
0 голосов
/ 09 января 2020

Я хотел вызвать oracle хранимую процедуру, имеющую коллекцию в качестве параметра от C#. Мне удалось сделать вызов процедуры через массив / список (только одномерный) из c#, но теперь я хочу передать список сложного типа, как только я добавил, что получаю OracleParameter.Value - недопустимая ошибка. Ниже приведен пример:

OracleCommand comm = new OracleCommand("Schema.PACK_INQUIRY.ProcEmpUDFArray_Test", "Connection");
                comm.CommandType = CommandType.StoredProcedure;

            List<Employee> EmpList = new List<Employee>()
            {
                new Employee() { City = "City1", Name="Emp1" },
                new Employee() {City = "City2", Name="Emp2" }
            };


            OracleParameter param1 = new OracleParameter("Param1", OracleDbType.Varchar2, EmpList.Count, EmpList, ParameterDirection.Input);
            param1.ArrayBindStatus = Enumerable.Repeat(OracleParameterStatus.Success, EmpList.Count()).ToArray();
            param1.CollectionType = OracleCollectionType.PLSQLAssociativeArray;
            comm.Parameters.Add(param1);
            comm.ExecuteNonQuery();

Ниже приведен код класса

public class Employee
        {
            public string Name { get; set; }
            public string City { get; set; }
        }

Ниже приведен oracle код

create or replace  type EMPTEST AS OBJECT
    (    
        Name   varchar2(50),    
        City          varchar2(50)
    );

type T_EMPUDF_ARRAY is table of EMPTEST;

PROCEDURE ProcEmpUDFArray_Test( Param1 IN  T_EMPUDF_ARRAY)
    AS
    out_ORAERRORMSG   VARCHAR2(100);
    BEGIN      
    insert into test values ('1');
     commit;
        if Param1.count > 0 THEN
            FOR i IN 1 .. Param1.count LOOP
                insert into test values (Param1(i).Name);
            END LOOP;
        END IF;
     commit;
      EXCEPTION
WHEN OTHERS THEN
     out_ORAERRORMSG := SUBSTR(SQLERRM, 1, 50);
     insert into test values (out_ORAERRORMSG);
     commit;
END ProcEmpUDFArray_Test;

Я добавил код вставки в тестовые значения («1»); просто чтобы проверить, входит ли мой звонок в про c или нет. Я проверил это не так. Не могу я передать сложный тип списка процедуре oracle. Также я читаю Oracle
Ассоциативные массивы - это одномерные, неограниченные, разреженные наборы однородных элементов. Во-первых, ассоциативный массив является одномерным. Это означает, что ассоциативный массив имеет один столбец данных в каждой строке, который аналогичен одномерному массиву.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...