ORA-06502: PL/SQL: 숫자 또는 값 오류: 문자열 버퍼가 C# 코드에서 너무 작은 예외입니다.
asp.net 에서 #code의 매개 변수 내/외로 오라클 pl/sql 프로시저를 실행하려고 합니다.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");
}
}
}
}
}
내 오라클 프로시저는 다음과 같습니다.
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;
지금은 제게 효과가 있습니다.실수로 매개 변수 "Id"를 varchar2로 선언했습니다. 그러나 저는 그것에 어떤 크기도 주지 않았습니다.이제 max size를 parameter에 선언했고 잘 작동합니다.
cmd_chk.Parameters.Add("id", OracleDbType.Varchar2,32767).Direction = ParameterDirection.Output;
출력 값을 Varchar2로 선언할 때 동일한 문제가 발생했습니다.매개 변수에 Size 속성을 추가하면 문제가 해결됩니다.
command.CommandType = CommandType.StoredProcedure;
command.CommandText = "function_name";
command.Parameters.Add(new OracleParameter
{
ParameterName = "result",
Size = 1,
Direction = ParameterDirection.ReturnValue,
OracleDbType = OracleDbType.Varchar2
});
이와 관련된 또 다른 문제는 특별한 ParameterDirection에 대한 Oracle 기능입니다.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);
문제는 고정 길이 문자열인 Char를 사용하는 것에서 비롯됩니다.어디에 있는지는 확실하지 않지만 코드 어딘가에 길이 N의 Char 또는 varchar2 문자열을 M > N인 length M의 Char에 넣으려고 합니다.
다음과 같은 앵커링된 데이터 타입으로 시도해 볼 수 있습니까?%type.
구문 :-tablename.colname%type.
당신은 크기를 늘릴 필요가 있습니다.u_id
u_id varchar2(4000);
언급URL : https://stackoverflow.com/questions/21899765/ora-06502-pl-sql-numeric-or-value-error-character-string-buffer-too-small-exc
'programing' 카테고리의 다른 글
| JPA 최대 절전 모드 지속성 예외 [Persistence Unit: default] 최대 절전 모드 세션 팩토리를 만들 수 없습니다. (0) | 2023.11.07 |
|---|---|
| vue.js를 마우스오버 또는 호버링합니다. (0) | 2023.11.07 |
| mysql 쿼리에서 오프셋 및 제한을 사용하여 순서 추가 (0) | 2023.11.07 |
| npm 스크립트를 사용하여 js 파일을 어떻게 실행합니까? (0) | 2023.11.07 |
| 문자열이 null로 종료되는 이유는 무엇입니까?또는: null-terminal vs. 문자 + 길이 저장 (0) | 2023.11.07 |