Oracle function 函数返回结果集的三种方法

一、简介

在使用Oracle数据过程中,函数是非常好用的,我们经常定义一个函数用来处理相同的相似的问题的结果。

通常我们使用函数返回的都是单独的值,可能是NUMBER,也可能是VARCHAR类型,其实使用函数也可以返回类似于表结构数据的形式的数据集。

最常用的是游标的方式,其次是Table的形式,最后又产生了管道的方式。管道的方式与前两者不同的地方有它可以不用返回值,即RETURN后不用接内容,它是一行一行的返回数据。Table和管道的方式在调用时都是通过'TABLE()'关键字将函数的返回内容仿真成一个数据集。

二、举例三种返回结果集的方法

1、以游标形式返回结果集

(1)创建函数

CREATE OR REPLACE FUNCTION FN_R_REFCUR(P_VALUE IN VARCHAR2)
RETURN SYS_REFCURSOR IS
	C_EMPNO SYS_REFCURSOR;
BEGIN
		OPEN C_EMPNO FOR
			SELECT NAME,ADDR FROM EMP WHERE ADDR=P_VALUE;
	RETURN(C_EMPNO);
END;
/

(2)调用函数

SELECT FN_R_REFCUR('Raphael') FROM DUAL;

2、以Table形式返回结果集

(1)创建函数

--定义一个行类型

CREATE OR REPLACE TYPE TYPE_TTEMP_ROW AS OBJECT(NAME VARCHAR2(10), ADDR VARCHAR2(20));

--定义一个表类型

CREATE OR REPLACE TYPE TYPE_TEMP_TABLE AS TABLE OF TYPE_TTEMP_ROW;

--创建函数

CREATE OR REPLACE FUNCTION FN_R_TAB (P_VALUE IN VARCHAR2)
RETURN TYPE_TEMP_TABLE IS
	TEMP_ROW TYPE_TTEMP_ROW; -- 定义单行
	TEMP_TABLE TYPE_TEMP_TABLE := TYPE_TEMP_TABLE(); -- 定义返回结果,并初始化
BEGIN
	FOR CURROW IN (SELECT NAME, ADDR FROM EMP WHERE NAME=P_VALUE) -- 查询名字是参数的值的结果
	LOOP
		TEMP_ROW := TYPE_TTEMP_ROW(CURROW.NAME, CURROW.ADDR); -- 获得一行
		TEMP_TABLE.EXTEND; -- 表类型增加一行(EXTEND就是扩展的意思,相当于增加一行数据空间)
		TEMP_TABLE(EMP_TABLE.COUNT) := TEMP_ROW; -- 一行放进去
	END LOOP;
	RETURN(TEMP_TABLE);
END;
/

(2)调用函数

SELECT * FROM TABLE(FN_R_TAB('Raphael'));

3、以管道形式返回结果集

(1)创建函数

--定义一个行类型

CREATE OR REPLACE TYPE TYPE_TTEMP_ROW AS OBJECT(NAME VARCHAR2(10), ADDR VARCHAR2(20));

--定义一个表类型

CREATE OR REPLACE TYPE TYPE_TEMP_TABLE AS TABLE OF TYPE_TTEMP_ROW;

--创建函数

CREATE OR REPLACE FUNCTION FN_R_PIP(P_VALUE IN VARCHAR2)
RETURN TYPE_TEMP_TABLE PIPELINEDIS
	TEMP_ROW TYPE_TTEMP_ROW; --定义一个行对象类型变量
BEGIN
	FOR CURROW IN (SELECT NAME, ADDR FROM EMP WHERE NAME=P_VALUE) -- 查询名字是参数值的结果
	LOOP
		TEMP_ROW := TYPE_TTEMP_ROW(CURROW.NAME, CURROW.ADDR); -- 获得一行
		PIPE ROW (TEMP_ROW); -- 返回一行
	END LOOP;
	RETURN; -- 这里返回没有值
END;
/

(2)调用函数

SELECT * FROM TABLE(FN_R_PIP('Raphael'));

官网地址:Oracle | Cloud Applications and Cloud Platform

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Raphael-laq

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值