您的位置:首页 > 数据库 > Oracle

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

2011-03-15 15:34 561 查看
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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: