Oracle ~ Create Function(传入多个参数,处理后返回表Table类型)


参考源1:

参考源2:(2条消息) Oracle函数返回Table集合_Alex许恒的博客-CSDN博客_oracle函数返回结果集

在Oracle中想要返回表对象,必须自定义一个表类型

1、创建一个object类型的数据库类型对象,表示返回的实体类型 (多列)

-- 1、创建object类型的数据库对象
CREATE OR REPLACE TYPE line_stop_obj_type AS OBJECT 
(
    tech_id VARCHAR2(64),
    prod_id VARCHAR2(64),
    mainpd_id VARCHAR2(64),
    ope_no VARCHAR2(64),
    eqp_no VARCHAR2(64),
    ch_id VARCHAR2(64),
    islinestopflag VARCHAR2(64)
);

2、创建一个嵌套表类型的数据库类型对象,表示返回实体集合类型,该类型也将用作函数中定义的返回类型

--2、创建一个嵌套表类型的数据库类型对象
CREATE OR REPLACE TYPE linestop_tab_type IS TABLE OF line_stop_obj_type;

3、定义一个Oracle函数,根据参数返回处理后Table结果

--3、创建一个Oracle Function, 根据传入参数处理后返回处理后Table结果
CREATE OR REPLACE FUNCTION check_linestop_info_bypar(
    pop_date IN DATE,
    tech_id IN VARCHAR2,
    prod_id IN VARCHAR2,
    mainpd_id IN VARCHAR2,
    ope_no IN VARCHAR2
)
RETURN linestop_tab_type IS
    -- 先定义一个游标变量类型
    TYPE linestop_cursor IS REF CURSOR;
    -- 定义一个游标变量
    v_linestop_cursor linestop_cursor;
    get_pop_date DATE;
    get_tech_id VARCHAR2(64);
    get_prod_id VARCHAR2(64);
    gep_mainpd_id VARCHAR2(64);
    get_ope_no VARCHAR2(64);
    line_stop_obj  line_stop_obj_type;
    ck_islinestop_res linestop_tab_type := linestop_tab_type();

    -- RESULT
    res_tech_id VARCHAR2(64);
    res_prod_id VARCHAR2(64);
    res_mainpd_id VARCHAR2(64);
    res_ope_no VARCHAR2(64);
    res_eqp_no VARCHAR2(64);
    res_ch_id VARCHAR2(64);
    res_islinestopflag VARCHAR2(64);
BEGIN
    res_tech_id := NULL;
    res_prod_id := NULL;
    res_mainpd_id := NULL;
    res_ope_no := NULL;
    res_eqp_no := NULL;
    res_ch_id := NULL;
    res_islinestopflag := NULL;
    
    get_pop_date := pop_date;
    get_tech_id := tech_id;
    get_prod_id := prod_id;
    gep_mainpd_id := mainpd_id;
    get_ope_no := ope_no;
    
    OPEN v_linestop_cursor FOR
    SELECT tech_id, prod_id, mainpd_id, ope_no, eqp_no, ch_id, islinestopflag
    FROM (
        (SELECT get_tech_id AS tech_id,get_prod_id AS prod_id,mainpd_id AS mainpd_id,
                ope_no AS ope_no,'001' AS eqp_no,'CHA' AS ch_id,'Y' AS islinestopflag FROM DUAL
                UNION ALL
         SELECT CONCAT(get_tech_id,2) AS tech_id,CONCAT(get_prod_id,2) AS prod_id,CONCAT(mainpd_id,2) AS mainpd_id,
                CONCAT(ope_no,2) AS ope_no,'002' AS eqp_no,'CHB' AS ch_id,'Y' AS islinestopflag FROM DUAL
        )
    );
    LOOP     
    FETCH v_linestop_cursor INTO res_tech_id, res_prod_id, res_mainpd_id, res_ope_no, res_eqp_no, res_ch_id, res_islinestopflag;
    EXIT WHEN v_linestop_cursor%NOTFOUND;
    ck_islinestop_res.EXTEND;
    ck_islinestop_res(ck_islinestop_res.COUNT) := line_stop_obj_type(
        res_tech_id,
        res_prod_id,
        res_mainpd_id,
        res_ope_no,
        res_eqp_no,
        res_ch_id,
        res_islinestopflag
    );
    END LOOP;
    CLOSE v_linestop_cursor;
    RETURN ck_islinestop_res;
END check_linestop_info_bypar;

4、结果校验

--4、演示结果
SELECT * FROM TABLE(CHECK_LINESTOP_INFO_BYPAR(SYSDATE, 'BigDog', 'GY2022', 'F0331', 'OP0016'));

至此完,新手向前辈们敬礼!