oracle 创建函数/程序包

1.类型

create or replace
type type_split as table of varchar2(4000); 

2.函数体

create or replace

function f_split
(
   p_list varchar2,
   p_sep varchar2 := ','
)  
return type_split pipelined
 is
   l_idx  int;
   v_list  varchar2(4000) := p_list;
begin
   loop
      l_idx := instr(v_list,p_sep);
      if l_idx > 0 then
          pipe row(substr(v_list,1,l_idx-1));
          v_list := substr(v_list,l_idx+length(p_sep));
      else
          pipe row(v_list);
          exit;
      end if;
   end loop;
   return;

end f_split;



3.程序包声明

create or replace
PACKAGE Pk_pagination
IS
type type_cur
IS
  ref
  CURSOR; --定义游标变量用于返回记录集
  PROCEDURE Proc_pagination (
      Psql   IN VARCHAR2,   --产生分页数据的查询语句
      Pindex IN NUMBER,     --要显示的页数索引,从0开始
      Psize  IN NUMBER,     --每页显示记录数
      PpageCount OUT NUMBER,    --返回总的分页数
      ProwCount OUT NUMBER, --返回总的记录数
      v_cur OUT type_cur    --返回分页数据的游标
  );
END Pk_pagination;
 

1)程序实体

create or replace
PACKAGE body Pk_pagination
IS
PROCEDURE Proc_pagination(
    Psql   IN VARCHAR2,    --产生分页数据的查询语句
    Pindex IN NUMBER,      --要显示的页数索引,从0开始
    Psize  IN NUMBER,      --每页显示记录数
    PpageCount OUT NUMBER, --返回的分页数
    ProwCount OUT NUMBER,  --返回的记录数
    v_cur OUT type_cur     --返回分页数据的游标
  )
AS
  v_sql   VARCHAR2(4000);
  v_begin NUMBER;
  v_end   NUMBER;
BEGIN
  /*不需要查询总数量和分页记录数的情况*/
  IF regexp_like(Psql, '/\*no count\*/') THEN
    ProwCount  := 0;
    PpageCount := 0;
    v_end      := (Pindex - 1) * Psize + Psize;
    v_begin    := v_end - Psize + 1;
    v_sql      := 'select rownum as rn, t.* from (' || Psql || ') t where rownum < ' || (v_end + 1);
    v_sql      := 'select * from (' || v_sql || ') where rn > ' || (v_begin - 1);
    OPEN v_cur FOR v_sql;
  ELSE
    IF regexp_like(Psql, '/\*.*count.*\*/') THEN
      v_sql := REPLACE(REPLACE(regexp_substr(Psql,'/\*.*count.*\*/'), '/*', ''), '*/', '');
    ELSE
      v_sql := 'select count(*) from (' || Psql || ')';
    END IF;
    
    EXECUTE immediate v_sql INTO Prowcount; --计算记录总数
    
    IF Prowcount = 0 THEN
      OPEN v_cur FOR SELECT 0 AS rn FROM dual WHERE 1 = 0;
      PpageCount          := 0;
    ELSE
      PpageCount := ceil(Prowcount / Psize); --计算分页总数
      --显示任意页内容
      v_end   := (Pindex - 1) * Psize + Psize;
      v_begin := v_end   - Psize + 1;
      --v_sql    := 'select rownum as rn, t.* from (' || Psql || ') t';
      --v_sql    := 'select * from (' || v_sql || ') where rn between ' || v_begin || ' and ' || v_end;
      v_sql := 'select rownum as rn, t.* from (' || Psql || ') t where rownum < ' || (v_end + 1);
      v_sql := 'select * from (' || v_sql || ') where rn > ' || (v_begin - 1);
      OPEN v_cur FOR v_sql;
    END IF;
  END IF;
END Proc_Pagination;
END Pk_pagination;

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值