【Oracle】 管道函数pipelined function简单的使用

DbWong_0918 / 2023-07-26 / 原文

Oracle 管道函数pipelined function简单的使用

如果在函数(function)中加关键字 pipelined,就表明这是一个oracle管道函数,其返回值类型必为 集合,体现出来的数据结构类似于表,即可以理解成,使用管道函数可以返回一张查询表,可以是单行数据也可以是多行数据,而不是平常函数返回的单行数据

这种返回多行数据在需要大数据量处理的时候很有用,且在复杂的方法下更好地去处理一些复杂的逻辑查询

要使用管道函数的话需要先进行一下类型的类型的创建

首先我们创建一个类型对象

CREATE OR REPLACE Type test_Row_Type As Object
(
  test1 Varchar2(512),
  test2 Varchar2(3000),
  test3 Varchar2(3000),
  test4 Varchar2(3000),
  test5 Varchar2(3000),
  test6 Number,
  test7 Number
)

然后我们创建嵌套的表

CREATE OR REPLACE TYPE test_Row_Type_TABLE AS TABLE OF test_Row_Type;

接下来创建一个临时表,用来测试数据

create table TTTtable
(
  aaa VARCHAR2(50),
  bbb VARCHAR2(50),
  ccc VARCHAR2(50)
)

其中数据如下

image

然后我们开始写管道函数

CREATE OR REPLACE FUNCTION test_Row_pipelined(p_varchar in varchar2)
  return test_Row_Type_TABLE
  --关键字加在这里
  pipelined as
  p_num integer := 0;
  ret   test_Row_Type;
begin
  --查询临时表数据
  for sub_data in (select t.bbb, t.ccc
                     from TTTtable t
                    where t.aaa = p_varchar) loop
  
    p_num := p_num + 1;
    
    ret := test_Row_Type(p_num,
                             sub_data.bbb,
                             sub_data.ccc,
                             '',
                             '',
                             0,
                             0);
    --将数据放入管道,pipe row()语法被用来返回该集合的单个元素
    pipe row(ret);
  
  end loop;
  --函数使用一个空的return结束
  return;
end;

如果是使用

select test_Row_pipelined('a') from dual

则返回的是<Collection>数据,此时在PL/SQL中打开就是这样的

image

同时,我们还可以使用这种语法

select * from table(test_Row_pipelined('a')) t

结果也是这样的,不过推荐使用这种方法,因为这种方式是可以使用where条件去进行过滤的

比如我们加上where

select t.* from table(test_Row_pipelined('a')) t where t.test1 = 1

则得到的结果就是这样的

image

这就是管道函数的最基本的用法