2012-03-09 11 views
0

なしSYS_REFCURSOR機能を実行することはできません私はパラメータ

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

ようにパッケージ

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; 

、これを呼び出すネットの方法でこのSYS_REFCURSOR機能を持ってここに私は関数を呼び出す方法は次のとおりです。

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 Developerでも実行されても問題ありません。

私は間違っていますか?

+1

このメソッドが「パラメータで呼び出されたときにうまくいく」と言うと、パラメータを取る関数の例と、上記の 'fRefCursor'メソッドを使ってどのように呼び出すのか? –

答えて

0

これは、パラメータなしで関数を呼び出すことはできないが、nullパラメータで呼び出すことができるからです。あなたが任意のパラメータを入力しないときは、現在呼び出していることです。

FRCBAANCOMPANIES; 

、これが最初のケースオラクルで

variable := FRCBAANCOMPANIES; 

とは異なっているが任意のリターンなしと第二の手順を探していますあなたの関数を呼び出す場合。したがって、必要でない場合でもreturnパラメータを設定する必要があります。