示例: SQL 表 UDF
这些示例显示了使用同一底层查询返回数据的非管道表函数和管道表函数。
此非管道表函数根据日期返回数据。 RETURN 语句必须包含查询。
CREATE FUNCTION PROJFUNC(indate DATE)
RETURNS TABLE (PROJNO CHAR(6), ACTNO SMALLINT, ACSTAFF DECIMAL(5,2),
ACSTDATE DATE, ACENDATE DATE)
BEGIN
RETURN SELECT * FROM PROJACT
WHERE ACSTDATE<=indate;
END;
该函数可作为以下内容调用:
SELECT * FROM TABLE(PROJFUNC(:datehv));
需要非管道 SQL 表函数具有一个且仅具有一个 RETURN 语句。
此管道表函数根据日期返回数据。 除了查询返回的列值外,它还会返回项目是否已从上一年结转的指示。
CREATE FUNCTION PROJFUNC(indate DATE)
RETURNS TABLE (PROJNO CHAR(6), ACTNO SMALLINT, ACSTAFF DECIMAL(5,2),
ACSTDATE DATE, ACENDATE DATE, CARRYOVER CHAR(1))
BEGIN
FOR C1 CURSOR FOR SELECT * FROM PROJACT
WHERE ACSTDATE<=indate DO
IF YEAR(ACSTDATE) < YEAR(indate) THEN
PIPE (PROJNO, ACTNO, ACSTAFF, ACSTDATE, ACENDATE, 'Y');
ELSE
PIPE (PROJNO, ACTNO, ACSTAFF, ACSTDATE, ACENDATE, 'N');
END IF;
END FOR;
RETURN;
END;
可以采用与非管道函数相同的方式调用该函数:
SELECT * FROM TABLE(PROJFUNC(:datehv));
Pipelined SQL 表函数可以包含任意数目的 PIPE 语句。 每个 PIPE 语句都必须返回每个结果列的值。 必须在处理结束时执行 RETURN 语句。 管道函数的主体不限于查询表。 它可以调用另一个程序,从 API 获取信息,从其他某个系统查询数据,然后组合结果并使用一个或多个 PIPE 语句来确定要作为结果表返回的行值。