PLS-00306: неверный номер или типы аргументов при вызове функции оракула - PullRequest
0 голосов
/ 18 декабря 2018

У меня есть простая функция оракула, как показано ниже

create or replace function get_area(
mem_id IN VARCHAR2,
P_date    DATE DEFAULT SYSDATE)
RETURN NUMBER
IS
  v_area_id NUMBER;
BEGIN
v_area_id := 0;
RETURN v_area_id ;
end;

(это функция тестирования, поэтому просто присваиваем 0 и возвращаем обратно переменную)

Мы вызываем то же самое в C #, как показано ниже

            ora_con.Open();
            OracleCommand cmd = ora_con.CreateCommand();
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Connection = ora_con;

            cmd.CommandText = "schema.get_area";

            OracleParameter mem_id = new OracleParameter();
            mem_id.OracleDbType = OracleDbType.Varchar2;
            mem_id.Direction = ParameterDirection.Input;
            mem_id.Value = m_id1;

            OracleParameter P_date = new OracleParameter();
            P_date.OracleDbType = OracleDbType.Date;
            P_date.Direction = ParameterDirection.Input;
            P_date.Value = DateTime.Now;

            OracleParameter v_area_id = new OracleParameter();
            v_area_id.OracleDbType = OracleDbType.Int64;
            v_area_id.Direction = ParameterDirection.ReturnValue;
            v_area_id.Size = 1000;

            cmd.Parameters.Add(mem_id);
            cmd.Parameters.Add(P_date);
            cmd.Parameters.Add(v_area_id);

            cmd.ExecuteNonQuery();
            area_id = Convert.ToInt64(cmd.Parameters["v_area_id"].Value);

при выполнении того же самого, получая следующую ошибку

ORA-06550: строка 1, столбец 15: PLS-00306: неверный номер или типы аргументов в вызове 'GET_AREA 'ORA-06550: строка 1, столбец 7: PL / SQL: оператор игнорируется

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

Как я прочитал в этой аналогичной проблеме , возможно, вы объявляете параметры в неправильном порядке, поскольку Oracle хранит возвращаемое значение как индекс 0 внутри списка параметров, а входные параметры следуют его примеру.

Попробуйте настроить порядок параметров так, чтобы возвращаемое значение присваивалось первым, поскольку mem_id имеет тип VARCHAR2 и несовместим с NUMBER type:

cmd.Parameters.Add(v_area_id); // this should be added first
cmd.Parameters.Add(mem_id);
cmd.Parameters.Add(P_date);
0 голосов
/ 18 декабря 2018

Из документов

https://docs.oracle.com/en/database/oracle/oracle-database/12.2/odpnt/featOraCommand.html#GUID-4D32E59C-1BC0-4567-994E-B0EF3D61D3C4

При связывании по позиции (по умолчанию) с функцией ODP.NET ожидает, что возвращаемое значение будет привязано в первую очередь, прежде чем любые другиепараметры.

, поэтому переместите параметр возвращаемого значения, чтобы он стал первым в вашем списке.

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