2013-10-10 16 views
7

Tôi đang cố gắng gọi thủ tục lưu sẵn Oracle trả về con trỏ ref và tôi cần tạo chế độ xem dạng cây từ dữ liệu được trả về đó. Tôi mới ở đây và tôi có hai vấn đề.Cách gọi thủ tục lưu sẵn Oracle trả về con trỏ ref

Vấn đề đầu tiên là tôi không thể gọi thủ tục đó. Tôi nhận được lỗi này: "sai số hoặc loại đối số trong cuộc gọi đến" OBJECT_HIERARCHY '"

Và vấn đề thứ hai của tôi là tôi không hiểu làm thế nào tôi sẽ nhận được dữ liệu đó khi thủ tục này trả về giá trị con trỏ ref ? Có hơn 5000 bản ghi trong bảng đó và tôi không nhận được dữ liệu đó, mà là giá trị con trỏ ref. Ai đó có thể vui lòng giải thích làm thế nào tôi có thể nhận được dữ liệu với giá trị con trỏ ref. Tôi không có kinh nghiệm với Oracle.

Đây là định nghĩa thủ tục trong 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; 

đây là những định nghĩa lĩnh vực bảng

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) 

và đây là mã của tôi mà trả về lỗi:

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

Có thể ai đó hãy giúp tôi và giải thích cho tôi tại sao mã của tôi trả lại lỗi này: "số sai hoặc các loại đối số trong hãy gọi tới 'OBJECT_HIERARCHY' "

Trả lời

4

Nếu bạn định cung cấp OUT, bạn cũng cần phải cung cấp nParentId vì .NET sẽ không đặt tên cho các tham số đó khi báo cáo được gửi tới máy chủ.

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

Cuối cùng, nó làm việc. Cảm ơn bạn. Tôi đã chỉnh sửa bài đăng đầu tiên của mình để sửa mã số – user2718165

+0

Tôi đã khôi phục bản chỉnh sửa đó cho bài đăng của bạn, khi tôi đọc qua câu hỏi của bạn và không thể tìm ra điều gì sai. Để lại câu hỏi như khi bạn gặp vấn đề. – krillgar

8

Ví dụ:

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(); 
} 
Các vấn đề liên quan