加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 07:46:15 所属栏目:百科 来源:网络整理
导读:我正在尝试使用C#执行Oracle存储过程(1个输入和2个输出参数). 我的表包含3列;整数id和2个varchar2类型列. 这是表定义: CREATE TABLE TESTTABLE ( ID INT Not Null,FNAME VARCHAR2(200),LNAME VARCHAR2(200),Constraint PK Primary Key (ID)); 这是我的存储
我正在尝试使用C#执行Oracle存储过程(1个输入和2个输出参数).

我的表包含3列;整数id和2个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",ParameterDirection.Output).Value = LName;

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

这是生成的异常:

Oracle.DataAccess.Client.OracleException ORA-06502: PL/SQL: numeric or value error
ORA-06512: at “USMANDBA.TESTP”,line 9

谁能帮我 ?

解决方法

代码中的这些修改对我有用:
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",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;

并添加额外的OUT参数,通知成功或失败,并在C#代码中处理它.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读