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, ...
随机推荐
- luogu4302字符串折叠题解--区间DP
题目链接 https://www.luogu.org/problemnew/show/P4302 分析 很明显一道区间DP题,对于区间\([l,r]\)的字符串,如果它的字串是最优折叠的,那么它的最优 ...
- Pytorch报错:cuda runtime error (59) : device-side assert triggered at /pytorch/aten/src/THC/generic/THCTensorMath.cu:26
Pytorch报错:cuda runtime error (59) : device-side assert triggered at /pytorch/aten/src/THC/generic/TH ...
- 集合源码阅读——ArrayList
ArrayList 关键点: >>扩容每次扩容1.5倍 >>modcount的作用 >>ArrayList的父类AbstractList的成员变量 >> ...
- requests模块发送数据
通过json dumps发送 import requests import json def agent(): """ 执行命令采集硬件信息 将执行的信息发送给API : ...
- 分布式任务队列 Celery —— Task对象
转载至 JmilkFan_范桂飓:http://blog.csdn.net/jmilk 目录 目录 前文列表 前言 Task 的实例化 任务的名字 任务的绑定 任务的重试 任务的请求上下文 任务的继 ...
- 【python】Logging模块
1.日志记录级别 logging.debug<logging.info<logging.warning<logging.error<logging.critical 关键是最高 ...
- 制作docker 离线仓库
目录 制作docker 离线仓库 1.前言 2.步骤 安装docker-distribution 编辑docker-distribution服务的配置,使用yaml进行的配置 启动仓库服务 编辑doc ...
- 01_Hive简介及其工作机制
1.Hive简介 Hive是一个基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一个表.并提供类SQL查询功能, 可以将sql语句转换为MapReduce任务运行.其优点是学习成本低, ...
- PAT Basic 1061 判断题 (15 分)
判断题的评判很简单,本题就要求你写个简单的程序帮助老师判题并统计学生们判断题的得分. 输入格式: 输入在第一行给出两个不超过 100 的正整数 N 和 M,分别是学生人数和判断题数量.第二行给出 M ...
- 【完美解决】vue,页面跳转样式错位但是刷新又好了的情况
在vue文件中,做样式分离: 将覆盖样式单独写在一个style标签内,原页面写在 scoped样式作用域下.