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'));
至此完,新手向前辈们敬礼!