oracle存储过程的问题 - 参数

时间:2010-03-30 19:18:34

标签: sql oracle datetime ora-06502

我有这个存储过程:

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

当我尝试将值放入参数“Fecha”(即日期)时,代码会给我这个错误(当行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 个答案:

答案 0 :(得分:2)

来自:

的输出是什么
DESC LIQUIDACION

你有的out参数表示法是正确的:

p_Detalle OUT LIQUIDACION.FILADETALLE%TYPE

...在将Oracle数据类型转换为.NET兄弟时,将问题留在C#代码中。我以前见过它,当使用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数据类型...

答案 1 :(得分:0)

设置参数时尝试使用to_date(p_fecha,'yyyy-mmm-dd'):

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

答案 2 :(得分:0)

可能......这可能是问题所在。尝试使用Oracle to_date函数来匹配日期格式。

如果这不起作用,作为最后的手段将参数更改为varchar并将日期作为字符串传递给存储过程。在Oracle内部使用to_date。

这样你的存储过程就是:

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 Function

答案 3 :(得分:0)

您似乎没有定义输出参数的大小:

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

我不知道ADO默认的是什么,但它明显小于LIQUIDACION.FILADETALLE%TYPE的长度。当接收变量太小或数据类型错误时,Oracle会抛出ORA-06502。尝试类似(调整大小以匹配数据库列定义):

command.Parameters["p_Detalle"].Size = 20;