oracle function 返回结果集
### Oracle Function 返回结果集 #### 知识点概述 在Oracle数据库中,有时我们需要创建一个函数来返回一个结果集(即一系列记录),而非单一值。本文档中的代码示例展示了如何定义一个返回自定义表类型的函数`Ns_IIS_GetPeriod`,该函数根据指定的日期范围和周期类型返回一组日期范围。 #### 详细解析 ##### 定义自定义表类型 我们需要定义一个自定义的表类型`Ns_IIS_GetPeriod_type`,它将用于存储函数返回的结果集。自定义表类型是由单个记录类型组成的数组类型,其中记录类型`Ns_IIS_GetPeriod_table`包含三个字段:描述`dscp`、起始日期`firstDay`和结束日期`lastDay`。 ```sql CREATE OR REPLACE TYPE Ns_IIS_GetPeriod_table AS OBJECT ( dscp VARCHAR2(20), firstDay DATE, lastDay DATE ); CREATE OR REPLACE TYPE Ns_IIS_GetPeriod_type IS TABLE OF Ns_IIS_GetPeriod_table; ``` 这里,`Ns_IIS_GetPeriod_table`定义了一个对象类型,它包含三个属性:描述字符串`dscp`、起始日期`firstDay`和结束日期`lastDay`。接着,我们定义了`Ns_IIS_GetPeriod_type`类型,这是一个由`Ns_IIS_GetPeriod_table`对象组成的表类型。 ##### 创建函数 接下来,定义了函数`Ns_IIS_GetPeriod`,该函数接受三个参数:起始日期`sDate`、结束日期`eDate`以及周期类型`periodType`,并返回一个`Ns_IIS_GetPeriod_type`类型的表。 ```sql CREATE OR REPLACE FUNCTION Ns_IIS_GetPeriod( sDate IN DATE, eDate IN DATE, periodType IN VARCHAR2 ) RETURN Ns_IIS_GetPeriod_type AS GetPeriod_type Ns_IIS_GetPeriod_type := Ns_IIS_GetPeriod_type(); tmpDate DATE; tmpf DATE; tmpl DATE; dscp VARCHAR2(30); tmpfchar VARCHAR2(30); tmplchar VARCHAR2(30); BEGIN -- 函数体 ``` 在函数体内部,我们初始化了一些变量,并通过一个循环遍历起始日期和结束日期之间的每个日期。根据不同的`periodType`值,我们计算出每个周期的起始日期和结束日期,并将它们添加到结果集中。 ##### 处理不同周期类型 根据不同的周期类型(0、1或2),我们分别处理每天、每月或每年的周期: - **周期类型0**:每天作为一个周期。 - **周期类型1**:每个月作为一个周期。 - **周期类型2**:每年作为一个周期。 ```sql IF periodType = '0' THEN -- 每天作为周期 ELSIF periodType = '1' THEN -- 每月作为周期 ELSIF periodType = '2' THEN -- 每年作为周期 END IF; ``` 对于每种周期类型,我们都会根据当前日期计算出周期的起始和结束日期,并使用这些信息填充`Ns_IIS_GetPeriod_table`类型的实例,并将其添加到结果集中。 ##### 使用函数 我们可以通过以下语句调用该函数并查看结果: ```sql SELECT * FROM TABLE(Ns_IIS_GetPeriod(to_date('2011-7-1', 'yyyy-MM-dd'), to_date('2011-7-28', 'yyyy-MM-dd'), '0')); ``` 这行代码将返回2011年7月1日至2011年7月28日之间按天划分的所有周期。 #### 总结 通过上述示例,我们可以看到如何在Oracle数据库中创建一个能够返回结果集的函数。这种方法非常适合需要处理大量数据或复杂查询逻辑的情况。此外,通过定义自定义表类型和使用循环结构,我们可以灵活地处理不同的数据需求,提高代码的复用性和可维护性。
CREATE OR REPLACE Type Ns_IIS_GetPeriod_table As Object
(
dscp VARCHAR2(20) ,
firstDay DATE ,
lastDay DATE
)
CREATE OR REPLACE Type Ns_IIS_GetPeriod_type Is Table Of Ns_IIS_GetPeriod_table
//function
CREATE OR REPLACE Function Ns_IIS_GetPeriod(
sDate in date,
eDate in date,
periodType in varchar2
)
RETURN Ns_IIS_GetPeriod_type
AS
GetPeriod_type Ns_IIS_GetPeriod_type := Ns_IIS_GetPeriod_type();
tmpDate DATE;
tmpf DATE;
tmpl DATE;
dscp VARCHAR2(30);
tmpfchar VARCHAR2(30);
tmplchar VARCHAR2(30);
- viqn7qdnt2012-04-28额。。。这完全只是个例子啊,不太适合学习的,没有详细的备注说明,不过还是谢谢了,唉。。。
- swetter_hundsun2012-12-31注释真心不能缺。
- shaojie198010022013-07-15一个例子而已
- 进阶的老粘人2013-05-23能在具体一点就好了
- 粉丝: 0
- 资源: 26
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助