2010-08-03 24 views
0

我有一個Oracle函數返回一個記錄集。 我向Oracle函數中引入了參數,導致前端代碼出現故障。在Oracle軟件包中使用參數。 ODP .NET

這是我的前端代碼。

OracleCommand od = oc.CreateCommand(); 
      od.CommandType = System.Data.CommandType.Text; 
      od.CommandText = " select * from table(pkg_fetchPOInfo.getPORowsTable(:1,:2))"; 
      //od.CommandText = "pkg_fetchPOInfo.getPORowsTable"; 
      //od.CommandType = System.Data.CommandType.TableDirect; 

      OracleParameter op1 = new OracleParameter(); 
      op1.ParameterName = "1"; 
      op1.OracleDbType = OracleDbType.Varchar2; 
      op1.Direction = System.Data.ParameterDirection.Input; 
      op1.Size = 6; 
      op1.Value = strPONumber; 
      od.Parameters.Add(op1); 

      OracleParameter op2 = new OracleParameter(); 
      op2.ParameterName = "2"; 
      op2.OracleDbType = OracleDbType.Varchar2; 
      op2.Direction = System.Data.ParameterDirection.Input; 
      op2.Size = 3; 
      op2.Value = "US"; 
      od.Parameters.Add(op2); 

如果我在前端SQLPLUS執行查詢,我得到一個記錄集。 如果我從軟件包和前端代碼中刪除參數,此代碼將起作用。

select * from table(pkg_fetchPOInfo.getPORowsTable('1007446','US')); - SQLPLUS中的工作。

select * from table(pkg_fetchPOInfo.getPORowsTable()); - 在兩個地方工作。

我是不正確地分配參數嗎?

+0

一兩件事:我發現,如果我不使用參數綁定,它會與這方面的工作碼。 string formSQL =「Select * from table(pkg_fetchPOInfo.getPORowsTable(''+ strPONumber +'','US'))」; od.CommandType = System.Data.CommandType.Text; od.CommandText = formSQL; – abhi 2010-08-03 18:11:00

+0

如果您更詳細地解釋「正在進行干擾」 – 2013-02-15 15:19:06

回答

0

包定義:

CREATE OR REPLACE 
PACKAGE TESTP AS 
    function TESTPIPE(nr in number, nr2 in number) return varchartabletype pipelined; 
END TESTP; 

CREATE OR REPLACE 
PACKAGE BODY TESTP AS 

    function TESTPIPE(nr in number, nr2 in number) return varchartabletype pipelined AS 
     CURSOR TESTPIPE_cur 
     IS 
      SELECT (level + 1) datam 
      FROM dual 
      connect by level < nr; 
     vtt varchartabletype ; 

    BEGIN 
      OPEN TESTPIPE_cur; 

      LOOP 
       FETCH testpipe_cur 
       BULK COLLECT INTO vtt LIMIT nr2; 

       FOR indx IN 1 .. vtt.COUNT 
       LOOP 
        Pipe Row (vtt(indx)) ; 
       END LOOP; 

       EXIT WHEN testpipe_cur%NOTFOUND; 
      END LOOP; 

    END TESTPIPE; 

END TESTP; 

.NET代碼:

public static void pipeTest() 
{ 
    String conString = GetConnectionString(); 
    OracleConnection _conn = new OracleConnection(conString); 
    _conn.Open(); 
    OracleCommand oCmd = new OracleCommand(); 
    oCmd.CommandText = "begin open :crs for Select * from table(testp.testpipe(:nr,:nr2)); end;"; 

    oCmd.CommandType = CommandType.Text ; 
    oCmd.Connection = _conn; 

    OracleParameter crs = new OracleParameter(); 
    crs.OracleDbType = OracleDbType.RefCursor; 
    crs.Direction = ParameterDirection.Output; 
    crs.ParameterName = "crs"; 
    oCmd.Parameters.Add(crs); 

    OracleParameter nr = new OracleParameter(); 
    nr.OracleDbType = OracleDbType.Int64; 
    nr.Direction = ParameterDirection.Input ; 
    nr.ParameterName = "nr"; 
    nr.Value = 25; 
    oCmd.Parameters.Add(nr); 

    OracleParameter nr2 = new OracleParameter(); 
    nr2.OracleDbType = OracleDbType.Int64; 
    nr2.Direction = ParameterDirection.Input; 
    nr2.ParameterName = "nr2"; 
    nr2.Value = 10; 
    oCmd.Parameters.Add(nr2); 

    using (OracleDataReader MyReader = oCmd.ExecuteReader()) 
    { 
     int ColumnCount = MyReader.FieldCount; 
     // get the data and add the row 
     while (MyReader.Read()) 
     { 
      String s = MyReader.GetOracleValue(0).ToString(); 
      Console.WriteLine(string.Format("i={0}", s)); 
     } 
    } 
    Console.ReadLine(); 
} 
+0

在OTN論壇中發現此問題將會很有幫助。 – abhi 2010-08-10 12:24:03