2013-10-10 10 views
7

refカーソルを返すOracleストアドプロシージャを呼び出そうとしています。返されたデータからツリービューを生成する必要があります。私はこれで新しく、私には2つの問題があります。refカーソルを返すOracleストアドプロシージャを呼び出す方法

最初の問題は、私がその手順を呼び出すことができないということです。私はこのエラーが発生しています: "OBJECT_HIERARCHY 'への呼び出しで間違った数または引数の型"

そして、私の2番目の問題は、このプロシージャがREFカーソル値を返すときに、 ?そのテーブルには5000レコード以上あり、そのデータは取得していませんが、REFカーソル値です。誰かがrefカーソル値でそのデータを取得する方法を説明してください。私はOracleの経験がありません。

これは、Oracleの手順の定義です:

CREATE OR REPLACE PROCEDURE SAD.object_hierarchy 
(nAppId IN NUMBER, 
nParentId IN NUMBER DEFAULT -1, 
o_cRefCursor OUT SYS_REFCURSOR) 
IS 
BEGIN 
IF NOT o_cRefCursor%ISOPEN THEN 

    OPEN o_cRefCursor FOR 
    SELECT 
     h.PARENT_ID, h.CHILD_ID, h.H_LEVEL, 
     o.OBJECT_IDENTIFIER, o.OBJECT_TYPE_ID 
    FROM 
    (
     SELECT 
      PARENT_ID, CHILD_ID, LEVEL AS H_LEVEL 
     FROM OBJECT_RELATIONSHIPS 
     START WITH PARENT_ID = nParentId --> -1 --= 60170 
     CONNECT BY PRIOR CHILD_ID = PARENT_ID 
    ) h 
    INNER JOIN 
     OBJECTS o 
     ON 
      o.OBJECT_ID = h.CHILD_ID AND 
      O.APPLICATION_ID = nAppId; 
END IF; 
END object_hierarchy; 

は、これらは、テーブルのフィールド定義

Column Name    Data Type    

OBJECT_REL_ID   NUMBER (14)      
PARENT_ID    NUMBER (14)      
CHILD_ID     NUMBER (14)      
OBJECT_IDENTIFIER  VARCHAR2 (255 Byte)  
OBJECT_TYPE_ID   VARCHAR2 (5 Byte) 

であり、これはエラーを返します私のコードです:

  string oradb = "Data Source=(DESCRIPTION=" 
     + "(ADDRESS=(PROTOCOL=TCP)(HOST=tnt33)(PORT=1521))" 
     + "(CONNECT_DATA=(SERVICE_NAME=ORCL)));" 
     + "User Id=xxx;Password=xxxxx;"; 
     OracleConnection con = new OracleConnection(oradb); 

     try 
     { 
      con.Open(); 
      OracleCommand cmd = new OracleCommand(); 
      cmd.Connection = con; 
      cmd.CommandType = System.Data.CommandType.StoredProcedure; 
      cmd.CommandText = "SAD.object_hierarchy"; 
      cmd.Parameters.Add("nAppId", OracleDbType.Int16).Value = 1; 
      OracleParameter oraP = new OracleParameter(); 
      oraP.OracleDbType = OracleDbType.RefCursor; 
      oraP.Direction = System.Data.ParameterDirection.Output; 
      cmd.Parameters.Add(oraP); 
      OracleDataReader reader = cmd.ExecuteReader(); 

      while (reader.Read()) 
      { 

      } 
      reader.Close();  
     } 
     catch (Exception ex) 
     { 

      con.Close(); 
     } 

ができる人私の手助けをしてください、なぜ私のコードがこのエラーを返すのかを私に説明してください: "間違った数または引数の型

答えて

4

OUTを指定する場合は、nParentIdも指定する必要があります。これは、ステートメントがサーバーに送信されるときに.NETがこれらのパラメーターに名前を付けることがないためです。

cmd.Parameters.Add("nParentId", OracleDbType.Int16).Value = -1; 
+1

は最後に、それが働きました。ありがとうございました。コードを修正するために私の最初の投稿を編集しました – user2718165

+0

あなたの質問を読んでいて、何が間違っていたのか分からなかったので、あなたの投稿にその編集をロールバックしました。あなたが問題を抱えていたときのように質問を残してください。 – krillgar

8

例:

string connStr = "Data Source=datasource;Persist Security Info=True;User ID=user;Password=pass;Unicode=True"; 
DataSet dataset = new DataSet(); 

string connStr = ConfigurationManager.ConnectionStrings["OracleConn"].ToString(); 

using (OracleConnection objConn = new OracleConnection(connStr)) 
{ 
    OracleCommand objCmd = new OracleCommand(); 
    objCmd.Connection = objConn; 
    objCmd.CommandText = "Oracle_PkrName.Stored_Proc_Name"; 
    objCmd.CommandType = CommandType.StoredProcedure; 
    objCmd.Parameters.Add("Emp_id", OracleType.Int32).Value = 3; // Input id 
    objCmd.Parameters.Add("Emp_out", OracleType.Cursor).Direction = ParameterDirection.Output; 

    try 
    { 
     objConn.Open(); 
     objCmd.ExecuteNonQuery(); 
     OracleDataAdapter da = new OracleDataAdapter(objCmd); 
     da.Fill(dataset);     
    } 
    catch (Exception ex) 
    { 
     System.Console.WriteLine("Exception: {0}", ex.ToString()); 
    } 
    objConn.Close(); 
} 
関連する問題