2013-10-10 25 views
7

Yeniden imleci döndüren Oracle saklı yordamını aramaya çalışıyorum ve bu döndürülen verilerden ağaç görünümü oluşturmam gerekiyor. Bu konuda yeniyim ve iki problemim var.Yeniden imleci döndüren Oracle saklı yordamı nasıl çağırılır

İlk sorun ben bu yordamı çağırmak mümkün değilim olmasıdır. Bu hatayı alıyorum: "'OBJECT_HIERARCHY'"

'a yapılan çağrıda yanlış numara veya türde bağımsız değişkenler ve ikinci sorunum, bu yordamın bir ref imleç değeri döndürdüğünde bu verileri nasıl alacağımı anlamadığım ? Orada o tabloda daha sonra 5000 kayıtlarıdır ve ben bu verileri, ancak bir ref imleç değerinin almıyorum. Birisi lütfen bu verileri nasıl imleç değeriyle alabileceğimi açıklayabilir. Oracle ile hiç tecrübem yok.

Bu

prosedür oracle tanımı şöyledir: Bu tablo alanı tanımları vardır

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) 

ve bu hata döndürür benim kodudur:

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

birisi Can bana yardım ve bu hatayı dönen kodum neden bana açıklayabilir: bağımsız değişken "yanlış numara veya türlerini de Eğer OUT sağlamak gidiyoruz 'OBJECT_HIERARCHY'"

cevap

4

Sesleniyorum .NET deyimi sunucuya gönderildiğinde bu parametreleri isim gitmiyor çünkü hem nParentId sağlamak gerekir.

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

Son olarak, çalıştı. Teşekkür ederim. Ben bunu sorunuzda okuyordu, ben senin yazılan bu düzenlemeyi geri alındı ​​ettik kodu – user2718165

+0

düzeltmek için ilk yazı düzenlenebilir ve neyin yanlış olduğunu çözemedim. Sorunu olduğu zaman olduğu gibi bırak. – krillgar

8

Örnek:

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