C#调用Oracle存储过程返回多结果集

OracleConnection connection = new OracleConnection(connectionString);
                --连接
                connection.Open();
                OracleCommand command = new OracleCommand();
                command.Connection = connection;
                command.CommandText = "PACK_SIIT.getFlowTrack";--存储过程名
                command.CommandType = CommandType.StoredProcedure;--设置执行为存储过程
                command.Parameters.Add("var_barcode", OracleType.VarChar, 50);
                command.Parameters.Add("cur_FirstTrial", OracleType.Cursor).Direction = ParameterDirection.Output;
                command.Parameters.Add("cur_Scan", OracleType.Cursor).Direction = ParameterDirection.Output;
                command.Parameters.Add("cur_Send", OracleType.Cursor).Direction = ParameterDirection.Output;
                command.Parameters.Add("cur_Receive", OracleType.Cursor).Direction = ParameterDirection.Output;
                command.Parameters.Add("cur_Review", OracleType.Cursor).Direction = ParameterDirection.Output;
                command.Parameters.Add("cur_Confirm", OracleType.Cursor).Direction = ParameterDirection.Output;
                command.Parameters.Add("cur_Locked", OracleType.Cursor).Direction = ParameterDirection.Output;
                command.Parameters["var_barcode"].Value = stBarcode;// "DH448400001308120004CB1";
                OracleDataAdapter daReader = new OracleDataAdapter(command);
                DataSet ds = new DataSet();
                daReader.Fill(ds);

ds.tables.count
ds.tables[i]
CREATE OR REPLACE PACKAGE pkg_page
AS
   TYPE cur_page IS REF CURSOR;
   TYPE cur_ret  IS REF CURSOR;
   PROCEDURE proc_page (p_tableName      IN     varchar2,               --表名
                        p_strColumns     IN     varchar2,         --查询的字段
                        p_strWhere       IN     varchar2,           --查询条件
                        p_strOrder       IN     varchar2,               --排序
                        p_pageIndex      IN OUT Number,               --索引页
                        p_pageSize       IN OUT Number,     --每页显示记录条数
                        p_totalRecords      OUT Number,             --总记录数
                        p_totalPages        OUT Number,               --总页数
                        cur_ret             OUT pkg_page.cur_page,
                        cur_ret2           OUT pkg_page.cur_ret); --返回的结果集
END pkg_page;

CREATE OR REPLACE PACKAGE BODY pkg_page
AS
   PROCEDURE proc_page (p_tableName      IN     varchar2,               --表名
                        p_strColumns     IN     varchar2,         --查询的字段
                        p_strWhere       IN     varchar2,           --查询条件
                        p_strOrder       IN     varchar2,               --排序
                        p_pageIndex      IN OUT Number,               --索引页
                        p_pageSize       IN OUT Number,     --每页显示记录条数
                        p_totalRecords      OUT Number,             --总记录数
                        p_totalPages        OUT Number,               --总页数
                        cur_ret             OUT pkg_page.cur_page,
                         cur_ret2           OUT pkg_page.cur_ret) --返回的结果集
   IS
      v_sql           VARCHAR2 (4000) := '';                         --sql语句
      v_startRecord   Number (10);                        --开始显示的记录条数
      v_endRecord     Number (10);                        --结束显示的记录条数
   BEGIN
      --记录中总记录条数
      v_sql := 'SELECT COUNT(rownum) FROM ' || p_tableName || ' WHERE 1=1';

      IF p_strWhere IS NOT NULL OR p_strWhere <> ''
      THEN
         v_sql := v_sql || p_strWhere;
      END IF;

      EXECUTE IMMEDIATE v_sql INTO   p_totalRecords;

      --验证页面记录大小
      IF p_pageSize < 0
      THEN
         p_pageSize := 20;
      END IF;

      --根据页大小计算总页数[Page]
      IF MOD (p_totalRecords, p_pageSize) = 0
      THEN
         p_totalPages := p_totalRecords / p_pageSize;
      ELSE
         p_totalPages := p_totalRecords / p_pageSize + 1;
      END IF;

      --验证页号
      IF p_pageIndex < 1
      THEN
         p_pageIndex := 1;
      END IF;

      IF p_pageIndex > p_totalPages
      THEN
         p_pageIndex := p_totalPages;
      END IF;

      --实现分页查询
      v_startRecord := (p_pageIndex - 1) * p_pageSize + 1;
      v_endRecord := p_pageIndex * p_pageSize;
      v_sql :=
            'SELECT '
         || p_strColumns
         || ' FROM (SELECT A.*, rownum r FROM '
         || '(SELECT * FROM '
         || p_tableName;

      IF p_strWhere IS NOT NULL OR p_strWhere <> ''
      THEN
         v_sql := v_sql || ' WHERE 1=1' || p_strWhere;
      END IF;

      IF p_strOrder IS NOT NULL OR p_strOrder <> ''
      THEN
         v_sql := v_sql || p_strOrder || ' ';
      END IF;

      v_sql :=
            v_sql
         || ') A WHERE rownum <= '
         || v_endRecord
         || ') B WHERE r >= '
         || v_startRecord;

      --DBMS_OUTPUT.put_line (v_sql);

      OPEN cur_ret FOR v_sql;
      OPEN cur_ret2 FOR v_sql2;
   END proc_page;
END;
posted @ 2011-03-15 15:34  尹庆超  阅读(3132)  评论(1编辑  收藏  举报