在C#中调用来自oracle的函数给出错误

时间:2015-09-30 07:07:56

标签: c# oracle oracle11g

我从oracle包调用一个函数,它将返回一个字符串,如下所示

using(OracleConnection con = AppConn.Connection)
{
    OracleCommand cmd = con.CreateCommand();
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.Connection = con;
    cmd.CommandText = "select P_Pkg.found(@p_id) from dual";
    OracleParameter p_id = new OracleParameter();
    p_id.OracleDbType = OracleDbType.Int64;
    p_id.Direction = ParameterDirection.Input;
    p_id.Value = requestHeader.approval_id;

    cmd.Parameters.Add(p_id);
    try
    {
        con.Open();
        string found = cmd.ExecuteScalar().ToString();

    }
    catch(Exception ex)
    {

    }
    finally
    {
        con.Close();
    }
}

但我收到以下错误。经过大量搜索,我无法找到问题所在。请帮忙。

  

ORA-06550:第1行,第51栏:

     

PL / SQL:ORA-00936:缺少表达式

     

ORA-06550:第1行,第7栏:

oracle中的函数签名

P_Pkg.found(p_id IN NUMBER) 
RETURN varchar2 //(YES , NO)

我从oracle运行这个如下所示,得到的结果没有任何错误

select P_Pkg.found(1053) from dual

2 个答案:

答案 0 :(得分:3)

问题在于使用SQL Server特定的参数/绑定变量前缀。 Oracle使用:代替@。 SQL解析器现在无法理解您的查询。

请改用此代码:

select P_Pkg.found(:p_id) from dual

答案 1 :(得分:3)

要调用存储过程,只需将命令文本设置为存储过程名称,然后使用正确的名称添加参数

using (OracleConnection con = new OracleConnection(AppConn.Connection))
{
    using (OracleCommand cmd = con.CreateCommand())
    {
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Connection = con;
        cmd.CommandText = "P_Pkg.found";
        OracleParameter p_id = new OracleParameter();
        p_id.ParameterName = "p_id";
        p_id.OracleDbType = OracleDbType.Int64;
        p_id.Direction = ParameterDirection.Input;
        p_id.Value = requestHeader.approval_id;
        OracleParameter retVal = new OracleParameter();
        retVal.ParameterName = "ReturnValue";
        retVal.OracleDbType = OracleDbType.Varchar2; // Whatever the type the SP returns
        retVal.Direction = ParameterDirection.ReturnValue;

        cmd.Parameters.Add(p_id);
        cmd.Parameters.Add(retVal);
        try
        {
            con.Open();
            cmd.ExecuteNonQuery();
            string found = cmd.Parameters["ReturnValue"].Value.ToString();
        }
        catch (Exception ex)
        {

        }
        finally
        {
            con.Close();
        }
    }
}