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

 更新时间:2023年07月07日 09:02:11   作者:Raphael-laq  
工作中常需要经过一段复杂逻辑处理后,得出的一个结果集,所以这篇文章主要给大家介绍了关于Oracle function函数返回结果集的3种方法,需要的朋友可以参考下

一、简介

在使用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

总结

到此这篇关于Oracle function函数返回结果集的3种方法的文章就介绍到这了,更多相关Oracle function函数返回结果集内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Oracle数据库升级或数据迁移方法研究

    Oracle数据库升级或数据迁移方法研究

    本文详细论述了oracle数据库升级的升级前的准备、升级过程和升级后的测试与调整工作,并对各种升级方法在多种操作系统平台上作了测试。
    2016-07-07
  • oracle表的简单操作步骤

    oracle表的简单操作步骤

    这篇文章主要介绍了oracle表的简单操作步骤,需要的朋友可以参考下
    2017-06-06
  • oracle执行cmd的实现方法

    oracle执行cmd的实现方法

    装了一个oracle db11g,于是想试一下网上流传的在sqlplus中执行cmd的一些命令,也不知怎么的,没一个好用的,可能是网上转来转去的转错了.
    2009-04-04
  • Oracle库恢复删除数据的方法小结

    Oracle库恢复删除数据的方法小结

    误删 Oracle 库中的数据,在不考虑全库备份和利用归档日志情况,如何恢复数据呢,这篇文章将给大家介绍几种方法恢复数据,文章通过代码示例给大家介绍的非常详细,需要的朋友可以参考下
    2023-12-12
  • Oracle 游标使用总结

    Oracle 游标使用总结

    游标(CURSOR)也叫光标,在关系数据库中经常使用,在PL/SQL程序中可以用CURSOR与SELECT一起对表或者视图中的数据进行查询并逐行读取。
    2009-10-10
  • Oracle 子程序参数模式,IN,OUT,NOCOPY

    Oracle 子程序参数模式,IN,OUT,NOCOPY

    Oracle 子程序参数模式主要有IN,OUT,NOCOPY,IN和OUT可以组合,OUT和NOCOPY也可以组合使用.
    2009-10-10
  • Oracle LogMiner的使用实例代码

    Oracle LogMiner的使用实例代码

    这篇文章主要给大家分享了关于Oracle LogMiner的使用实例代码,文中通过示例代码介绍了关于查询当前日志组、业务用户插入操作、归档日志切换、业务用户插入操作以及归档日志切换等等的相关功能,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-07-07
  • oracle自动清理archivelog文件的具体方法

    oracle自动清理archivelog文件的具体方法

    这篇文章介绍了oracle自动清理archivelog文件的具体方法,有需要的朋友可以参考一下
    2013-09-09
  • zabbix监控oracle表空间的操作方法

    zabbix监控oracle表空间的操作方法

    Zabbix是一款开源的网络监控和管理系统,可以用于监控各种网络设备、服务器和应用程序等,本文给大家介绍了zabbix监控oracle表空间的操作方法,并通过代码示例和图文讲解的非常详细,需要的朋友可以参考下
    2024-04-04
  • IntelliJ DataGrip Oracle 11g远程连接的方法步骤

    IntelliJ DataGrip Oracle 11g远程连接的方法步骤

    本文主要介绍了IntelliJ DataGrip Oracle 11g远程连接的方法步骤,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09

最新评论