Проблема с хранимой процедурой Oracle - параметры

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

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;
/

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

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, но это тоже не сработало

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


person Nicole    schedule 30.03.2010    source источник
comment
Обновлен мой ответ - нам нужны подробности, чтобы помочь вам в дальнейшем.   -  person OMG Ponies    schedule 31.03.2010


Ответы (4)


Возможно... в этом может быть проблема. Попробуйте использовать функцию 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

person Leniel Maccaferri    schedule 30.03.2010
comment
по-видимому, проблема в выходном параметре!! прочитайте еще раз мой пост, я его отредактировал (извините, я новичок, не знаю, как это сделать очень хорошо) - person Nicole; 31.03.2010

Что получается из:

DESC LIQUIDACION

Обозначение параметра out у вас правильное:

p_Detalle OUT LIQUIDACION.FILADETALLE%TYPE

... так что проблема остается в коде С# при преобразовании типа данных 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...

person OMG Ponies    schedule 30.03.2010
comment
по-видимому, проблема в выходном параметре!! прочитайте еще раз мой пост, я его отредактировал (извините, я новичок, не знаю, как это сделать очень хорошо) - person Nicole; 31.03.2010

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

  command.Parameters["p_Fecha"].Value = to_date(fecha, 'yyyy-MON-dd');
person Douglas Lise    schedule 30.03.2010
comment
Я видел, что маска формата для месяца - MON вместо MMM, тогда вы должны использовать yyyy-mon-dd - person Douglas Lise; 30.03.2010
comment
по-видимому, проблема в выходном параметре!! прочитайте еще раз мой пост, я его отредактировал (извините, я новичок, не знаю, как это сделать очень хорошо) - person Nicole; 31.03.2010

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

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

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

command.Parameters["p_Detalle"].Size = 20;
person APC    schedule 01.04.2010