oracle存储过程、函数库

  1. --获取当前日期函数
   Function Fn_GetCurrentDate Return Varchar2
   Is
   
       v_CurrentDate VARCHAR2(19);
       
       Begin
         Select to_char(sysDate,'yyyy-MM-dd')
         Into v_CurrentDate
         From dual;
         
         Return V_CurrentDate;
   End Fn_GetCurrentDate; 

        2、--获取指定日期之间的连续日期数据集

Function Fn_GetDateList(v_startDate varchar2, v_endDate varchar2) Return recordType
   Is
       v_dateRecord recordType;
       
   Begin
             Open v_dateRecord For
             Select  TO_DATE(v_startDate, 'YYYY-MM-DD') + NUMTODSINTERVAL(level, 'day') thisDate  
             From  dual
             Connect By Level <= To_Date(v_endDate,'yyyy-mm-dd') - To_Date(v_startDate, 'yyyy-mm-dd');      
            
             Return  v_dateRecord;  
   End  Fn_GetDateList;

采用游标方式返回数据集的读取方法

Declare
   dateRecord       Pkg_Stm_Date.recordType; --定义ref cursor型变量
   dateValue        Varcahr2(20);
Begin
   --调用函数,获得记录集
   dateRecord := Pkg_Stm_Date.Fn_GetDateList('2013-03-01','2013-06-01');
   
   --fetch结果并显示
   Fetch dateRecord Into dateValue;
   
   while dateRecord % Found loop
      dbms_output.put_line(dateValue);
      fetch dateRecord into dateValue;
   End Loop;
End;

 

通过在oracle包中定义一个返回连续日期的数据集函数。实现原理如下:

 

          从oracle 9i 开始,提供了一个叫做“管道化表函数”的概念,来解决这个问题。这种类型的函数,必须返回一个集合类型,且标明 pipelined。这个oracle函数不能返回具体变量,必须以一个空 return 返回。这个oracle函数中,通过 pipe row () 语句来送出要返回的表中的每一行。调用这个oracle函数的时候,通过 table() 关键字把管道流仿真为一个数据集。

第一步:创建表类型

 

create or replace type DateRecord as table of varchar2(8000)

 

 

第二部:在包中定义函数

 

   --获取连续的日期列表,返回结果集
   Function Fn_GetDateTable(P_StartDate varchar2, P_EndDate varchar2) return DateRecord pipelined;

 

 

第三部:在包体中定义函数实体

   --返回日期列表,以表数据方式显示可以进行表关联
   Function Fn_GetDateTable(P_StartDate Varchar2, P_EndDate Varchar2) RETURN DateRecord pipelined
   Is
   Begin
		for dateRow in 
		(
		    select TO_DATE(P_StartDate, 'yyyy-mm-dd') + NUMTODSINTERVAL(level, 'day') thisDate
			from dual
			Connect By Level <= To_Date(P_EndDate,'yyyy-mm-dd') - To_Date(P_StartDate, 'yyyy-mm-dd')
		) loop
		    PIPE ROW(dateRow.thisDate);
		    end loop;
		return;   
   End Fn_GetDateTable;

 

第四部:调用方法

 

select column_value
from table(Pkg_Stm_Date.Fn_GetDateTable('2013-03-01','2013-06-01'));



oracle声明数据包格式

 

create or replace package PKG_TCH_COURSE_Init is

  -- Author  : ADMINISTRATOR
  -- Created : 2013-6-17 16:50:19
  -- Purpose : 定义数据包功能描述
    
    /*声明存储过程*/
    PROCEDURE SP_TCH_CourseTable_Init(
        schoolId     IN NUMBER   DEFAULT 0,
        gradeId      IN NUMBER   DEFAULT 0,
        classId      IN NUMBER   DEFAULT 0 ,
        queryDate    IN VARCHAR  DEFAULT '',
        courseType   IN NUMBER   DEFAULT 0
    );

end PKG_TCH_COURSE_Init;


 

 

 

 


posted @ 2013-06-09 10:16  wala-wo  阅读(164)  评论(0编辑  收藏  举报