Проблема с хранимой процедурой оракула - параметры - PullRequest
2 голосов
/ 30 марта 2010

У меня есть эта хранимая процедура:

CREATE OR REPLACE PROCEDURE "LIQUIDACION_OBTENER" (
  p_Cuenta IN NUMBER, 
  p_Fecha IN DATE,
  p_Detalle OUT LIQUIDACION.FILADETALLE%TYPE
) IS

BEGIN 

  SELECT FILADETALLE
    INTO p_Detalle
    FROM Liquidacion
   WHERE (FILACUENTA = p_Cuenta)
     AND (FILAFECHA = p_Fecha);

END;
/

... и мой код c #:

string liquidacion = string.Empty;

OracleCommand command = new OracleCommand("Liquidacion_Obtener");            

command.BindByName = true;
command.Parameters.Add(new OracleParameter("p_Cuenta", OracleDbType.Int64));
command.Parameters["p_Cuenta"].Value = cuenta;
command.Parameters.Add(new OracleParameter("p_Fecha", OracleDbType.Date));
command.Parameters["p_Fecha"].Value = fecha;

command.Parameters.Add("p_Detalle", OracleDbType.Varchar2, ParameterDirection.Output);            

OracleConnectionHolder connection = null;

connection = this.GetConnection();
command.Connection = connection.Connection;
command.CommandTimeout = 30;
command.CommandType = CommandType.StoredProcedure;
OracleDataReader lector = command.ExecuteReader();

while (lector.Read())
{
    liquidacion += ((OracleString)command.Parameters["p_Detalle"].Value).Value;
}

Дело в том, что когда я пытаюсь вставить значение в параметр "Феча" (это дата), код выдает мне эту ошибку (когда выполняется строка command.ExecuteReader();)

Oracle.DataAccess.Client.OracleException : ORA-06502: PL/SQL: numeric or value error
ORA-06512: at "SYSTEM.LIQUIDACION_OBTENER", line 9
ORA-06512: at line 1

Я пробовал с датой и временем, и проблема не была, я пробовал без входных параметров и только с выходными данными, и все еще получал ту же ошибку. Видимо проблема в выходном параметре. Я уже пытался поместить p_Detalle OUT VARCHAR2 вместо p_Detalle OUT LIQUIDACION.FILADETALLE% TYPE, но он тоже не работал

Надеюсь, мой пост понятен .. спасибо !!!!!!!!!!

Ответы [ 4 ]

2 голосов
/ 30 марта 2010

Из чего выводится:

DESC LIQUIDACION

Правильное обозначение выходного параметра:

p_Detalle OUT LIQUIDACION.FILADETALLE%TYPE

... так что проблема остается в коде C # при преобразовании типа данных Oracle в его одноуровневый элемент .NET. Я видел это раньше, при использовании Java ...

Ранее


Если тип данных LIQUIDACION.filafecha - VARCHAR2 / etc (не DATE), используйте:

SELECT la.filadeetaile
  INTO p_Detalle
  FROM LIQUIDACION la
 WHERE la.filacuenta = p_Cuenta
   AND la.filafecha = TO_CHAR(p_Fecha, 'YYYY-MON-DD');

... или вы можете изменить параметр в соответствии с типом данных:

p_Fecha IN LIQUIDACION.filafecha%TYPE

... и исправьте код C # для передачи правильной информации.

В идеале столбец даты должен иметь тип данных DATE ...

0 голосов
/ 01 апреля 2010

Похоже, вы не определяете размер выходного параметра:

command.Parameters.Add("p_Detalle", OracleDbType.Varchar2, ParameterDirection.Output);            

Я не знаю, что по умолчанию использует ADO, но он явно меньше длины LIQUIDACION.FILADETALLE%TYPE. Oracle отбрасывает ORA-06502, когда получающая переменная слишком мала или имеет неправильный тип данных. Попробуйте что-то вроде (настройка размера в соответствии с определением столбца базы данных):

command.Parameters["p_Detalle"].Size = 20;
0 голосов
/ 30 марта 2010

Возможно ... это может быть проблемой. Попробуйте использовать функцию Oracle to_date для соответствия формату даты.

Если это не сработает, в крайнем случае измените параметр на varchar и передайте дату в виде строки в хранимую процедуру. Используйте to_date внутри Oracle.

Таким образом, ваша хранимая процедура будет:

CREATE OR REPLACE PROCEDURE "LIQUIDACION_OBTENER" (
p_Cuenta IN NUMBER, 
p_Fecha IN VARCHAR,
p_Detalle OUT LIQUIDACION.FILADETALLE%TYPE
) IS

BEGIN 

    SELECT 
        FILADETALLE
    INTO
        p_Detalle
    FROM 
        Liquidacion
    WHERE 
        (FILACUENTA = p_Cuenta)
        AND (FILAFECHA = to_date(p_Fecha, 'yyyy-MON-dd'));

END;

Oracle / PLSQL: функция To_Date

0 голосов
/ 30 марта 2010

Попробуйте использовать to_date (p_fecha, 'yyyy-mmm-dd') при установке параметра:

  command.Parameters["p_Fecha"].Value = to_date(fecha, 'yyyy-MON-dd');
...