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, ...
随机推荐
- Python中import导入上一级目录模块及循环import问题的解决
转自:https://www.cnblogs.com/sjy18039225956/p/9265461.html 使用python进行程序编写时,经常会使用第三方模块包.这种包我们可以通过python ...
- docker 第五篇 存储
镜像概述复习 Docker镜像由多个只读层叠加而成,启动容器时,Docker会加载只读镜像层并在镜像栈顶部添加一个读写层 如果运行中的容器修改了现有的一个已经存在的文件,那改文件将会从读写层下面的只读 ...
- centos 中 Java环境变量配置
一.安装java 1.搜索java包 yum search java 2.安装java包 -openjdk.x86_64 3.查看java安装目录 whereis java #找到Java目录 一般在 ...
- vue项目中引入animate.css和wow.js
本文转自:https://blog.csdn.net/liyunkun888/article/details/85003152 https://www.zhuimengzhu.com/content/ ...
- 6.Cookie和Session
/*会话*/ (开一个浏览器,访问几个web资源,然后关闭浏览器,这个过程为一个对话) /*保存*/会话数据的两种技术(cookie session) 1.Cookie (客户端技术)(数据保存在客户 ...
- jQuery EasyUI 拖放 – 基本的拖动和放置
jQuery EasyUI 拖放 - 基本的拖动和放置 在jQuery EasyUI中,可以实现HTML元素的基本拖动和放置. <div id="dd1" class=&qu ...
- vue父组件传值和子组件触发父组件方法
<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.js"></script> <scr ...
- 手写走通HTTP server 第二版本
HTTP server 2.0 1 接收客户请求 2 解析客户端请求 3 组合数据,形成HTTP response 4 将数据发送给客户端 升级 : 1 多线程接收客户端请求 2 基本的请求解析,根据 ...
- SIFT算法相关资料
SIFT算法相关资料 一.SIFT算法的教程.源码及应用软件1.ubc:DAVID LOWE---SIFT算法的创始人,两篇巨经典经典的文章http://www.cs.ubc.ca/~lowe/ 2. ...
- Mysql(五):索引原理与慢查询优化
一 介绍 为何要有索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,因此对查询语句 ...