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. [NOIP10.6模拟赛]1.merchant题解--思维+二分

    题目链接: while(1)gugu(while(1)) 闲扯 考场上怕T2正解写挂其他两题没管只打了暴力,晚上发现这题思维挺妙的 同时想吐槽出题人似乎热衷卡常...我的巨大常数现在显露无疑QAQ 分 ...

  2. FFmpeg里面的时间单位

    pts单位:1/90 ms(每个单位代表1/90 ms)  RTP包头有个STAMP 对于视频 STAMP/90 就是 PTS (毫秒) 对于音频 STAMP/samplerate * 1000 才是 ...

  3. Eclipse 动态添加web.xml

    在创建javaweb项目时,也许会忘记让项目创建web.xml文件,这是我们可以右键创建后的项目,在javaEE Tools中选择第二个即可. Generate deployment Descript ...

  4. ThreeJS 3d模型简介

    本文主要是对Threejs中加载模型的支持种类进行简单的知识科普. 3ds (.3ds) 3ds是3ds max通用储存文件格式.使用的范围更宽,可被更多的软件识别使用. amf (.amf) AMF ...

  5. shake.js实现微信摇一摇功能

    项目要求实现点击摇一摇图片,图片摇一摇,并且摇一摇手机,图片也要摇一摇. 关于用js怎样实现摇一摇手机图片摇一摇,我在网络上找了一些方法,真正有用的是shake.js. 接下来,上shake.js源码 ...

  6. 安卓开发之sql语句增删改查2(利用谷歌封装好的API进行增删改查)

    <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...

  7. vue生命周期详细过程

  8. go爬虫之爬取豆瓣电影

    go爬取豆瓣电影 好久没使用go语言做个项目了,上午闲来无事花了点时间使用golang来爬取豆瓣top电影,这里我没有用colly框架而是自己设计简单流程.mark一下 思路 定义两个channel, ...

  9. 大幅提升Delphi Datasnap数据传输效率的方法

    方法一:增加TCP读写缓存的大小       DataSnap Server中负责TCP/IP通讯的组件是TDSTCPServerTransport,它默认的TCP/IP读写缓冲区的大小为32KB,由 ...

  10. C语言创建线程以及使用锁进行读写分离

    线程的使用 1.线程的创建 线程的相关操作放在<pthread.h>中. 1.1我们定义一个线程,首先要进行定义一个函数,类似我们创建一个a线程 void *thread_a(void * ...