oracle存储过程中进行分页
create or replace procedure APP_BUSSINESS_CARD_LIST(p_in_str in varchar2,p_out_str out varchar2) is
/*******************************************************************************
out varchar2我本地oracle显示最长不能超过2000个字符
-- 函数名称 APP_BUSSINESS_CARD_LIST
-- 功能描述 商通卡列表
-- 2019年8月7日10:40:09
********************************************************************************/
-- Private exception declarations
scanner_exception exception;
pragma exception_init(scanner_exception, -20100); parser_exception exception;
pragma exception_init(parser_exception, -20101); -- Private variable declarations
-- 变量定义最长长度为4000(和oracle版本有关系,可以用str :=rpad("*",4000,"*");
DBMS_OUTPUT.put_line('str: ' ||length(str));
进行测试)
type card_no_tab is table of varchar2(4000) index by BINARY_INTEGER;
v_card_no_tab_info card_no_tab;
v_single_info varchar2(4000);-- 存放整个分页list
j_param json;
iCount number;
vv_count number;
v_count number;
v_user_id number;
v_page number;
v_page_size number;
v_total_count number;
v_total_page number;
v_begin_rownum number;
v_end_rownum number;
jl_card json_list;-- 返回结果的list集合
j_return json;
v_ret varchar2(2);
v_des varchar2(32); begin -- 创建json对象
j_param := json(p_in_str);
-- 获取用户ID
v_user_id := json_ext.get_number(j_param, 'userId');
-- 获取页码
v_page := json_ext.get_number(j_param, 'page');
if (v_page is null) then
p_out_str := '{"resultCode":"31", "resultMsg":"page类型错误"}';
return;
end if;
-- 校验页码数据是否有效(页码不能小于1)
if (v_page < 1) then
p_out_str := '{"resultCode":"36", "resultMsg":"page数据无效"}';
return;
end if;
-- 获取页大小
v_page_size := json_ext.get_number(j_param, 'pageSize');
if (v_page_size is null) then
p_out_str := '{"resultCode":"31", "resultMsg":"pageSize类型错误"}';
return;
end if;
-- 校验页大小数据是否有效(页大小不能小于1并且不能大于7,可能会超出out长度)
if (v_page_size < 1 or v_page_size > 7) then
p_out_str := '{"resultCode":"38", "resultMsg":"pageSize数据无效"}';
return;
end if;
-- 校验用户ID是否存在
select count(1)
into v_count
from web_user_info
where user_id = v_user_id;
if (v_count <> 1) then
p_out_str := '{"resultCode":"32", "resultMsg":"userId数据无效"}';
return;
end if;
-- 获取卡列表总数量
select count(1) into v_total_count from web_user_bussiness_card_view where userid = v_user_id;
-- 计算总页数
if (mod(v_total_count, v_page_size) = 0) then
v_total_page := trunc(v_total_count / v_page_size);
else
v_total_page := trunc(v_total_count / v_page_size) + 1;
end if;
-- 如果总页数是0, 则直接返回结果; 否则查询交易记录并返回结果.
if (v_total_page = 0) then
-- 返回的josn数据
j_return := json('{"resultCode":"00", "resultMsg":"成功"}');
j_return.put('page', v_page);
j_return.put('pageSize', v_page_size);
j_return.put('totalPage', v_total_page);
j_return.put('totalCount', v_total_count);
j_return.put('cardList', jl_card); -- 返回结果
p_out_str := j_return.to_char(false);
return;
end if;
-- 如果当前页数大于总页数, 那么当前页数赋值为总页数.
if (v_page > v_total_page) then
v_page := v_total_page;
end if; -- 计算开始行数和结束行数
v_begin_rownum := (v_page - 1) * v_page_size;
v_end_rownum := v_begin_rownum + v_page_size;
iCount := 0;
vv_count := 0;
for r in (select * from web_user_bussiness_card_view where userid = v_user_id order by ismain desc,
bindId asc) loop
-- 修改条数限制位置
iCount := iCount + 1;
if iCount <= v_begin_rownum then
--当不是我们需要的那页的数据,则取下一条数据
continue ;
elsif iCount > v_end_rownum then
exit;
else
null;
end if;
vv_count := vv_count + 1;
v_card_no_tab_info(vv_count) := '{"cardNo":"' || r.cardNo ||
'","background":"' ||r.background ||
'","publicType":' || r.publicType ||
',"cardAreaType":"' || r.cardAreaType ||
'","isInMainCard":' || r.isInMainCard ||
',"isSetMainCard":"' || r.isSetMainCard ||
'","isTrade":"' || r.isTrade ||
'","isSend":"' || r.isSend ||
'","facePrice":"' || r.facePrice ||
'","isActive":"' || r.isActive ||
'","isMain":"' || r.isMain ||
'"}';
end loop;
--组合jl_card
-- "cardList":"
v_single_info := '"cardList":['; for k in 1 .. vv_count loop
if k < vv_count then
v_single_info := v_single_info || v_card_no_tab_info(k) || ',';
else
v_single_info := v_single_info || v_card_no_tab_info(k);
end if;
end loop;
v_single_info := v_single_info || ']';
v_ret :='00';
v_des :='成功';
DBMS_OUTPUT.put_line('v_single_info : ' || LENGTH(v_single_info));
p_out_str := '{"resultCode":"' || v_ret ||
'", "resultMsg":"' || v_des ||
'","page":"' || v_page ||
'","pageSize":"' || v_page_size ||
'","totalPage":"' ||v_total_page ||
'","totalCount":"' ||v_total_count ||
'",' || v_single_info || '}'; return;
exception
when scanner_exception then
p_out_str := '{"resultCode":"94", "resultMsg":"Json扫描器异常"}';
when parser_exception then
p_out_str := '{"resultCode":"95", "resultMsg":"Json解析器异常"}';
when others then
DBMS_OUTPUT.put_line('sqlcode : ' ||sqlcode);
DBMS_OUTPUT.put_line('sqlerrm : ' ||sqlerrm);
p_out_str := '{"resultCode":"96", "resultMsg":"运行时异常"}';
end APP_BUSSINESS_CARD_LIST;
另外一种分页方法:
-- SQL语句
v_sqltext := 'select tradeMonth as "tradeMonth",
debitAmount as "debitAmount",
loanAmount as "loanAmount"
from (select d.*, rownum as rn
from (select to_char(tradedate, ''yyyy.mm'') as tradeMonth,
sum(debitamount) as debitAmount,
sum(loanamount) as loanAmount
from xsh_trade_view
where cardno = ''' || v_card_no || '''
group by to_char(tradedate, ''yyyy.mm'')
order by to_char(tradedate, ''yyyy.mm'') desc) d
where rownum <= ' || v_end_rownum || ')
where rn > ' || v_begin_rownum;
end if; -- 执行SQL语句并返回josn_list数据
jl_trade := json_dyn.executeList(v_sqltext);
oracle存储过程中进行分页的更多相关文章
- Oracle存储过程中异常Exception的捕捉和处理
Oracle存储过程中异常的捕捉和处理 CREATE OR REPLACE Procedure Proc_error_process ( v_IN in Varchar2, v_OUT Out Var ...
- Oracle存储过程中异步调用的实际操作步骤
本文标签:Oracle存储过程 我们都知道在Oracle数据库的实际应用的过程中,我们经常把相关的业务处理逻辑,放在Oracle存储过程中,客户端以通过ADO来进行相关的调用 .而有些相关的业务逻辑 ...
- ORACLE存储过程中%TYPE和%ROWTYPE的区别
ORACLE存储过程中%TYPE和%ROWTYPE的区别 在存储过程中%TYPE和%ROWTYPE常用来在PL/SQL中定义变量 因为 t_emp emp%rowtype ;这个语句的意思是 定义一个 ...
- Oracle存储过程中跳出循环的写法
注:本文来源于: < Oracle存储过程中跳出循环的写法 > Oracle存储过程中跳出循环的写法 记录exit和return的用法 1:exit用来跳出循环 loop IF V_ ...
- java 实现往oracle存储过程中传递array数组类型的参数
注:本文来源于 < java 实现往oracle存储过程中传递array数组类型的参数 >最近项目中遇到通过往存储过程传递数组参数的问题, 浪费了N多个小时,终于有点头绪. 具体的代码 ...
- oracle存储过程中使用execute immediate执行sql报ora-01031权限不足的问题
oracle存储过程中使用execute immediate执行sql报ora-01031权限不足的问题 学习了:http://blog.csdn.net/royzhang7/article/deta ...
- oracle存储过程中%type的含义
转: oracle存储过程中%type的含义 2018-11-07 11:43:56 lizhi_ma 阅读数 1361更多 分类专栏: 数据库 版权声明:本文为博主原创文章,遵循CC 4.0 B ...
- 在ORACLE存储过程中创建临时表
在ORACLE存储过程中创建临时表 存储过程里不能直接使用DDL语句,所以只能使用动态SQL语句来执行 --ON COMMIT DELETE ROWS 说明临时表是事务指定,每次提交后ORACLE将截 ...
- ORACLE 存储过程中保存用户自定义异常信息的一种方式
1.创建错误日志表: create table REP_LOGS ( log_s_no NUMBER not null, log_date DATE default sysdate not null, ...
随机推荐
- ant-design的Table组件自定义空状态
Table,是antd中一个我们经常使用的组件,在官方文档中给出了非常详细的实例以及API, 但在我们在使用过程中可能需要根据项目的要求来定制空状态时的展示. 什么是空状态呢? 在antd的官方文档中 ...
- 用表格制作商品购买页面--(table)
实现效果如图: 首先来看布局,头部图片,内容从左到右分为四个部分 勾选+商品图片+商品名/买家+价格, 所以需要将头部用<td>包括起来,并且设置<td colspan=&quo ...
- Linux学习(五)-Linux组管理和权限管理
Linux组基本介绍 在Linux中的每一个用户必须属于一个组,不能独立与组外.在Linux中每个文件有所有者,所在组,其他组的概念 所有者 所在组 其它组 改变用户所在组 1.文件/目录 所有者 文 ...
- property配置
之前把设备历史数据存储的时间周期存储在了数据库中,因为以下一些原因,我打算改写到property配置文件中 1.这个周期时间的配置没有单独放一个tabel中,导致现在设备类型越来越多,每次添加或者修改 ...
- Python的Struct模块
python strtuct模块主要在Python中的值于C语言结构之间的转换.可用于处理存储在文件或网络连接(或其它来源)中的二进制数据. #!/usr/bin/env python # -*- c ...
- 【Java并发】并发队列与线程池
并发队列 阻塞队列与非阻塞队 ConcurrentLinkedQueue BlockingQueue ArrayBlockingQueue LinkedBlockingQueue PriorityBl ...
- Django—admin系统:admin的使用及源码剖析
admin组件使用 Django 提供了基于 web 的管理工具. Django 自动管理工具是 django.contrib 的一部分.你可以在项目的 settings.py 中的 INSTALLE ...
- java与JSON
XML 格式数据极其的冗长.因为每个离散的数据片段需要大量的 XML 结构,所有有效 的数据的比例非常低.XML 语法还有轻微的模糊.还有,解析 XML 是非常占程序员的精力的.你需要提前了解详细的结 ...
- python3:iterable, iterator, generator,抽象基类, itertools的使用。
目录: iterable对象 iterator对象, 数据类型Iterator类 数据类型Generator类. 生成器表达式 collections.abc:容器的抽象基类.用于判断具体类. ite ...
- wkhtmltopdf 自定义字体未生效或中文乱码
使用wkhtmltopdf控件将网页保存成pdf的过程中出现网页中有些字体,在PDF中未生效.通过网上查询结果有一种处理方式: 在网页头部的style标签中,手工指定宋体字体的本地存放位置,wkhtm ...