oracle分页存储过程查询

CREATE OR REPLACE PROCEDURE PCX_TYCX(O_CODE OUT NUMBER,
O_NOTE OUT VARCHAR2,
O_HASRECORDSET IN OUT NUMBER,
O_RESULT OUT SYS_REFCURSOR,
I_PAGING IN NUMBER,
I_PAGENO IN NUMBER,
I_PAGELENGTH IN NUMBER,
I_TOTALROWS IN OUT NUMBER,
SQLS IN VARCHAR2,
COLLIST IN VARCHAR2,
HASWHERE IN BOOLEAN := TRUE,
GROUPISLAST IN BOOLEAN := FALSE,
I_SORT IN VARCHAR2 := '',
I_HASWITH IN BOOLEAN := FALSE) IS
/******************************************************************************
文件名称:PCX_TYCX
项目名称:
功能说明:通用查询

参数:
英文名称 中文名称 可能取值
o_code 返回值
o_note 返回信息
o_hasrecordset 0/1 整型,返回1,表示有返回o_result,否俄没有o_result(为空值)
o_result 返回的数据集合 不一定会有,但通常用于返回结果集合。
i_paging 是否分页 1表示分页,0表示不分页。但即使不分页的情况下,也会计算i_totalrows.
并不是什么是否都需要分页,看情形而言。
i_pageNo 页码
i_pageLength 页长
i_totalrows 总行数 -1,未知,表示需要计算总长。是In,out参数.如果i_totalrows>=0,则不再计算这个指,
在很翻页的时候,可以提高效率。
SQLS SQLs语句 请务必包含特定格式。
haswhere 是否有where字句 默认是有.
groupislast 类似group条件是
最后一个部分 默认false;
i_sort 排序字句 通常有.

******************************************************************************/

VSQLS VARCHAR2(32767);
VSTARTROW NUMBER;
VENDROW NUMBER;
VPAGESQLWHERE VARCHAR2(32767);
V_SORTSQL VARCHAR2(1000);
V_COMPLEX BOOLEAN;

B_HASWITH BOOLEAN := I_HASWITH;
V_WITHSQL VARCHAR2(32767);
V_WITHPOS NUMBER;

BEGIN
V_COMPLEX := GROUPISLAST;

IF I_TOTALROWS = -1 THEN
--计算总的行数
PRO_TJHS(I_TOTALROWS, O_NOTE, SQLS, GROUPISLAST);
IF I_TOTALROWS = 0 THEN
--没有数据,则返回一个空壳
O_CODE := 1;
O_NOTE := '成功';
IF O_HASRECORDSET = 1 THEN
--如果需要返回数据,则直接数据.
IF COLLIST IS NOT NULL THEN
VSQLS := 'select ' || COLLIST || ' from
(' || SQLS || ')';
ELSE
VSQLS := SQLS;
END IF;

OPEN O_RESULT FOR VSQLS;
END IF;
RETURN;
ELSIF I_TOTALROWS = -1 THEN
--只要异常,就不返回数据集合。
O_CODE := -1;
O_NOTE := '计算总行数出现异常:' || O_NOTE;
O_HASRECORDSET := 0;
RETURN;
END IF;

END IF;

IF O_HASRECORDSET = 1 THEN
--如果需要返回数据.
V_SORTSQL := CASE WHEN I_SORT IS NOT NULL THEN ' ORDER BY ' || I_SORT ELSE NULL END;
IF I_PAGING = 1 THEN
--如果分页
--分页请处理有关
VSTARTROW := (I_PAGENO - 1) * I_PAGELENGTH + 1;

IF I_TOTALROWS <= I_PAGELENGTH THEN
VENDROW := I_TOTALROWS;
ELSE
VENDROW := I_PAGENO * I_PAGELENGTH;
END IF;

IF I_SORT IS NOT NULL THEN
V_COMPLEX := TRUE;
END IF;

---处理 rownum r部分----------------------------------------------------------------------
VSQLS := SQLS;
IF B_HASWITH THEN
V_WITHPOS := INSTR(VSQLS, '/**with**/');
V_WITHSQL := SUBSTR(VSQLS, 1, V_WITHPOS - 1);
VSQLS := SUBSTR(VSQLS, V_WITHPOS + 10);
END IF;

/* IF V_COMPLEX = FALSE THEN
--如果是最简单的(无排序,分组,等等的)
VSQLS := REPLACE(VSQLS, '\* rownum r,*\', ' rownum r,');
VPAGESQLWHERE := CASE WHEN HASWHERE THEN ' and rownum<=' || VENDROW ELSE ' where rownum<=' || VENDROW END;
VSQLS := 'select ' || COLLIST || ' from
(' || VSQLS || VPAGESQLWHERE ||
') where r>=' || VSTARTROW;

ELSE
--如果是复杂的
VSQLS := ' select ' || COLLIST || ' from
(
select rownum r,a.*
from
(' || VSQLS || V_SORTSQL || '
) a
where rownum<=' || VENDROW || '
)
where r>=' || VSTARTROW;


END IF;*/

/* VSQLS := 'SELECT ' || COLLIST || ' FROM (
SELECT ' || COLLIST ||
' ,ROWNUM R FROM (
SELECT ' || COLLIST || ' FROM (' ||
VSQLS || ') ' || V_SORTSQL || ')
)
WHERE R BETWEEN ' || VSTARTROW || ' AND ' ||
VENDROW;*/

VSQLS := ' SELECT ' || COLLIST || ' FROM(
SELECT A.* ,ROWNUM R FROM(' || VSQLS || ') A WHERE ROWNUM<=' || VENDROW || V_SORTSQL|| ') 
WHERE R>=' || VSTARTROW;

---处理with语句
IF B_HASWITH THEN
VSQLS := V_WITHSQL || '
' || VSQLS;
END IF;

ELSE
--不分页
IF COLLIST IS NOT NULL THEN
VSQLS := 'select ' || COLLIST || ' from
(' || SQLS || ')' || V_SORTSQL;
ELSE
VSQLS := SQLS || V_SORTSQL;
END IF;
END IF;
END IF;

O_CODE := 1;
O_NOTE := '成功';
--DBMS_OUTPUT.PUT_LINE(VSQLS);

 

IF O_HASRECORDSET = 1 THEN


OPEN O_RESULT FOR VSQLS;

END IF;

EXCEPTION
WHEN OTHERS THEN
O_CODE := -1;
O_NOTE := SQLERRM;
O_HASRECORDSET := -1;
OPEN O_RESULT FOR
SELECT '查询出错 ! 错误:' || O_NOTE FROM DUAL;
END PCX_TYCX;

 

------------------------------------------------ 查询---存储过程-----------------------------------------

create or replace procedure pcx_h5_asset(
O_CODE OUT NUMBER,
O_NOTE OUT VARCHAR2,
O_HASRECORDSET OUT NUMBER,
O_RESULT OUT SYS_REFCURSOR,
I_PAGING IN NUMBER,
I_PAGENO IN NUMBER,
I_PAGELENGTH IN NUMBER,
I_TOTALROWS IN OUT NUMBER,
I_SORT IN VARCHAR2,
I_USERID IN NUMBER --APP用户id
)
as
/*
**功能说明:-查询
**创建人:zheg
**创建日期:2021-12-17
**************************************************************************
**修改记录
**************************************************************************
**修改者 版本号 修改日期 说明
**zheng 1.0 2021-12-17 创建

*/
V_SQL VARCHAR2(32767);
V_COL_LST VARCHAR2(2000);
V_SORT VARCHAR2(2000);

begin
O_CODE := 1;
O_NOTE := '成功';
O_HASRECORDSET := 1;
I_TOTALROWS := -1;

IF i_userid IS NULL THEN 
o_code := -1;
o_note := 'APP用户id不允许为空!';
RETURN;
END IF;

---  条件写法(没有就忽略掉)

if i_xmmc is not  null then

  v_where := v_where || ' and xmmc like ''%' || i_xmmc || '%''';

  v_where := v_where || ' and instr('';''||'''|| i_bglx || '''||'';'','';'' ||pl.wjlx||'';'')>0';

end if;


V_SQL := 'select ''客户姓名'' khxm ,1000000 jzdqfe , 2000000 jzljsy from dual ';

V_COL_LST := 'khxm as "khxm",jzdqfe as "jzdqfe",jzljsy as "jzljsy"';

if I_SORT is null then
V_SORT := '';
else
V_SORT := I_SORT||' desc';
end if;

 

if O_CODE=-1 then
open O_RESULT for
select O_CODE code, O_NOTE note FROM DUAL;
else
V_SQL := 'SELECT * FROM (' || V_SQL || ')';

--返回结果集
PCX_TYCX(O_CODE,
O_NOTE,
O_HASRECORDSET,
O_RESULT,
I_PAGING,
I_PAGENO,
I_PAGELENGTH,
I_TOTALROWS,
SQLS => V_SQL,
COLLIST => V_COL_LST,
HASWHERE => TRUE,
GROUPISLAST => FALSE,
I_SORT => V_SORT,
I_HASWITH => FALSE);
end if;

exception
when others then
o_code := -99;
o_note := '查询家发生错误' || sqlcode || sqlerrm;
OPEN O_RESULT FOR
SELECT O_CODE code, O_NOTE note FROM DUAL;

end pcx_h5_asset;

------------ ---------------------- 处理业务-- 存储过程-------------------------

create or replace procedure pro_h5_tj(
O_CODE OUT NUMBER,
O_NOTE OUT VARCHAR2,
I_XMID IN NUMBER, --
I_CPID IN NUMBER --
)
as
/*
**功能说明:H接口
**创建人:
**创建日期:2
*************************************************************************

begin
O_CODE := 1;
O_NOTE := '成功';


IF I_XMID IS NULL OR I_CPID IS NULL THEN
O_CODE:=-1;
O_NOTE:='入参不能空!';
RETURN;
END IF;
--处理业务
--UPDATE ******;

exception
when others then
o_code := -99;
o_note := '签署发生错误' || sqlcode || sqlerrm;
return;
end pro_h5_tj;

 

  

posted @ 2022-02-15 15:37  梦幻&浮云%  阅读(117)  评论(0)    收藏  举报