Использование параметров с пакетами Oracle. ODP .NET - PullRequest
0 голосов
/ 03 августа 2010

У меня есть функция Oracle, которая возвращает набор записей.Я ввел параметры в функцию Oracle, и это заставляет код переднего плана становиться бесполезным.

Вот мой код переднего плана.

 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 ());- работает в обоих местах.

Неправильно ли я назначаю параметры?

1 Ответ

0 голосов
/ 10 августа 2010

Определение пакета:

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