工作中常需要经过一段复杂逻辑处理后,得出的一个结果集。并能够将这个结果集作为一个表看待,去进行关联查询
我一般采用建立函数function的方式来处理。
--创建包,声明function和type
CREATE OR REPLACE PACKAGE PAK_TEM
AS
TYPE DATE_RECORD IS RECORD --自定义类型-行(含字段及类型)
(
NAME VARCHAR2 (20),
VALUE VARCHAR2 (20)
); TYPE DATE_TABLE IS TABLE OF DATE_RECORD; --自定义table类 FUNCTION GET_TERM_YEARS
RETURN DATE_TABLE --返回table类型
PIPELINED; --流水式
END PAK_TEM;
/ --实现包体中的function
CREATE OR REPLACE PACKAGE BODY PAK_TEM
AS
FUNCTION GET_TERM_YEARS
RETURN DATE_TABLE
PIPELINED
IS
L_RESULT DATE_RECORD;
BEGIN
FOR REC IN (SELECT DISTINCT TO_CHAR (STATUS_TIME, 'YYYY')
FROM TEM_TB
WHERE TO_CHAR (STATUS_TIME, 'YYYY') != '')
LOOP
L_RESULT.NAME := REC.YEAR || '年';
L_RESULT.VALUE := REC.YEAR;
PIPE ROW (L_RESULT); --依次返回行
END LOOP;
END;
END PAK_TEM;
/
像查询一个表一样来操作function,使用 TABLE(自定义函数)
SELECT * FROM TABLE(PAK_TEM.get_term_years());
PS:以下是定义oracle的table类型示例:
--oracle内置类型
TYPE STRING_TABLE IS TABLE OF VARCHAR(2000); --自定义类型(DATE_RECORD)
TYPE DATE_RECORD IS RECORD --自定义类型-行(含字段及类型)
(
NAME VARCHAR2 (20),
VALUE VARCHAR2 (20)
);
TYPE DATE_TABLE IS TABLE OF DATE_RECORD; --自定义table类(DATE_TABLE)