【问题标题】:ORA-06502: PL/SQL: numeric or value error: character string buffer too small exception from C# codeORA-06502: PL/SQL: 数字或值错误: C# 代码中的字符串缓冲区太小异常
【发布时间】:2014-03-20 22:06:49
【问题描述】:

我正在尝试使用 asp.net 上 # 代码中的 in 和 out 参数执行一些 oracle pl/sql 过程。我想从 out 参数中检索值。但是当我执行时,我得到一个 oracle 异常,例如“ORA-06502:PL/SQL:数字或值错误:字符串缓冲区太小”。我现在该怎么办?请帮帮我。

代码:

using Oracle.DataAccess.Client;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace Activity.Account
{
    public partial class WebForm1 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            SuccessLabel.Visible = false;
            FailureLabel.Visible = false;
        }

        protected void Create_user(object sender, EventArgs e)
        {
            var id="";
            string oradb = "Data Source=OracleServerHost;User ID=scott;password=tiger";
            using (OracleConnection conn = new OracleConnection(oradb))
            {
                try
                {
                    OracleCommand cmd = new OracleCommand();
                    cmd.Connection = conn;
                    cmd.CommandText = "create_users_372640";
                    cmd.CommandType = CommandType.StoredProcedure;
                    OracleParameter p1 = new OracleParameter("u_user_id", UserIDTextBox.Text.TrimEnd());
                    OracleParameter p2 = new OracleParameter("u_First", FirstNameTextBox.Text.TrimEnd());
                    OracleParameter p3 = new OracleParameter("u_Last", LastNameTextBox.Text.TrimEnd());
                    OracleParameter p4 = new OracleParameter("u_Email", EmailIDTextBox.Text.TrimEnd());
                    OracleParameter p5 = new OracleParameter("u_password", PasswordTextBox.Text.TrimEnd());
                    cmd.Parameters.Add(p1);
                    cmd.Parameters.Add(p2);
                    cmd.Parameters.Add(p3);
                    cmd.Parameters.Add(p4);
                    cmd.Parameters.Add(p5);
                    OracleCommand cmd_chk = new OracleCommand();
                    cmd_chk.Connection = conn;
                    cmd_chk.CommandText = "check_user_372640";
                    cmd_chk.CommandType = CommandType.StoredProcedure;
                    OracleParameter p6 = new OracleParameter("user_id", UserIDTextBox.Text.TrimEnd());
                    cmd_chk.Parameters.Add(p6);
                    cmd_chk.Parameters.Add("id", OracleDbType.Varchar2).Direction = ParameterDirection.Output;
                    conn.Open();
                    cmd_chk.ExecuteNonQuery();
                    id=(string)cmd_chk.Parameters["id"].Value;
                    //OracleDataReader rd = cmd_chk.ExecuteReader();
                    if (id != null && id != "")
                    {
                        //rd.Read();
                        SuccessLabel.Visible = false;
                        FailureLabel.Visible = true;
                    }
                    else
                    {
                        cmd.ExecuteNonQuery();
                        SuccessLabel.Visible = true;
                        FailureLabel.Visible = false;    
                    }
                }catch(Exception){
                    Console.WriteLine("SQL Exception Occured");
                }
            }

        }
    }
}

我的预言机程序是:

create or replace procedure check_user_372640(
user_id in varchar2,
id out varchar2
)
as
u_id varchar2(20);
begin
select user_id into u_id from ACTIVITY_USERS_372640 where user_id=user_id;
id:=u_id;
end;

【问题讨论】:

    标签: c# asp.net oracle plsql


    【解决方案1】:

    它现在对我有用。 错误是我已将参数“Id”声明为 varchar2。但我没有给出任何大小。 现在我已经为参数声明了最大尺寸并且它工作正常。

     cmd_chk.Parameters.Add("id", OracleDbType.Varchar2,32767).Direction = ParameterDirection.Output;
    

    【讨论】:

      【解决方案2】:

      在将看跌值声明为 Varchar2 时遇到了同样的问题。将 Size 属性添加到 Parameter 解决了这个问题。

      command.CommandType = CommandType.StoredProcedure;
      command.CommandText = "function_name";    
      command.Parameters.Add(new OracleParameter
                              {
                                  ParameterName = "result",
                                  Size = 1,
                                  Direction = ParameterDirection.ReturnValue,
                                  OracleDbType = OracleDbType.Varchar2
                              });
      

      【讨论】:

        【解决方案3】:

        我们遇到的另一个与此相关的策略是使用 Oracle 函数,用于特殊的 ParameterDirection.ReturnValue(*** ParameterDirection 的所有其余部分都将起作用)

        如果你像下面这样贴花,直接在构造函数中它不起作用

        cmd.Parameters.Add(new OracleParameter("myretval", OracleDbType.Long, 10, ParameterDirection.ReturnValue));

        导致如下错误:

        ORA-06502: PL/SQL: numeric or value error: character string buffer too small
        ORA-01403: no data found
        ORA-06512: at line 1
        

        如果你这样声明它它可以工作

        OracleParameter retval = (new OracleParameter("myretval", OracleDbType.Long, 10);
                    retval.Direction = ParameterDirection.ReturnValue;
                    cmd.Parameters.Add(retval);
        

        【讨论】:

        • 正是我需要的。谢谢!
        【解决方案4】:

        问题源于使用固定长度字符串 Char。 不知道在哪里,但是在你的代码中的某个地方你尝试放置一个 Char 或 varchar2 长度为 N 的字符串转换为长度为 M 的字符,其中 M > N。

        【讨论】:

          【解决方案5】:

          你可以试试 锚定数据类型,例如 %type.
          语法:- tablename.colname%type.

          【讨论】:

            【解决方案6】:

            你需要增加u_id的大小

            u_id varchar2(4000);
            

            【讨论】:

              猜你喜欢
              • 2013-09-14
              • 2011-03-31
              • 2021-11-15
              • 1970-01-01
              • 2011-11-25
              • 1970-01-01
              • 2018-03-16
              • 2015-05-16
              相关资源
              最近更新 更多