创建返回带有两个参数的多条记录的Oracle过程

时间:2019-02-24 15:36:36

标签: sql oracle

下面的代码1创建三个表,代码2显示2行。 通常,如何使code2成为输入两个varchar(即code2的最后一行的'20180101',20180106')并输出多个记录的过程?

code1

CREATE TABLE equip_type  (  
  EQUIP_TYPE VARCHAR(15),    
  EQUIP VARCHAR(15)
  );
INSERT INTO equip_type  VALUES ('A','e1');
CREATE TABLE output_history (  
  EQUIP VARCHAR(15),     
  MODEL VARCHAR(15),     
  Data1 VARCHAR(15),        
  QUANTITY  NUMBER(10) 
  );
INSERT INTO output_history VALUES ('e1','m1','20180103',10);
INSERT INTO output_history VALUES ('e1','m1','20180106',20);
INSERT INTO output_history VALUES ('e1','m1','20180107',20);
CREATE TABLE time_history (  
  EQUIP VARCHAR(15),     
  MODEL VARCHAR(15),       
  Data2 VARCHAR(15),    
  time NUMBER(10)
  );
INSERT INTO time_history VALUES ('e1','m1','20180101',6);
INSERT INTO time_history VALUES ('e1','m1','20180105',5);
INSERT INTO time_history VALUES ('e1','m1','20180107',5);

code2

    SELECT
    o.equip,
    o.model,
    o.data1,
    o.quantity,
    t.data2,
    t.time,
    e.equip_type
FROM 
    output_history o
    INNER JOIN equip_type e ON e.equip = o.equip
    INNER JOIN time_history t ON t.equip = o.equip AND t.data2 <= o.data1
WHERE NOT EXISTS (
    SELECT 1 
    FROM time_history
    WHERE 
        equip = o.equip
        AND data2 <= o.data1
        AND data2 > t.data2
) AND o.data1 >= '20180101' AND o.data1 <= '20180106';

1 个答案:

答案 0 :(得分:1)

为此,您可以为所需的行类型创建一个类型,为第一个类型的嵌套表创建另一种类型,并返回该表类型的函数。

但是请在执行此操作之前,请先对表格进行重新整理,以免将DATEs作为VARCHAR2s存储。

create type mytype as object (
    equip       VARCHAR(15),
    model       VARCHAR(15),
    data1       VARCHAR(15),
    quantity    NUMBER(10),
    data2       VARCHAR(15),    
    time        NUMBER(10),
    equip_type  VARCHAR(15)
);
/

create type mytype_tt as table of mytype;
/

create or replace function myfun( p1 varchar2, p2 varchar2 ) return mytype_tt
as
    l_returnval     mytype_tt;
begin

    SELECT mytype(
        o.equip,
        o.model,
        o.data1,
        o.quantity,
        t.data2,
        t.time,
        e.equip_type )
    BULK COLLECT INTO l_returnval
    FROM 
        output_history o
        INNER JOIN equip_type e ON e.equip = o.equip
        INNER JOIN time_history t ON t.equip = o.equip AND t.data2 <= o.data1
    WHERE NOT EXISTS (
        SELECT 1 
        FROM time_history
        WHERE 
            equip = o.equip
            AND data2 <= o.data1
            AND data2 > t.data2
    ) AND o.data1 >= p1 AND o.data1 <= p2; 

    return l_returnval;

end;
/