【问题标题】:Problem with oracle stored procedure - parametersoracle存储过程的问题-参数
【发布时间】:2011-02-02 15:07:18
【问题描述】:

我有这个存储过程:

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

我尝试使用 datetime 并没有出现问题,我尝试了没有输入参数而只有输出,但仍然出现相同的错误。显然问题出在输出参数上。 我已经尝试使用 p_Detalle OUT VARCHAR2 而不是 p_Detalle OUT LIQUIDACION.FILADETALLE%TYPE 但它也不起作用

我希望我的帖子是可以理解的.. 谢谢!!!!!!!!!!!!

【问题讨论】:

  • 更新了我的答案 - 我们需要详细信息来进一步帮助您。

标签: sql oracle datetime ora-06502


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    输出是什么:

    DESC LIQUIDACION
    

    你的输出参数符号是正确的:

    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 数据类型...

    【讨论】:

    • 显然问题是输出参数!再次阅读我的帖子,我编辑了它(对不起,我是新人,不知道如何做得很好)
    【解决方案3】:

    可能...这可能是问题所在。尝试使用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

    【讨论】:

    • 显然问题是输出参数!再次阅读我的帖子,我编辑了它(对不起,我是新人,不知道如何做得很好)
    【解决方案4】:

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

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

    【讨论】:

    • 我看到月份的格式掩码是MON而不是MMM,那么你必须使用yyyy-mon-dd
    • 显然问题是输出参数!再次阅读我的帖子,我编辑了它(对不起,我是新人,不知道如何做到这一点)
    猜你喜欢
    • 2011-01-11
    • 2020-09-27
    • 1970-01-01
    • 2013-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-12
    • 1970-01-01
    相关资源
    最近更新 更多