管道函数

  TYPE datetime_range_list IS TABLE OF datetime_range_record;
  --当前工作时间下,产线的出勤信息(包括当前班组、出勤起止时间等)
  TYPE record_attendance_info IS RECORD(
    workgroup_arrange_id      VARCHAR2(32), --班组排班ID
    resource_calendar_id      VARCHAR2(32), --资源日历ID
    workgroup_id              VARCHAR2(32), --班组ID
    attendance_id             VARCHAR2(32), --出勤模式ID
    shift_code                VARCHAR2(80), --班次编码
    shift_date                DATE, --出勤日期(精确到日)
    time_range                VARCHAR2(2000), --资源日历出勤时间表达式
    work_datetime             DATE, --当前工作时间(完整时间)
    attendance_datetime_begin DATE, --出勤开始时间(精确到分钟)
    attendance_datetime_end   DATE, --当前工作时间(精确到分钟)
    datetime_range_arr        datetime_range_list --当前时间间隔
    );
    
--全局包变量:生命周期与数据库连接一致
  v_g_datetime_range_list datetime_range_list;

v_g_datetime_range_list                := str_to_datetime_range_list(rec.date_attendance
                                                                          ,rec.time_range);

  /*====================================================================================================
  用途说明:将包变量v_g_datetime_range_list转换为可用于表函数“table()”进行查询的程序!
  备注:此乃管道函数!用于将集合类型的全局包变量转换为可用于表函数“table()”进行查询的程序!
  ====================================================================================================*/
  FUNCTION datetime_range_list_to_table RETURN datetime_range_list
    PIPELINED IS
  BEGIN
    FOR i IN 1 .. v_g_datetime_range_list.count
    LOOP
      PIPE ROW(v_g_datetime_range_list(i));
    END LOOP;
  END;
  
  v_g_datetime_range_list                := str_to_datetime_range_list(rec.date_attendance
                                                                          ,rec.time_range);
  
  --使用
  SELECT MIN(datetime_begin)
              ,MAX(datetime_end)
          INTO v_attendance_info.attendance_datetime_begin
              ,v_attendance_info.attendance_datetime_end
          FROM TABLE(datetime_range_list_to_table)
  
  
  
--  ==================================================================
create type obj_target as object(  
ptype varchar2(30),
   pvalue number
);  
/

create or replace type typ_array_target as table of obj_target;  
/

CREATE OR REPLACE
function pipe_target(p_source_data in sys_refcursor)  
   return typ_array_target  
   pipelined  
   parallel_enable(partition p_source_data by any) is  

   r_target_data obj_target := obj_target(null, null);  

-- type typ_source_data is table of %rowtype index by pls_integer;    
   aa_source_data typ_array_target;  

begin    
   loop  
     fetch p_source_data bulk collect ------- 这里必须用BULK COLLECT; 还要加上LIMIT,否则外循环无意义
       into aa_source_data;  
    exit when aa_source_data.count = 0;      
     for i in 1 .. aa_source_data.count loop        
       -- r_target_data.pvalue       := aa_source_data(i).pvalue;  
       -- r_target_data.ptype := aa_source_data(i).ptype; 
       pipe row(aa_source_data(i));    ------- 原来写的是错误的。要么改用r_target_data但是没有必要
     end loop;      
   end loop;    
   close p_source_data;  
   return;  

end;  
/

create table test_pipetest (ttype varchar2(30),value number);
INSERT INTO test_pipetest VALUES(‘A‘,1);
INSERT INTO test_pipetest VALUES(‘B‘,2);

select * from table(pipe_target(cursor (select
                                  obj_target(s.ttype,sum(s.value)) pvalue ----- 你的SQL必须保证每行数据都是obj_target类型
                                    from test_pipetest s
                                    group by ttype  --------- 汇总完全没有问题
                                    )))

PTYPE                              PVALUE
------------------------------ ----------
A                                       1
B                                       2
时间: 2024-10-13 17:14:49

管道函数的相关文章

oracle管道函数的用法

oracle管道函数是一类特殊的函数,oracle管道函数返回值类型必须为集合,下面将介绍oracle管道函数的语法. 在普通的函数中,使用dbms_output输出的信息,需要在服务器执行完整个函数后一次性的返回给客户端.如果需要在客户端实时的输出函数执行过程中的一些信息,在oracle9i以后可以使用管道函数(pipeline function). 关键字PIPELINED表明这是一个oracle管道函数,oracle管道函数的返回值类型必须为集合,在函数中,PIPE ROW语句被用来返回该

管道函数(%>%)很简单

%>%来自dplyr包的管道函数,其作用是将前一步的结果直接传参给下一步的函数,从而省略了中间的赋值步骤,可以大量减少内存中的对象,节省内存 %>%,该符号将左边的对象作为第一个参数传递到右边的函数中 直接上栗子??:library(data.table) library(tidyr) # 先虚构一数据框 set.seed(1) date <- as.Date('2016-11-01') + 0:14 hour <- sample(1:24, 15) min <- sampl

Oracle管道函数(Pipelined Table Function)介绍

一 概述: 1.管道函数即是能够返回行集合(能够使嵌套表nested table 或数组 varray)的函数,我们能够像查询物理表一样查询它或者将其 赋值给集合变量. 2.管道函数为并行运行,在普通的函数中使用dbms_output输出的信息,须要在server运行完整个函数后一次性的返回给client.假设须要在client 实时的输出函数运行过程中的一些信息,在oracle9i以后能够使用管道函数(pipeline function). 3.keywordPIPELINED表明这是一个or

Oracle管道函数(Pipelined Table Function)实现的实例

1. 简单的例子(返回单列的表) 1>创建一个表类型 create or replace type t_table is table of number; 2>创建函数返回上面定义的类型 create or replace function f_pipe(s number) return t_table pipelined as v_number number; begin for i in 1..s loop v_number := i; pipe row(v_number); end lo

Angular2 管道

1. 说明 管道用来转换模板显示的内容,应用程序中经常出现获取数据,转换数据,显示数据的逻辑.管道就是用来在转换数据阶段起作用的.主要存在两种类型的管道,pure pipe和impure pipe 2. Pure Pipe Pure Pipe,stateless,关注于纯粹对象的变更,检测到输入值发生了 纯变更 时才会执行 纯管道 . 纯变更 是指对原始类型值 (String .Number . Boolean . Symbol) 的更改, 或者对对象引用 (Date . Array . Fun

linux系统调用函数

Linux应用编程学习笔记                                 周学伟 一.系统调用文件编程   1.文件打开函数 /***************************************************************************** 函数名:open 函数原型:int open(const char * pathname, int flags) int open(const char * pathname,int  flags,

进程间的通信:管道

进程间的通信:管道 Linux中将命令联系到一起使用实际上就是把一个进程的输出通过管道传递给另一个进程的输入,这些都是shell封装好的,对标准输入和输出流进行了重新连接,使数据流从键盘输入经过两个程序最终输出到屏幕上.如下: cmd1|cmd2 进程管道 在两个程序之间传递数据最简单的方法就是使用popen()和pclose()了.原型如下: #include <stdio.h> FILE *popen(const char *command, const char *open_mode);

PB数据管道

数据管道提供了一种不同数据库之间传递数据和(或)表结构的方法. 数据管道对象 要完毕数据管道的功能须要提供例如以下内容: 须要数据源和目标数据库,并可以和这两个数据库正常联接 须要源数据库中的哪些表: 须要拷贝到目标数据库中的什么位置: 要完毕哪些管道操作: 错误发生的频率: 同意错误发生的最大数: 须要包含的扩充特性. 数据管道画板 New -> DataBase -> Data Pipeline 数据管道选项: Table:目标表名 Key:目标表的主键名(非主键字段名) Options:

总结文件操作函数(二)-C语言

格式化读写: #include <stdio.h> int printf(const char *format, ...);                   //相当于fprintf(stdout,format,-); int scanf(const char *format, -); int fprintf(FILE *stream, const char *format, ...);      //中间的参数为写入文件的格式 int fscanf(FILE *stream, const