使用C#执行Oracle存储过程时出现错误

7

我正在尝试使用C#执行一个包含1个输入参数和2个输出参数的Oracle存储过程。

我的表格包含3列:一个整数id和两个varchar2类型的列。

以下是表格定义:

CREATE TABLE TESTTABLE 
(
  ID INT Not Null,
  FNAME VARCHAR2(200),
  LNAME VARCHAR2(200),
  Constraint PK Primary Key (ID)
);

这是我的存储过程:
create or replace PROCEDURE TESTP 
(
  tempID IN TESTTABLE.ID%Type,
  tempName Out TESTTABLE.NAME%TYPE,
  tempLName out TESTTABLE.LNAME%TYPE
) 
AS 
BEGIN
    select Name, LNAME 
    into tempName, tempLName 
    from TestTable 
    where ID = tempID;
END;

以下是从C#执行此过程的代码:

try
{
            Int32 id = 1;
            string FName = "", LName = "";

            using (_ora.GetOracleConnection())
            {
                Oracle.DataAccess.Client.OracleCommand cmd = new Oracle.DataAccess.Client.OracleCommand("TESTP", _ora.GetOracleConnection());
                cmd.CommandType = CommandType.StoredProcedure;

                cmd.Parameters.Add("tempId", Oracle.DataAccess.Client.OracleDbType.Int32,ParameterDirection.Input).Value = id;
                cmd.Parameters.Add("tempName", Oracle.DataAccess.Client.OracleDbType.Varchar2,200,ParameterDirection.Output).Value = FName;
                cmd.Parameters.Add("tempLName", Oracle.DataAccess.Client.OracleDbType.Varchar2,200,ParameterDirection.Output).Value = LName;

                cmd.ExecuteNonQuery();
            }
}
catch (Exception ex) 
{ 
     MessageBox.Show(ex.ToString());   
}

这是生成的异常:

Oracle.DataAccess.Client.OracleException ORA-06502: PL/SQL:数值或值错误
ORA-06512:位于“USMANDBA.TESTP”,第9行

有人可以帮我吗?

你可以发一下 _ora.GetOracleConnection() 的代码吗? - Felipe Oriani
这只是一个返回当前打开的OracleConnection对象的方法。 - Usman Farooq
这是连接设置的方式:con = new OracleConnection(); con.ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["MyConnection"].ConnectionString.ToString(); con.Open(); 这是方法 public OracleConnection GetOracleConnection() { return this.con; } - Usman Farooq
https://dev59.com/PGYq5IYBdhLWcg3wui_F#14248276这是一个使用Python的示例,用于在Windows上启动另一个进程并等待其完成。它使用了subprocess模块来启动进程,并使用communicate()方法来等待进程完成并获取输出。http://stackoverflow.com/a/9494824/648075这是一个使用Java的示例,用于将字符串转换为日期格式。它使用SimpleDateFormat类来指定日期格式,并使用parse()方法将字符串解析为日期对象。如果字符串格式不正确,则会抛出ParseException异常。 - BCdotWEB
你的表定义中没有“Name”字段,你是指FNAME吗?(在存储过程中)选择Name,LNAME...是不正确的。 - tbone
1个回答

2

我对你的代码进行了修改,并且已经成功:

using (connection)
{
    Int32 id = 1;
    OracleCommand cmd = new OracleCommand("TESTP", connection);
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.Parameters.Add("tempID", OracleDbType.Int32, ParameterDirection.Input).Value = id;
    cmd.Parameters.Add("tempName", OracleDbType.Varchar2, 200).Direction = ParameterDirection.Output;
    cmd.Parameters.Add("tempLName", OracleDbType.Varchar2, 200).Direction = ParameterDirection.Output;
    cmd.ExecuteNonQuery();
    string FName = cmd.Parameters["tempName"].Value.ToString();
    string LName = cmd.Parameters["tempLName"].Value.ToString();
}

您可以在Oracle存储过程中添加异常块来处理no_data_found异常并避免ORA-01403错误,就像这样:

CREATE OR REPLACE PROCEDURE TESTP (tempID  IN  TESTTABLE.ID%Type,
    tempName out TESTTABLE.NAME%TYPE, tempLName out TESTTABLE.LNAME%TYPE) AS
BEGIN
  select Name, LNAME Into tempName,tempLName from TestTable Where ID = tempID;
EXCEPTION WHEN NO_DATA_FOUND THEN
  tempName := null;
  tempLName := null;
END;

并添加额外的输出参数来通知成功或失败,并在C#代码中进行处理。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接