Невозможно выполнить функцию sys_refcursor без параметров - PullRequest
0 голосов
/ 09 марта 2012

У меня есть эта функция 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;

и метод net, вызывающий это так

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 голосов
/ 10 марта 2012

Это потому, что вы не можете вызвать функцию без параметров, но вы можете вызвать ее с нулевыми параметрами. То, что вы в данный момент вызываете, когда не вводите никаких параметров:

FRCBAANCOMPANIES;

и это отличается от

variable := FRCBAANCOMPANIES;

В первом случае oracle ищет процедуру без возврата, а во втором случае вы вызываете свою функцию. Поэтому вы должны установить возвращаемый параметр также, если он вам не нужен.

...