--创建包规范
create or replace package package_page as
type cursor_page is ref cursor;
Procedure proc_page(
p_curpage Number, --当前页
p_pagesize Number, --每页大小
p_tablename varchar2, --表名emp e
p_where varchar2, --查询条件e.ename like '%S%'
p_tablecolumn varchar2, --查询列e.id,e.ename,e.job
p_order varchar2, --排序e.ename desc
p_rowcount out Number, --总条数,输出参数
p_pagecount out number, --总页数
p_cursor out cursor_page); --结果集
end package_page;
--创建包主休
Create Or Replace Package Body package_page
Is
--存储过程
Procedure proc_page(
p_curpage Number,
p_pagesize Number,
p_tablename varchar2,
p_where varchar2,
p_tablecolumn varchar2,
p_order varchar2,
p_rowcount out Number,
p_pagecount out number,
p_cursor out cursor_page
)
is
v_count_sql varchar2(2000);
v_select_sql varchar2(2000);
begin
--查询总条数
v_count_sql:='select count(*) from '||p_tablename;
--连接查询条件(''也属于is null)
if p_where is not null then
v_count_sql:=v_count_sql||' where '||p_where;
end if;
--执行查询,查询总条数
execute immediate v_count_sql into p_rowcount;
--dbms_output.put_line('查询总条数SQL=>'||v_count_sql);
--dbms_output.put_line('查询总条数Count='||p_rowcount);
--得到总页数
if mod(p_rowcount,p_pagesize)=0 then
p_pagecount:=p_rowcount/p_pagesize;
else
p_pagecount:=p_rowcount/p_pagesize+1;
end if;
--如果查询记录大于0则查询结果集
if p_rowcount>0 and p_curpage>=1 and p_curpage<=p_pagecount then
--查询所有(只有一页)
if p_rowcount<=p_pagesize then
v_select_sql:='select '||p_tablecolumn||' from '||p_tablename;
if p_where is not null then
v_select_sql:=v_select_sql||' where '||p_where;
end if;
if p_order is not null then
v_select_sql:=v_select_sql||' order by '||p_order;
end if;
elsif p_curpage=1 then --查询第一页
v_select_sql:='select '||p_tablecolumn||' from '||p_tablename;
if p_where is not null then
v_select_sql:=v_select_sql||' where '||p_where||' and rownum<='||p_pagesize;
else
v_select_sql:=v_select_sql||' where rownum<='||p_pagesize;
end if;
if p_order is not null then
v_select_sql:=v_select_sql||' order by '||p_order;
end if;
else --查询指定页
v_select_sql:='select * from (select '|| p_tablecolumn ||',rownum row_num from '|| p_tablename;
if p_where is not null then
v_select_sql:=v_select_sql||' where '||p_where;
end if;
if p_order is not null then
v_select_sql:=v_select_sql||' order by '||p_order;
end if;
v_select_sql:=v_select_sql||') where row_num>'||((p_curpage-1)*p_pagesize)||' and row_num<='||(p_curpage*p_pagesize);
end if;
--执行查询
dbms_output.put_line('查询语句=>'||v_select_sql);
open p_cursor for v_select_sql;
end if;
end proc_page;
end package_page;
我是用的.NET开发
调用代码如下 : OracleParameter[] para = {
new OracleParameter("p_curpage",OracleType.Number),
new OracleParameter("p_pagesize",OracleType.Number),
new OracleParameter("p_tablename",OracleType.Number),
new OracleParameter("p_where",OracleType.VarChar),
new OracleParameter("p_tablecolumn",OracleType.VarChar),
new OracleParameter("p_order",OracleType.VarChar),
new OracleParameter("p_rowcount",OracleType.Number),
new OracleParameter("p_pagecount",OracleType.Number),
new OracleParameter("p_cursor",OracleType.Cursor)
}; para[0].Value = Convert.ToInt32(txtPageIndex.Text);
para[1].Value = Convert.ToInt32(txtSize.Text);
para[2].Value = "HOSPITAL_CONFIG e";
para[3].Value = "";
para[4].Value = "e.*";
para[5].Value = "e.HOSPITAL_NO desc";
para[6].Direction = ParameterDirection.Output;
para[7].Direction = ParameterDirection.Output;
para[8].Direction = ParameterDirection.Output; //DbHelperSQL2.RunProcedure("PACKAGE_PAGE.proc_page", para,"ds");
DataSet ds= DbHelperOra.RunProcedure("PACKAGE_PAGE.proc_page", para, "ds");
this.GridView1.DataSource = ds;
this.GridView1.DataBind(); int record = Convert.ToInt32(para[6].Value);传入的页码和页大小时经常出错,有的时候可以,有的时候报益处异常,好像是页码和页大小,总记录数相除时的错误,才高手帮忙看下,
我第一次用ORACLE,麻烦了,项目临时要改成ORACLE的
create or replace package package_page as
type cursor_page is ref cursor;
Procedure proc_page(
p_curpage Number, --当前页
p_pagesize Number, --每页大小
p_tablename varchar2, --表名emp e
p_where varchar2, --查询条件e.ename like '%S%'
p_tablecolumn varchar2, --查询列e.id,e.ename,e.job
p_order varchar2, --排序e.ename desc
p_rowcount out Number, --总条数,输出参数
p_pagecount out number, --总页数
p_cursor out cursor_page); --结果集
end package_page;
--创建包主休
Create Or Replace Package Body package_page
Is
--存储过程
Procedure proc_page(
p_curpage Number,
p_pagesize Number,
p_tablename varchar2,
p_where varchar2,
p_tablecolumn varchar2,
p_order varchar2,
p_rowcount out Number,
p_pagecount out number,
p_cursor out cursor_page
)
is
v_count_sql varchar2(2000);
v_select_sql varchar2(2000);
begin
--查询总条数
v_count_sql:='select count(*) from '||p_tablename;
--连接查询条件(''也属于is null)
if p_where is not null then
v_count_sql:=v_count_sql||' where '||p_where;
end if;
--执行查询,查询总条数
execute immediate v_count_sql into p_rowcount;
--dbms_output.put_line('查询总条数SQL=>'||v_count_sql);
--dbms_output.put_line('查询总条数Count='||p_rowcount);
--得到总页数
if mod(p_rowcount,p_pagesize)=0 then
p_pagecount:=p_rowcount/p_pagesize;
else
p_pagecount:=p_rowcount/p_pagesize+1;
end if;
--如果查询记录大于0则查询结果集
if p_rowcount>0 and p_curpage>=1 and p_curpage<=p_pagecount then
--查询所有(只有一页)
if p_rowcount<=p_pagesize then
v_select_sql:='select '||p_tablecolumn||' from '||p_tablename;
if p_where is not null then
v_select_sql:=v_select_sql||' where '||p_where;
end if;
if p_order is not null then
v_select_sql:=v_select_sql||' order by '||p_order;
end if;
elsif p_curpage=1 then --查询第一页
v_select_sql:='select '||p_tablecolumn||' from '||p_tablename;
if p_where is not null then
v_select_sql:=v_select_sql||' where '||p_where||' and rownum<='||p_pagesize;
else
v_select_sql:=v_select_sql||' where rownum<='||p_pagesize;
end if;
if p_order is not null then
v_select_sql:=v_select_sql||' order by '||p_order;
end if;
else --查询指定页
v_select_sql:='select * from (select '|| p_tablecolumn ||',rownum row_num from '|| p_tablename;
if p_where is not null then
v_select_sql:=v_select_sql||' where '||p_where;
end if;
if p_order is not null then
v_select_sql:=v_select_sql||' order by '||p_order;
end if;
v_select_sql:=v_select_sql||') where row_num>'||((p_curpage-1)*p_pagesize)||' and row_num<='||(p_curpage*p_pagesize);
end if;
--执行查询
dbms_output.put_line('查询语句=>'||v_select_sql);
open p_cursor for v_select_sql;
end if;
end proc_page;
end package_page;
我是用的.NET开发
调用代码如下 : OracleParameter[] para = {
new OracleParameter("p_curpage",OracleType.Number),
new OracleParameter("p_pagesize",OracleType.Number),
new OracleParameter("p_tablename",OracleType.Number),
new OracleParameter("p_where",OracleType.VarChar),
new OracleParameter("p_tablecolumn",OracleType.VarChar),
new OracleParameter("p_order",OracleType.VarChar),
new OracleParameter("p_rowcount",OracleType.Number),
new OracleParameter("p_pagecount",OracleType.Number),
new OracleParameter("p_cursor",OracleType.Cursor)
}; para[0].Value = Convert.ToInt32(txtPageIndex.Text);
para[1].Value = Convert.ToInt32(txtSize.Text);
para[2].Value = "HOSPITAL_CONFIG e";
para[3].Value = "";
para[4].Value = "e.*";
para[5].Value = "e.HOSPITAL_NO desc";
para[6].Direction = ParameterDirection.Output;
para[7].Direction = ParameterDirection.Output;
para[8].Direction = ParameterDirection.Output; //DbHelperSQL2.RunProcedure("PACKAGE_PAGE.proc_page", para,"ds");
DataSet ds= DbHelperOra.RunProcedure("PACKAGE_PAGE.proc_page", para, "ds");
this.GridView1.DataSource = ds;
this.GridView1.DataBind(); int record = Convert.ToInt32(para[6].Value);传入的页码和页大小时经常出错,有的时候可以,有的时候报益处异常,好像是页码和页大小,总记录数相除时的错误,才高手帮忙看下,
我第一次用ORACLE,麻烦了,项目临时要改成ORACLE的
解决方案 »
- PL-SQL 内 如何运行oracle package 包内的存储过程?右键TEST可以,但想直接在代码内实现
- 如何用SQL剔除夜间时间
- 在客户端运行访问oracle数据库的程序是否必须要在客户端装一个oracle客户端???
- 怎么建一个表(要快)
- 请教: Oracle中如何重命名一个字段?
- oracle的BLOB字段提交的最大值问题,up也有分
- 在oracle数据库中截取右字符串的函数是什么?比如:
- 100分求救!参与有分,不够可再加!!
- 在windows2000ADV下安装oracle8i不能出现安装界面,请问有什么方法可以解决??
- procedure 和function放在包中与不放在包中的区别
- pl-sql怎么在指定的汉字中随机生成名字啊?
- oracle 多用户 同步
TYPE CURSOR_PAGE IS REF CURSOR;
PROCEDURE PROC_PAGE(
P_CURPAGE NUMBER, --当前页
P_PAGESIZE NUMBER, --每页大小
P_TABLENAME VARCHAR2, --表名EMP E
P_WHERE VARCHAR2, --查询条件E.ENAME LIKE '%S%'
P_TABLECOLUMN VARCHAR2, --查询列E.ID,E.ENAME,E.JOB
P_ORDER VARCHAR2, --排序E.ENAME DESC
P_ROWCOUNT OUT NUMBER, --总条数,输出参数
P_PAGECOUNT OUT NUMBER, --总页数
P_CURSOR OUT CURSOR_PAGE); --结果集
END PACKAGE_PAGE;CREATE OR REPLACE PACKAGE BODY PACKAGE_PAGE
IS
--存储过程
PROCEDURE PROC_PAGE(
P_CURPAGE NUMBER,
P_PAGESIZE NUMBER,
P_TABLENAME VARCHAR2,
P_WHERE VARCHAR2,
P_TABLECOLUMN VARCHAR2,
P_ORDER VARCHAR2,
P_ROWCOUNT OUT NUMBER,
P_PAGECOUNT OUT NUMBER,
P_CURSOR OUT CURSOR_PAGE
)
IS
V_COUNT_SQL VARCHAR2(2000);
V_SELECT_SQL VARCHAR2(2000);
BEGIN
--查询总条数
V_COUNT_SQL:='SELECT COUNT(*) FROM '||P_TABLENAME;
--连接查询条件(''也属于IS NULL)
IF P_WHERE IS NOT NULL THEN
V_COUNT_SQL:=V_COUNT_SQL||' WHERE '||P_WHERE;
END IF;
--执行查询,查询总条数
EXECUTE IMMEDIATE V_COUNT_SQL INTO P_ROWCOUNT; --DBMS_OUTPUT.PUT_LINE('查询总条数SQL=>'||V_COUNT_SQL);
--DBMS_OUTPUT.PUT_LINE('查询总条数COUNT='||P_ROWCOUNT); --得到总页数
IF MOD(P_ROWCOUNT,P_PAGESIZE)=0 THEN
P_PAGECOUNT:=P_ROWCOUNT/P_PAGESIZE;
ELSE
P_PAGECOUNT:=TRUNC(P_ROWCOUNT/P_PAGESIZE) + 1;
END IF; --如果查询记录大于0则查询结果集
IF P_ROWCOUNT>0 AND P_CURPAGE>=1 AND P_CURPAGE <=P_PAGECOUNT THEN --查询所有(只有一页)
IF P_ROWCOUNT <=P_PAGESIZE THEN
V_SELECT_SQL:='SELECT '||P_TABLECOLUMN||' FROM '||P_TABLENAME;
IF P_WHERE IS NOT NULL THEN
V_SELECT_SQL:=V_SELECT_SQL||' WHERE '||P_WHERE;
END IF;
IF P_ORDER IS NOT NULL THEN
V_SELECT_SQL:=V_SELECT_SQL||' ORDER BY '||P_ORDER;
END IF;
ELSIF P_CURPAGE=1 THEN --查询第一页
V_SELECT_SQL:='SELECT '||P_TABLECOLUMN||' FROM '||P_TABLENAME;
IF P_WHERE IS NOT NULL THEN
V_SELECT_SQL:=V_SELECT_SQL||' WHERE '||P_WHERE||' AND ROWNUM <='||P_PAGESIZE;
ELSE
V_SELECT_SQL:=V_SELECT_SQL||' WHERE ROWNUM <='||P_PAGESIZE;
END IF;
IF P_ORDER IS NOT NULL THEN
V_SELECT_SQL:=V_SELECT_SQL||' ORDER BY '||P_ORDER;
END IF;
ELSE --查询指定页
V_SELECT_SQL:='SELECT * FROM (SELECT '|| P_TABLECOLUMN ||',ROWNUM ROW_NUM FROM '|| P_TABLENAME;
IF P_WHERE IS NOT NULL THEN
V_SELECT_SQL:=V_SELECT_SQL||' WHERE '||P_WHERE;
END IF;
IF P_ORDER IS NOT NULL THEN
V_SELECT_SQL:=V_SELECT_SQL||' ORDER BY '||P_ORDER;
END IF;
V_SELECT_SQL:=V_SELECT_SQL||') WHERE ROW_NUM>'||((P_CURPAGE-1)*P_PAGESIZE)||' AND ROW_NUM <='||(P_CURPAGE*P_PAGESIZE);
END IF;
--执行查询
DBMS_OUTPUT.PUT_LINE('查询语句=>'||V_SELECT_SQL);
OPEN P_CURSOR FOR V_SELECT_SQL;
END IF; END PROC_PAGE;
END PACKAGE_PAGE;