Sql 函数中的DB2临时表

Sql 函数中的DB2临时表,sql,db2,db2-9.7,Sql,Db2,Db2 9.7,我有一些简单的函数可以在DB2中使用,但我无法使用任何声明全局临时表的函数。我知道DB2版本和平台有很大的不同,但我认为这应该是可能的,因为它适用于 当我尝试不同的方法时,误差变化很大,但这是当前输出: An unexpected token "USE_NAME" was found following " RETURN SELECT". Expected tokens may include: "(".. SQLCODE=-104, SQLSTATE=42601, DRIVER

我有一些简单的函数可以在DB2中使用,但我无法使用任何声明全局临时表的函数。我知道DB2版本和平台有很大的不同,但我认为这应该是可能的,因为它适用于

当我尝试不同的方法时,误差变化很大,但这是当前输出:

An unexpected token "USE_NAME" was found following " 
  RETURN 
  SELECT".  Expected tokens may include:  "(".. SQLCODE=-104, SQLSTATE=42601, DRIVER=4.9.78
新增

-|(3)|
“-修改SQL数据------”
...
|--+-返回----------------------+------------------------------|
|                         (5) |
+-复合SQL(已编译)-----+
'-复合SQL(内联)--'


3.如果返回指定一个表(即表列列表),则有效。如果返回指定标量结果和 SQL函数体是一个复合SQL(已编译)语句。

5.只有SQL标量函数定义中的SQL函数体才支持复合SQL(编译)语句<不是 支持SQL表函数定义

:

-|(4)|
'-修改SQL数据---'


4.仅对编译的标量函数定义和内联表函数定义有效

不能将
修改的SQL数据
复合SQL(已编译)
开始…结束
)一起用于表函数。
复合SQL(内联)
开始原子…结束
)不支持声明GTT语句。
因此,不使用声明的GTT和INSERT重写表函数。或者尝试,但要事先创建它们(不在函数体中)

至于你的情况 您可以将单个
SELECT
语句与
通用表表达式一起使用

CREATE FUNCTION ...
...
RETURN
WITH 
SESSION_ALLREFERRALS AS 
(
SELECT
    REF.AL_NO AS AL_NO,        
    ENQ.E_KEY AS R_KEY,
    APP.A_2ND_NAME AS R_TRADING_NAME,
    CASE WHEN DOC1.DT_NAME is null THEN 'NONE' ELSE DOC1.DT_NAME END AS R_DROP1,
    REF.AL_DATE AS R_DATE,
    CASE WHEN DOC2.DT_NAME is null THEN 'Incomplete' ELSE DOC2.DT_NAME END AS R_DROP2,
    CAST(ENQ2.E_TOOLCOMM1 AS VARCHAR(48)) AS R_COMM1
FROM
    F_ENQUIRY ENQ INNER JOIN 
        F_APPLICANT_LINK REF ON REF.AL_KEY1 = ENQ.E_KEY INNER JOIN 
        F_APPLICANT APP ON APP.A_KEY = REF.AL_KEY2 AND REF.AL_TYPE1 = 2 AND REF.AL_TYPE2 = 1 LEFT JOIN 
        F_DOC_TYPES DOC1 ON DOC1.DT_NO = REF.AL_DROP1 LEFT JOIN 
        F_DOC_TYPES DOC2 ON DOC2.DT_NO = REF.AL_DROP2 INNER JOIN 
        F_ENQUIRY ENQ2 ON ENQ2.E_KEY = REF.AL_ENQ_LINK
WHERE
    ENQ.E_PRIORITY_LINK = 204 AND   
    ENQ.E_JOB_TYPE_LINK = 0
)
, 
SESSION_REFERRAL1 AS 
(
SELECT 
    MIN(AL_NO) AL_NO, 
    R_KEY
    FROM 
    SESSION_ALLREFERRALS 
    GROUP BY R_KEY
)
,
SESSION_REFERRAL2 AS 
(
SELECT 
    MIN(AL_NO) AL_NO, 
    R_KEY 
FROM 
    SESSION_ALLREFERRALS a2
WHERE
    NOT EXISTS (SELECT 1 FROM SESSION_REFERRAL1 R1 WHERE r1.AL_NO = a2.AL_NO fetch first 1 rows only)
GROUP BY 
    R_KEY
)
,
SESSION_REFERRAL3 AS 
(
SELECT 
    MIN(AL_NO) AL_NO, 
    R_KEY 
FROM 
    SESSION_ALLREFERRALS A3
WHERE
    NOT EXISTS (SELECT 1 FROM SESSION_REFERRAL1 R1 WHERE R1.AL_NO = A3.AL_NO fetch first 1 rows only) AND 
    NOT EXISTS (SELECT 1 FROM SESSION_REFERRAL2 R2 WHERE R2.AL_NO = A3.AL_NO fetch first 1 rows only)
GROUP BY 
    R_KEY
)
SELECT 
    *
FROM
    SESSION_REFERRAL1 R1 INNER JOIN
    SESSION_ALLREFERRALS A ON A.R_KEY = R1.R_KEY AND R1.AL_NO = A.AL_NO LEFT JOIN
    SESSION_REFERRAL2 R2 ON R2.R_KEY = R1.R_KEY LEFT JOIN
    SESSION_ALLREFERRALS A2 ON A2.R_KEY = R2.R_KEY AND R2.AL_NO = A2.AL_NO LEFT JOIN 
    SESSION_REFERRAL3 R3 ON R3.R_KEY = R1.R_KEY LEFT JOIN
    SESSION_ALLREFERRALS A3 ON A3.R_KEY = R3.R_KEY AND R3.AL_NO = A3.AL_NO
;
:

-|(3)|
“-修改SQL数据------”
...
|--+-返回----------------------+------------------------------|
|                         (5) |
+-复合SQL(已编译)-----+
'-复合SQL(内联)--'


3.如果返回指定一个表(即表列列表),则有效。如果返回指定标量结果和 SQL函数体是一个复合SQL(已编译)语句。

5.只有SQL标量函数定义中的SQL函数体才支持复合SQL(编译)语句<不是 支持SQL表函数定义

:

-|(4)|
'-修改SQL数据---'


4.仅对编译的标量函数定义和内联表函数定义有效

不能将
修改的SQL数据
复合SQL(已编译)
开始…结束
)一起用于表函数。
复合SQL(内联)
开始原子…结束
)不支持声明GTT语句。
因此,不使用声明的GTT和INSERT重写表函数。或者尝试,但要事先创建它们(不在函数体中)

至于你的情况 您可以将单个
SELECT
语句与
通用表表达式一起使用

CREATE FUNCTION ...
...
RETURN
WITH 
SESSION_ALLREFERRALS AS 
(
SELECT
    REF.AL_NO AS AL_NO,        
    ENQ.E_KEY AS R_KEY,
    APP.A_2ND_NAME AS R_TRADING_NAME,
    CASE WHEN DOC1.DT_NAME is null THEN 'NONE' ELSE DOC1.DT_NAME END AS R_DROP1,
    REF.AL_DATE AS R_DATE,
    CASE WHEN DOC2.DT_NAME is null THEN 'Incomplete' ELSE DOC2.DT_NAME END AS R_DROP2,
    CAST(ENQ2.E_TOOLCOMM1 AS VARCHAR(48)) AS R_COMM1
FROM
    F_ENQUIRY ENQ INNER JOIN 
        F_APPLICANT_LINK REF ON REF.AL_KEY1 = ENQ.E_KEY INNER JOIN 
        F_APPLICANT APP ON APP.A_KEY = REF.AL_KEY2 AND REF.AL_TYPE1 = 2 AND REF.AL_TYPE2 = 1 LEFT JOIN 
        F_DOC_TYPES DOC1 ON DOC1.DT_NO = REF.AL_DROP1 LEFT JOIN 
        F_DOC_TYPES DOC2 ON DOC2.DT_NO = REF.AL_DROP2 INNER JOIN 
        F_ENQUIRY ENQ2 ON ENQ2.E_KEY = REF.AL_ENQ_LINK
WHERE
    ENQ.E_PRIORITY_LINK = 204 AND   
    ENQ.E_JOB_TYPE_LINK = 0
)
, 
SESSION_REFERRAL1 AS 
(
SELECT 
    MIN(AL_NO) AL_NO, 
    R_KEY
    FROM 
    SESSION_ALLREFERRALS 
    GROUP BY R_KEY
)
,
SESSION_REFERRAL2 AS 
(
SELECT 
    MIN(AL_NO) AL_NO, 
    R_KEY 
FROM 
    SESSION_ALLREFERRALS a2
WHERE
    NOT EXISTS (SELECT 1 FROM SESSION_REFERRAL1 R1 WHERE r1.AL_NO = a2.AL_NO fetch first 1 rows only)
GROUP BY 
    R_KEY
)
,
SESSION_REFERRAL3 AS 
(
SELECT 
    MIN(AL_NO) AL_NO, 
    R_KEY 
FROM 
    SESSION_ALLREFERRALS A3
WHERE
    NOT EXISTS (SELECT 1 FROM SESSION_REFERRAL1 R1 WHERE R1.AL_NO = A3.AL_NO fetch first 1 rows only) AND 
    NOT EXISTS (SELECT 1 FROM SESSION_REFERRAL2 R2 WHERE R2.AL_NO = A3.AL_NO fetch first 1 rows only)
GROUP BY 
    R_KEY
)
SELECT 
    *
FROM
    SESSION_REFERRAL1 R1 INNER JOIN
    SESSION_ALLREFERRALS A ON A.R_KEY = R1.R_KEY AND R1.AL_NO = A.AL_NO LEFT JOIN
    SESSION_REFERRAL2 R2 ON R2.R_KEY = R1.R_KEY LEFT JOIN
    SESSION_ALLREFERRALS A2 ON A2.R_KEY = R2.R_KEY AND R2.AL_NO = A2.AL_NO LEFT JOIN 
    SESSION_REFERRAL3 R3 ON R3.R_KEY = R1.R_KEY LEFT JOIN
    SESSION_ALLREFERRALS A3 ON A3.R_KEY = R3.R_KEY AND R3.AL_NO = A3.AL_NO
;

这将是编写该函数的一种更简单的方法

CREATE FUNCTION FuncTest1 ()
RETURNS TABLE
(
    USE_NAME VARCHAR(48),
    USE_PARTNER_LINK FLOAT
)
    LANGUAGE SQL
    RETURN  SELECT USE_NAME,USE_PARTNER_LINK FROM F_USERS;

这将是编写该函数的一种更简单的方法

CREATE FUNCTION FuncTest1 ()
RETURNS TABLE
(
    USE_NAME VARCHAR(48),
    USE_PARTNER_LINK FLOAT
)
    LANGUAGE SQL
    RETURN  SELECT USE_NAME,USE_PARTNER_LINK FROM F_USERS;

我得到了工作,但我需要临时表,最终我希望从中选择。我得到了工作,但我需要临时表,最终我希望从中选择。谢谢你的解释。这是我试图创建()的简化形式,因此我不知道如何在没有声明或插入的情况下重写。我目前的解决方案是将其创建为一个过程,以生成临时表并插入数据,然后在函数中调用它,然后返回select语句。有没有更合理的方法呢?请在上面的链接中查看您提到的案例的函数示例。这太棒了,非常感谢。我已经在小提琴中重新创建了它,它可以工作,但我得到了另一个无用的“意外标记”,它位于“”之后。预期的令牌可能包括:我的测试服务器上的“.E_JOB_TYPE_LINK=0”错误。您能想到9.7版的具体问题吗?@MarkBarinstein v10.1及更高版本的Db2 LUW文档更改了关于复合SQL(编译)语句用法的注释(5),现在包括文本“在分区数据库环境中定义表函数时不支持”。虽然非分区数据库似乎支持将复合SQL(已编译)作为表函数的主体,但如果SQL表函数尝试
返回select。。。从dgtt中我找到了它,9.7只是不喜欢几个分号。创建为一个完美的视图。感谢您的解释。这是我试图创建()的简化形式,因此我不知道如何在没有声明或插入的情况下重写。我目前的解决方案是将其创建为一个过程,以生成临时表并插入数据,然后在函数中调用它,然后返回select语句。有没有更合理的方法呢?请在上面的链接中查看您提到的案例的函数示例。这太棒了,非常感谢。我已经在小提琴中重新创建了它,它可以工作,但我得到了另一个无用的“意外标记”,它位于“”之后。预期的令牌可能包括:我的测试服务器上的“.E_JOB_TYPE_LINK=0”错误。您能想到9.7版的具体问题吗?@MarkBarinstein v10.1及更高版本的Db2 LUW文档更改了关于复合SQL(编译)语句用法的注释(5),现在包括文本“在分区数据库环境中定义表函数时不支持”。虽然非分区数据库似乎支持将复合SQL(已编译)作为表函数的主体,但如果SQL表函数尝试
返回select。。。从dgtt中我找到了它,9.7只是不喜欢几个分号。