尝试从过程中获取数据时:PL/SQL - 数字或值错误

Posted

技术标签:

【中文标题】尝试从过程中获取数据时:PL/SQL - 数字或值错误【英文标题】:When trying to get data from Procedure : PL/SQL - Numeric or Value Error 【发布时间】:2020-09-28 07:20:54 【问题描述】:

我需要使用oracle存储过程通过c#发送和取回数据。

所以我编辑了我的参数和代码。 但是当我尝试读取数据时,执行读取器时出现错误。 oracle连接没有问题,所以我只显示我添加参数的位置 我的 C# 代码如下:

 object piece_num_id =gridViewMain.GetFocusedRowCellValue(gridViewMain.FocusedColumn);

    cmd.Parameters.Add("p_piece_num_id", OracleDbType.Int32).Value =Convert.ToInt32(piece_num_id);
    cmd.Parameters.Add("p_piece_id", OracleDbType.Varchar2).Direction = ParameterDirection.Output;
    cmd.Parameters.Add("p_material_code", OracleDbType.Varchar2).Direction = ParameterDirection.Output;
    cmd.Parameters.Add("p_steel_grade", OracleDbType.Varchar2).Direction = ParameterDirection.Output;
    cmd.Parameters.Add("p_tickness", OracleDbType.Double).Direction = ParameterDirection.Output;
    cmd.Parameters.Add("p_width", OracleDbType.Double).Direction = ParameterDirection.Output;
    cmd.Parameters.Add("p_length", OracleDbType.Double).Direction = ParameterDirection.Output;
    cmd.Parameters.Add("p_pieces_count", OracleDbType.Int32).Direction = ParameterDirection.Output;
    cmd.Parameters.Add("p_coating", OracleDbType.Varchar2).Direction = ParameterDirection.Output;
    cmd.Parameters.Add("p_paint_code", OracleDbType.Varchar2).Direction = ParameterDirection.Output;
    cmd.Parameters.Add("p_surface_type", OracleDbType.Varchar2).Direction = ParameterDirection.Output;
    cmd.Parameters.Add("p_surface_quality", OracleDbType.Varchar2).Direction = ParameterDirection.Output;
    cmd.Parameters.Add("p_quality_id", OracleDbType.Varchar2).Direction = ParameterDirection.Output;
    cmd.Parameters.Add("p_spec_no", OracleDbType.Varchar2).Direction = ParameterDirection.Output;
    cmd.Parameters.Add("p_inner_diameter", OracleDbType.Int32).Direction = ParameterDirection.Output;
    cmd.Parameters.Add("p_trapez_form", OracleDbType.Varchar2).Direction = ParameterDirection.Output;
    cmd.Parameters.Add("p_net_weight", OracleDbType.Double).Direction = ParameterDirection.Output;
    cmd.Parameters.Add("p_gross_weight", OracleDbType.Double).Direction = ParameterDirection.Output;
    cmd.Parameters.Add("p_product_name_1", OracleDbType.Varchar2).Direction = ParameterDirection.Output;
    cmd.Parameters.Add("p_product_name_2", OracleDbType.Varchar2).Direction = ParameterDirection.Output;
    cmd.Parameters.Add("p_label_text", OracleDbType.Varchar2).Direction = ParameterDirection.Output;
    cmd.Parameters.Add("p_mother_coil", OracleDbType.Varchar2).Direction = ParameterDirection.Output;
    cmd.Parameters.Add("p_reference", OracleDbType.Varchar2).Direction = ParameterDirection.Output;

    conn.Open();
    OracleDataReader dr = cmd.ExecuteReader();
    DataSet ds = new DataSet();
    OracleDataAdapter da = new OracleDataAdapter(cmd);
    da.Fill(ds);

定义一个oracle过程如下:

  PROCEDURE semifinished_lable_data(p_piece_num_id    IN INTEGER,
                                    p_piece_id        OUT STRING,
                                    p_material_code   OUT STRING,
                                    p_steel_grade     OUT STRING,
                                    p_tickness        OUT NUMBER,
                                    p_width           OUT NUMBER,
                                    p_length          OUT NUMBER,
                                    p_pieces_count    OUT NUMBER,
                                    p_coating         OUT STRING,
                                    p_paint_code      OUT STRING,
                                    p_surface_type    OUT STRING,
                                    p_surface_quality OUT STRING,
                                    p_quality_id      OUT STRING,
                                    p_spec_no         OUT STRING,
                                    p_inner_diameter  OUT NUMBER,
                                    p_trapez_form     OUT STRING,
                                    p_net_weight      OUT NUMBER,
                                    p_gross_weight    OUT NUMBER,
                                    p_product_name_1  OUT STRING,
                                    p_product_name_2  OUT STRING,
                                    p_label_text      OUT STRING,
                                    p_mother_coil     OUT STRING,
                                    p_reference       OUT STRING)

当我尝试从此过程中获取数据时, 我遇到了这个错误, 程序中的错误选择查询中似乎存在。

Oracle.ManagedDataAccess.Client.OracleException: 'ORA-06502: PL/SQL: 数值或数值错误

【问题讨论】:

【参考方案1】:

这似乎是存储过程使用的其中一个表的数据类型有问题。例如,您发送的宽度为 123,并且表中的列定义为 NUMBER(2)。您应该只检查 7 个 NUMBER 参数。

如果没有表格定义和您提供给 SP 的价值,我再准确不过了

【讨论】:

以上是关于尝试从过程中获取数据时:PL/SQL - 数字或值错误的主要内容,如果未能解决你的问题,请参考以下文章

转换为数字时的 PL/SQL 数字或值错误

获取 ORA-06502:PL/SQL:数字或值错误:SQL 触发器中的字符到数字转换错误

获取 PL/SQL:数字或值错误:字符到数字的转换错误

插入 CLOB 列时出错:ORA-06502:PL/SQL:数字或值错误

ORA-06502: PL/SQL: 在空游标的情况下出现数字或值错误

ORA-06502: PL/SQL: 数字或值错误: NULL 索引表键值