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存储过程中进行分页的更多相关文章

  1. Oracle存储过程中异常Exception的捕捉和处理

    Oracle存储过程中异常的捕捉和处理 CREATE OR REPLACE Procedure Proc_error_process ( v_IN in Varchar2, v_OUT Out Var ...

  2. Oracle存储过程中异步调用的实际操作步骤

    本文标签:Oracle存储过程 我们都知道在Oracle数据库的实际应用的过程中,我们经常把相关的业务处理逻辑,放在Oracle存储过程中,客户端以通过ADO来进行相关的调用  .而有些相关的业务逻辑 ...

  3. ORACLE存储过程中%TYPE和%ROWTYPE的区别

    ORACLE存储过程中%TYPE和%ROWTYPE的区别 在存储过程中%TYPE和%ROWTYPE常用来在PL/SQL中定义变量 因为 t_emp emp%rowtype ;这个语句的意思是 定义一个 ...

  4. Oracle存储过程中跳出循环的写法

    注:本文来源于: <  Oracle存储过程中跳出循环的写法   > Oracle存储过程中跳出循环的写法 记录exit和return的用法 1:exit用来跳出循环 loop IF V_ ...

  5. java 实现往oracle存储过程中传递array数组类型的参数

    注:本文来源于 <  java 实现往oracle存储过程中传递array数组类型的参数  >最近项目中遇到通过往存储过程传递数组参数的问题, 浪费了N多个小时,终于有点头绪. 具体的代码 ...

  6. oracle存储过程中使用execute immediate执行sql报ora-01031权限不足的问题

    oracle存储过程中使用execute immediate执行sql报ora-01031权限不足的问题 学习了:http://blog.csdn.net/royzhang7/article/deta ...

  7. oracle存储过程中%type的含义

    转: oracle存储过程中%type的含义 2018-11-07 11:43:56 lizhi_ma 阅读数 1361更多 分类专栏: 数据库   版权声明:本文为博主原创文章,遵循CC 4.0 B ...

  8. 在ORACLE存储过程中创建临时表

    在ORACLE存储过程中创建临时表 存储过程里不能直接使用DDL语句,所以只能使用动态SQL语句来执行 --ON COMMIT DELETE ROWS 说明临时表是事务指定,每次提交后ORACLE将截 ...

  9. ORACLE 存储过程中保存用户自定义异常信息的一种方式

    1.创建错误日志表: create table REP_LOGS ( log_s_no NUMBER not null, log_date DATE default sysdate not null, ...

随机推荐

  1. JAVA中ArrayList重写比较方法

    ArrayList的sort方法重写: 当ArrayList中存放的为含有多个成员变量的数据类型时,在进行sort排序时要重写比较方法,一般都写在这个数据类型类的内部如: package 算法竞赛入门 ...

  2. LeetCode 腾讯精选50题--链表排序

    解题思路:归并 先把链表拆开,分为两部分,一直拆到只剩一个元素后,进行合并,利用一个临时节点记录重排后的链表的起始位置 合并不难,困难点在于如何拆分链表,自己的大体思路是利用两个指针,一个一次移动两位 ...

  3. WinPE基础知识之导入表

    // 导入表 (结构体数组,以一个全零元素为结尾,每一个数组元素,代表一个PE文件导入信息) // 导入表存储的是从其它PE文件导入过来的函数名.序号,加载到内存之后,还存储这些函数的地址 typed ...

  4. react route使用HashRouter和BrowserRouter的区别-Content Security Policy img-src 404(Not found)

    踩坑经历 昨天看了篇关于react-route的文章,说BrowserRouter比HashRouter好一些,react也是推荐使用BrowserRouter,毕竟自己在前端方面来说,就是个小白,别 ...

  5. 嵌入式Linux应用开发完全手册读书笔记——常用的命令

    嵌入式开发中常用的命令 grep命令 用法:grep [option] PATTERN [FILE...] 例如: 在内核目录下查找包含"request_irq"字样的文件 gre ...

  6. ACM-ICPC 2019南昌网络赛F题 Megumi With String

    ACM-ICPC 南昌网络赛F题 Megumi With String 题目描述 给一个长度为\(l\)的字符串\(S\),和关于\(x\)的\(k\)次多项式\(G[x]\).当一个字符串\(str ...

  7. Java字节流read函数

    问题引入 做Java作业从标准输入流获取用户输入,用到了System.in.read(),然后出现了bug. //随机生成一个小写字母,用户猜5次,读取用户输入,并判断是否猜对 import java ...

  8. systemctl可以实现nginx进程挂了之后自动重新启动

    接 2018年7月31日的那篇: vim /lib/systemd/system/nginx.service [Service]Restart=alwaysRestartSec=1Type=forki ...

  9. BIgDecimal输出时添加金额分割符

    1.创建Serializer文件 2.修改输出方法 3.使用

  10. opengles reference card

    https://www.khronos.org/files/opengles31-quick-reference-card.pdf https://www.khronos.org/opengles/s ...