#asp.netのコードからのinパラメータとoutパラメータを使用して、いくつかのOracle pl/sqlプロシージャを実行しようとしています。出力パラメーターから値を取得したいのですが。しかし実行すると、「ORA-06502:PL/SQL:数値または値のエラー:文字列バッファが小さすぎます」などのOracle例外が発生します。私を助けてください。
コード:
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;
それは今私のために働いています。間違いは、パラメーター「Id」をvarchar2として宣言したことです。しかし、私はそれにどんなサイズも与えませんでした。これで、パラメーターの最大サイズとその正常な動作を宣言しました。
cmd_chk.Parameters.Add("id", OracleDbType.Varchar2,32767).Direction = ParameterDirection.Output;
これに関連して私たちがRANするもう1つの戦略は、特別なParameterDirection.ReturnValueのためのOracle関数です(*** 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);
出力値を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
});
この問題は、固定長の文字列であるCharを使用することに起因します。どこにあるかわからないが、コードのどこかで、長さNのCharまたはvarchar2文字列をlengh Mのcharに入れようとしている(M> N)。
u_id
のサイズを増やす必要があります
u_id varchar2(4000);
%type.
のようなアンカーされたデータ型で試すことができますか
構文:-tablename.colname%type.