Oracle管道函数pipelined function的用法小结

 更新时间:2023年07月27日 15:29:12   作者:DbWong_0918  
这篇文章主要介绍了Oracle管道函数pipelined function的用法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

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)
)

其中数据如下

然后我们开始写管道函数

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中打开就是这样的

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

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

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

比如我们加上where

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

则得到的结果就是这样的

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

PS:在管道函数中可以进行DML操作,一般要加自治事务处理,但是不能直接对管道函数结果集进行DML操作,如果要对管道函数进行DML操作,建议做成视图再加触发器

使用管道函数制作分割函数的部分放在了这里

具体实现逻辑:

CREATE OR REPLACE FUNCTION test_Row_pipelined(p_insvar    in varchar2,
                                                  p_delimiter in varchar2)
  return test_Row_Type_TABLE
  pipelined as
  p_num     integer := 1;
  p_num1    integer;
  p_length  integer;
  p_start   integer := 1;
  p_varchar varchar2(200);
  ret       test_Row_Type;
begin
  --如果不是以分隔符结尾的,就拼接上去
  select case
           when (select count(1)
                   from dual
                  where p_insvar like '%' || p_delimiter) > 0 then
            p_insvar
           else
            p_insvar || p_delimiter
         end
    into p_varchar
    from dual;
  --整个字符串的长度
  select length(p_varchar) into p_length from dual;
  --当起始长度大于整体长度的时候
  while (p_start <= p_length) loop
    --找到字符串与分隔符的分割后的下标
    select instr(p_varchar, p_delimiter, p_start) into p_num1 from dual;
    --如果没有,则返回全部字符串,说明到了结尾了
    if p_num1 = 0 then
      ret := test_Row_Type(p_num,
                               substr(p_varchar, p_start),
                               p_num1,
                               p_start,
                               p_length,
                               0,
                               0);
      pipe row(ret);
    else
      --否则,截取字符传中,从p_start开始找到下标减去p_start的部分
      ret := test_Row_Type(p_num,
                               substr(p_varchar, p_start, p_num1 - p_start),
                               p_num1,
                               p_start,
                               p_length,
                               0,
                               0);
      pipe row(ret);
     --新的起始点为下标加1
      p_start := p_num1 + 1;
    end if;
    --序号加1
    p_num := p_num + 1;
  end loop;
  return;
end;

到此这篇关于Oracle管道函数pipelined function简单的使用的文章就介绍到这了,更多相关oracle管道函数使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Oracle 11g简体中文版安装图文教程

    Oracle 11g简体中文版安装图文教程

    这篇文章主要以图文结合的方式为大家介绍了Oracle 11g简体中文版的安装过程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • Oracle使用fy_recover_data恢复truncate删除的数据

    Oracle使用fy_recover_data恢复truncate删除的数据

    这篇文章主要介绍了Oracle使用fy_recover_data恢复truncate删除的数据,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下
    2022-07-07
  • 教你如何通过PL/SQL创建序列和触发器实现表自增字段

    教你如何通过PL/SQL创建序列和触发器实现表自增字段

    本文给大家分享如何通过PL/SQL创建序列和触发器实现表自增字段,需要注意的是,在数据库操作中,触发器的使用对系统资源耗费相对较大,考虑到大表操作的性能问题, 我们尽可能的减少触发器的使用,改为直接手动调用序列函数即可
    2022-11-11
  • 教你设计大型Oracle数据库

    教你设计大型Oracle数据库

    表及索引的存储容量估算是根据其记录长度及估算的最大记录数确定的。在容量计算中考虑了数据块的头开销及记录和字段的头开销等等。表及索引的initial和next存储参数一般设为相等,pctincrease设为0。
    2009-06-06
  • Oracle中TO_NUMBER()函数的使用

    Oracle中TO_NUMBER()函数的使用

    本文主要讲解Oracle数据库中的TO_NUMBER()函数的相关知识点,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-08-08
  • Oracle undo_management参数不一致错误

    Oracle undo_management参数不一致错误

    因RAC的undo_management参数不一致导致Oracle数据库mount报ORA-01105 ORA-01606错误,本文就这个问题
    2013-11-11
  • oracle RETURNING 子句使用方法

    oracle RETURNING 子句使用方法

    这篇文章主要介绍了oracle RETURNING 子句使用方法,需要的朋友可以参考下
    2016-02-02
  • oracle日期时间型timestamp的深入理解

    oracle日期时间型timestamp的深入理解

    本篇文章是对oracle中日期时间型timestamp函数进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • 解决Oracle RMAN删除归档日志不释放问题的方法

    解决Oracle RMAN删除归档日志不释放问题的方法

    RMAN清除方式会自动清除磁盘上的归档日志文件,同时会释放控制文件中对应的归档日志的归档信息,但最近在使用中就遇到了一个问题,下面这篇文章主要给大家介绍了关于解决Oracle RMAN删除归档日志不释放问题的方法,需要的朋友可以参考下。
    2017-07-07
  • group by,having,order by的用法详解

    group by,having,order by的用法详解

    如果一个查询中使用了分组函数,任何不在分组函数中的列或表达式必须要在group by中,下面为大家简要介绍下group by,having,order by的用法
    2013-09-09

最新评论