`

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;
 
分享到:
评论

相关推荐

    PL/SQL中编写Oracle数据库分页的存储过程

    此文以oracle数据库中的SCOTT用户的EMP表为例,用PL/SQL Developer编写一个分页存储过程,要求是:可以输入表名,每页显示记录数,当前页,返回总记录数,总页数和返回的结果集。 由于需要返回查询出来的结果集,...

    orcal存储过程查询分页

    orcale存储过程分页,在pl/sql developer环境下

    oracle分页查询

    oracle分页查询,以及用java、asp.net调用存储过程的示例。 pl/sql测试包内带结果集的存储过程示例。

    oracle使用管理笔记(一些经验的总结)

    (7)PL/SQL进阶分页过程 62 (8)PL/SQL进阶例外 62 (9)视图 62 22.数据库管理+表的逻辑备份与恢复 63 23.数据字典和动态性能视图 67 24.oracle的卸载 69 25.尚学堂SQL简单讲解 70 Oracle常用函数 73 (1)trunc(for date...

    oracle mysql 笔记

    oracl函数 事物 游标 存储 mysql分页 sql语句拼写 pl/sql

    ORCALE PLSQL示例

    基本PL/SQL 的使用 带有流程控制的过程 过程的应用篇 存储过程应用篇--分页

    SQL培训第一期

    存储过程是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中。用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。 1.9.2 准备 create table t_user ( username varchar2(20), ...

    JDBC 3.0数据库开发与设计

    4.2.5 SQL Server存储过程编程经验技巧 4.3 成批更新(BatchedUpdate) 4.3.1 成批更新所使用的对象 4.3.2 使用成批更新的实例 4.4 行集合对象 4.4.1 设计时行集合 4.4.2 运行时行集合 4.4.3 非标准JDBC API...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    SQL(Structured Query Language)结构化查询语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。同时也是数据库脚本文件的扩展名。  SQL语言主要包含5个部分  数据定义...

    数据库访问性能优化

    在书店也看到了许多数据库优化的专业书籍,但是感觉更多是面向DBA或者是PL/SQL开发方面的知识,个人感觉不太适合普通程序员。而要想做到数据库优化的高手,不是花几周,几个月就能达到的,这并不是因为数据库优化有...

    asp.net知识库

    常用sql存储过程集锦 存储过程中实现类似split功能(charindex) 通过查询系统表得到纵向的表结构 将数据库表中的数据生成Insert脚本的存储过程!!! 2分法-通用存储过程分页(top max模式)版本(性能相对之前的not in版本...

    ORACLE9i_优化设计与系统调整

    §10.11 确定数据库对象存储大小 117 §10.11.1 非簇表的大小计算 117 §10.11.2 索引大小计算 119 §10.11.3 簇表的大小计算 120 §10.11.4 位图索引的大小计算 122 §10.12 应用类型设计考虑要点 122 §10.13 应用...

    php网络开发完全手册

    16.3.2 存储过程的创建与调用 264 16.3.3 存储过程的参数 265 16.3.4 复合语句 267 16.3.5 变量 268 16.3.6 条件语句 269 16.3.7 循环语句 271 16.3.8 游标 273 16.3.9 存储过程的删除 275 16.4 触发器的设计 275 ...

    Oracle事例

    14、查询从多少行到多少行的记录(可以用在web开发中的分页显示) select * from ( select rownum row_id,b.* from (select a.* from sys_oper a) b ) where row_id between 15 and 20 15、对公共授予访问权 ...

    精髓Oralcle讲课笔记

    --(将sal的查询结果转化为字符串,与ename连接到一起,相当于Java中的字符串连接) 7、select ename||'afasjkj' from emp; --字符串的连接 8、select distinct deptno from emp; --消除deptno字段重复的值 9、...

    Java面试宝典2020修订版V1.0.1.doc

    24、什么是PL/SQL? 49 25、序列的作用 50 26、表和视图的关系 50 27、oracle基本数据类型 50 28、drop、truncate、 delete区别 50 29、如何优化大数据量的访问? 51 30、oracle怎么去除去重 51 31、合并查询有哪些...

Global site tag (gtag.js) - Google Analytics