orcl_fenye

select * from (select emp.*,rownum rn from emp where rownum <= 6) where rn >= 3;


--创建一个包,在这个包类声明一个游标类型
create or replace package my_fenye_package as
type my_fenye_cursor is ref cursor;
end my_fenye_package;

--创建分页存储过程
create or replace procedure my_fenye_pro
(
       table_name varchar2,--输入,表名
       page_no number,--输入,当前页号
       page_size number,--输入,每页记录数
       total_counts out number,--输出,总记录数
       page_object out my_fenye_package.my_fenye_cursor --输出,每页记录
)
is
       v_sql varchar2(2000);
       v_begin number := (page_no-1)*page_size;
       v_end number := page_no * page_size;
begin
       open page_object for 'select * from (select '||table_name|| '.*,rownum rn from '||table_name||' where rownum <= '||v_end||') where rn > '||v_begin;
       v_sql := 'select count(*) from '||table_name;
       execute immediate v_sql into total_counts;
       --close page_object;
end;



关于execute immediate的问题
execute immediate用来执行动态sql,比如表的名字在运行时才知道,则需要这个语句
语法:execute immediate v_sql into v_result using 参数1 参数2 。。。
解释:使用参数1、参数2,执行v_sql语句,将返回值赋给变量v_result。(当然返回值只能是一行数据)
其实这个东西就是类似于JDBC中的preparedstatement
例子:
declare
  v_sql varchar2(2000);
  v_deptno number;
begin
  v_sql := 'select deptno from emp where ename = :1';
  execute immediate v_sql into v_deptno using 'SCOTT';
  dbms_output.put_line(v_deptno);
end;





在select语句中,例如count(),max(),min(),avg(),sum(),等组函数,不能写在where语句的后面
在带有group by子句的查询语句中,在select列表中指定的列要么是group by字句中指定的列,要么是组函数
查询语句的select, order by 和having字句是聚组函数唯一出现的地方,在where子句中不能出现组函数

你可能感兴趣的:(sql,jdbc)