CREATE OR REPLACE PACKAGE SCOTT.pkg_test as
/* 定義ref cursor類型
不加return類型,為弱類型,允許動態sql查詢,
否則為強類型,無法使用動態sql查詢;
*/

type myrctype 
is ref cursor

--函數申明
function get(intID number , bbn out numberreturn myrctype;

Procedure getstudent( 
        intID 
number,
       return_list out myrctype 
  );

function getforpage(  
    Pcount out 
number,               --返回分頁總數
    Pindex in number,                --分頁索引   
    Psize in number,              --頁面大小
    Pordby  in varchar               --排序字段
return myrctype;

Procedure getforpagep( 
    Pcount out 
number,               --返回分頁總數
    return_list out myrctype,
    Pindex 
in number,                --分頁索引   
    Psize in number,               --頁面大小
    Pordby   in varchar               --排序字段
  );

end pkg_test;

CREATE OR REPLACE PACKAGE BODY SCOTT.pkg_test as
--函數體
    function get(intID number ,bbn out numberreturn myrctype is
        rc myrctype; 
--定義ref cursor變量
        sqlstr varchar2(500);
        
begin
            
if intID=0 then
                
--靜態測試,直接用select語句直接返回結果
                open rc for select id,name,sex,address,postcode,birthday from student;
            
else
                
--動態sql賦值,用:w_id來申明該變量從外部獲得
                sqlstr :='select id,name,sex,address,postcode,birthday from student where id=:w_id';
                
--動態測試,用sqlstr字符串返回結果,用using關鍵詞傳遞參數
                open rc for sqlstr using intid;
            
end if;
        bbn :
= 0;
        
return rc;
    
end get;
    
  
Procedure getstudent( 
         intID 
number,
       return_list out myrctype 
  )
as 
   
   
begin 
       
open return_list
       
for 
        
select id,name,sex,address,postcode,birthday from student;
  
end getstudent; 



function getforpage(  
    Pcount out 
number,               --返回分頁總數
    Pindex in number,                --分頁索引   
    Psize in number,              --頁面大小
    Pordby  in varchar               --排序字段
return myrctype
    
is
          rc myrctype; 
--定義ref cursor變量
          sqlstr varchar2(500);
          v_sql 
VARCHAR2(1000);
          v_count 
number;  
          v_Plow 
number;
          v_Phei 
number;
        
begin
            sqlstr :
='select id,name,sex,address,postcode,birthday from student';
              
------------------------------------------------------------取分頁總數
              v_sql := 'select count(*) from (' || sqlstr || ')';
              
execute immediate v_sql into v_count;
              Pcount :
= ceil(v_count/Psize);
              
------------------------------------------------------------顯示任意頁內容
              v_Phei := Pindex * Psize + Psize;
              v_Plow :
= v_Phei - Psize + 1;
              
--Psql := 'select rownum rn,t.* from cd_ssxl t' ;            --要求必須包含rownum字段
              ---select * from (select rownum rn , t.* from  (select  t.* from student t) t )where rn between '2' and '3'
              v_sql := 'select id,name,sex,address,postcode,birthday from (select rownum rn , t.* from  (' || sqlstr || ') t order by '|| Pordby ||') where rn between ' || v_Plow || ' and ' || v_Phei ;

              
open rc for v_sql;
            
return rc;
    
end getforpage;




Procedure getforpagep( 
    Pcount out 
number,               --返回分頁總數
    return_list out myrctype,
    Pindex 
in number,                --分頁索引   
    Psize in number,               --頁面大小
    Pordby  in varchar               --排序字段
  )as 
          rc myrctype; 
--定義ref cursor變量
          sqlstr varchar2(500);
          v_sql 
VARCHAR2(1000);
          v_count 
number;  
          v_Plow 
number;
          v_Phei 
number;
   
        
begin
            sqlstr :
='select id,name,sex,address,postcode,birthday from student';
              
------------------------------------------------------------取分頁總數
              v_sql := 'select count(*) from (' || sqlstr || ')';
              
execute immediate v_sql into v_count;
              Pcount :
= ceil(v_count/Psize);
              
------------------------------------------------------------顯示任意頁內容
              v_Phei := Pindex * Psize + Psize;
              v_Plow :
= v_Phei - Psize + 1;
              
--Psql := 'select rownum rn,t.* from cd_ssxl t' ;            --要求必須包含rownum字段
              
              v_sql :
= 'select id,name,sex,address,postcode,birthday from (select rownum rn , t.* from  (' || sqlstr || ') t order by '|| Pordby ||' ) where rn between ' || v_Plow || ' and ' || v_Phei ;

              
open return_list for v_sql;
      
end getforpagep;


end pkg_test;
/