没有参数,无法执行sys_refcursor函数

时间:2012-03-09 18:21:56

标签: oracle oracle11g odp.net

我在包

中有这个sys_refcursor函数
function frcBaanCompanies return SYS_REFCURSOR is
 x sys_refcursor;
begin
  open x for select t$comp, t$cpnm from baan.tttaad100000 order by t$comp;
  return x;
end;

和一个调用它的网络方法

listBox1.DataSource = lO.fRefCursor("priceWorx.frcBaanCompanies", null, false).Tables[0];

以下是我如何调用该函数:

public DataSet fRefCursor(String refCursorName, IDictionary<string, string> prms, bool leaveConnectionOpen = true)
{
    try
    {
        using (OracleCommand cmd = new OracleCommand("", conn))
        {
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.CommandText = refCursorName;
            if (prms!=null) SetupParams(refCursorName, cmd, prms);
            using (OracleDataAdapter da = new OracleDataAdapter(cmd))
            {
                if (conn.State != ConnectionState.Open)
                {
                    conn.Open();
                    cmd.Connection = conn;
                }
                using (DataSet ds = new DataSet())
                {
                    da.Fill(ds);
                    return ds;
                }
            }
        }
    }
    catch (Exception ex)
    {
        Debugger.Break();
        Debug.WriteLine(ex);
        return null;
    }
    finally
    {
        if (!leaveConnectionOpen) conn.Close();
    }
}

使用参数调用时,同样的方法工作正常(其他一些游标函数,但是

失败)

ORA-06550:第1行第7栏: PLS-00221:'FRCBAANCOMPANIES'不是程序或未定义 ORA-06550:第1行第7列: PL / SQL:忽略语句

在(Oracle)sql开发人员中执行时也能正常工作..

我做错了什么?

1 个答案:

答案 0 :(得分:0)

这是因为您无法在没有参数的情况下调用函数,但可以使用null参数调用它。当您不输入任何参数时,您当前正在调用的是:

FRCBAANCOMPANIES;

这与

不同
variable := FRCBAANCOMPANIES;

在第一种情况下,oracle正在寻找一个没有任何返回的程序,在第二种情况下,你会调用你的函数。因此,如果您不需要,还必须设置返回参数。