PL/SQL存储过程动态分页查询

因为扯淡的老师上课用了个扯淡的方法实现了个脑残的过程,根本没有实现动态。

非常不爽。于是自己研究。写了一个。

因为懒。懒的去把这东西封装成procedure或function。

有些细节和异常捕获也懒得去写了。比如数组的类型只用了varchar2(50).万一某个字段长度超过了50,就惨了。

基本过程如下,总之各种动态sql。

直接在sql*plus or  PL/SQL development中跑就可以。

 

declare
pageSize number;
currentPage number;
row_count number;--表的总行数
firstRow number;--分页查询第一条
lastRow number;-- 分页查询最后一条
pageTotalNum number;--总页数
process number;--过程
cur_1 number;--游标
table_name varchar2(100);--输入的表名
column_num number;--列数
tmp_sql varchar2(500);  --动态sql语句
get_count_sql varchar2(500);
get_column_num_sql varchar2(200);
n number;--计数
TYPE T_TAB is table of varchar2(50) index by binary_integer;--数组类型
my_array T_TAB;--数组
begin
    table_name:=UPPER('&输入表名');
    pageSize:=to_number('&输入每页条数');
    currentPage:=to_number('&显示页');
    dbms_output.put_line('输入表名:'||table_name||' ,每页条数:'||pageSize||'条'||' ,当前页:第'||currentPage||'页');
    
    --表的总行数
    get_count_sql:='select count(*) from '||table_name;
    EXECUTE IMMEDIATE get_count_sql INTO row_count;
    dbms_output.put_line(table_name||'表的总条数:'||row_count||'条');
    
    --分页共多少页
    pageTotalNum:=ceil(row_count/pageSize);
    dbms_output.put_line('总共'||pageTotalNum||'页');
    firstRow:=1+pageSize*(currentPage-1);
    lastRow:=pageSize*currentPage;
    if lastRow>row_count then
        lastRow:=row_count;
    end if;
    
    dbms_output.put('当记录');
    dbms_output.put_line('从 第'||firstRow||'条 到 第'||lastRow||'条');   
 
    
--获取参数表的列数
    --select count(*) from (select * from user_tab_columns where TABLE_NAME='&name');
    --动态执行sql
    get_column_num_sql:='select count(*) from '||'(select * from user_tab_columns where TABLE_NAME='''||table_name||''')';
    EXECUTE IMMEDIATE get_column_num_sql INTO column_num;  --获取列数
    dbms_output.put_line(table_name||'表,共有'||column_num||'行');

--实现分页输出    
    --临时执行的sql
    tmp_sql:='select tt.* from (select rownum as r_num, t.* from  (select * from '||table_name||' ) t) tt where tt.r_num>='||firstRow||' and  r_num<='||lastRow;
    --动态游标
    cur_1:=dbms_sql.open_cursor;
    dbms_sql.parse(cur_1,tmp_sql,dbms_sql.native);
     --定义游标的列
    for n in 1..column_num+1 loop
        my_array(n):='';
    end loop;
    
    for n in 1..column_num+1 loop
        dbms_sql.define_column(cur_1,n,my_array(n),50);
    end loop;
    
    process:=dbms_sql.execute(cur_1);
    
    loop
        if dbms_sql.fetch_rows(cur_1)>0 then
            for n in 1..column_num+1 loop
                dbms_sql.column_value(cur_1,n,my_array(n));
                dbms_output.put('......'||my_array(n));
            end loop;
            dbms_output.put_line('');    
        else
            exit;
        end if;
    end loop;
end;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值