oracle ORA-06502:PL/SQL:数值或值错误:字符串缓冲区太小C#代码异常

jtw3ybtb  于 2023-10-16  发布在  Oracle
关注(0)|答案(7)|浏览(194)

我正在尝试执行一些oracle pl/sql过程,带有ASP.NET上# code的in和out参数。我想从out参数中获取值。但是当我执行时,我得到了一个像“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");
                }
            }

        }
    }
}

我的oracle程序是:

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;
8ljdwjyq

8ljdwjyq1#

它现在为我工作。错误是我将参数“Id”声明为varchar2。但我没有给它任何尺寸的给予。现在我已经声明了参数的max size,它工作正常。

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

to94eoyn2#

在声明输出值为Varchar2时面临同样的问题。为Parameter添加Size属性解决了此问题。

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

8gsdolmq3#

我们遇到的另一个与此相关的奇怪的事情是Oracle函数,对于特殊的参数方向.返回值(* 所有其余的参数方向将工作)
如果你像下面这样标记它,直接在构造函数中它不工作
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);
von4xj4u

von4xj4u4#

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

bqucvtff

bqucvtff5#

你能尝试像%type.这样的锚定数据类型吗?
语法:-tablename.colname%type.

m0rkklqb

m0rkklqb6#

你需要增加u_id的大小

u_id varchar2(4000);
vi4fp9gy

vi4fp9gy7#

对我来说,这是因为过程的名称比C#预期的要大。我不知 prop 体原因,但我已经减少了过程名称的大小,它工作了。

相关问题