【问题标题】:calling a function from oracle in C# giving error在 C# 中从 oracle 调用函数给出错误
【发布时间】:2015-12-27 21:02:28
【问题描述】:

我正在从 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

【问题讨论】:

  • @patrickHofman 编辑的问题
  • 你不能将CommandText 设置为P_Pkg.found,然后添加参数给它正确的名称吗? (p_id)
  • @codroipo 怎么办?

标签: c# oracle oracle11g


【解决方案1】:

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

改用此代码:

select P_Pkg.found(:p_id) from dual

【讨论】:

  • 它给了我错误ORA-06550: line 1, column 75: PL/SQL: ORA-00933: SQL command not properly ended ORA-06550: line 1, column 7:
  • select P_Pkg.found(1053) from dual 来自 toad 工作正常
  • 你需要整个 pckg 吗?还是只有我正在调用的函数?
  • Toad 执行一条语句,在 C# 中,您告诉该命令的类型是 StoredProcedure,如果您指定 CommandText,您的语句可能有效
  • 只要一个虚拟包就可以了,如果你能用它重现问题。
【解决方案2】:

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

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();
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多