Временная таблица DB2 в функции - PullRequest
1 голос
/ 25 июня 2019

У меня есть простые функции для работы в DB2, но я не могу заставить работать какие-либо функции, которые объявляют глобальную временную таблицу. Я знаю, что версия и платформа DB2 сильно отличаются, но я подумал, что это возможно, так как это работает для этого автора .

CREATE FUNCTION FuncTest1 ()
    RETURNS TABLE
    (
        USE_NAME VARCHAR(48),
        USE_PARTNER_LINK FLOAT
    )
        LANGUAGE SQL
        MODIFIES SQL DATA
        DETERMINISTIC
        BEGIN
        DECLARE GLOBAL TEMPORARY TABLE USE_TRUNC
        (
           USE_NAME VARCHAR(48) NULL,
           USE_PARTNER_LINK FLOAT NULL
        );
        INSERT INTO SESSION.USE_TRUNC
            (USE_NAME,USE_PARTNER_LINK)
        SELECT USE_NAME,USE_PARTNER_LINK FROM F_USERS;
        RETURN
        SELECT USE_NAME,USE_PARTNER_LINK FROM F_USERS;
        END

Ошибки сильно различаются, так как я пробую разные вещи, но это текущий вывод:

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

Добавлено скрипка

Ответы [ 2 ]

0 голосов
/ 26 июня 2019

Это был бы более простой способ написать эту функцию

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;
0 голосов
/ 25 июня 2019

оператор CREATE FUNCTION (скаляр SQL, таблица или строка), v9.7 :

-| (3)| '-MODIFIES SQL DATA-----' ... |--+-RETURN----------------------+------------------------------| | (5) | +-Compound SQL (compiled)-----+ '-Compound SQL (inlined)------'
...
3. Действительно, если RETURNS указывает таблицу (то есть TABLE column-list). Также верно, если RETURNS указывает скалярный результат и SQL-function-body является составным оператором SQL (скомпилированным).
...
5. Составной оператор SQL (скомпилированный) поддерживается только для тела функции SQL в определении скалярной функции SQL. Это не поддерживается для определений табличных функций SQL .

оператор CREATE FUNCTION (скаляр SQL, таблица или строка), v11.1 :

-| (4) | '-MODIFIES SQL DATA-----'
...
4. Действительно только для определения скомпилированной скалярной функции и определения встроенной табличной функции .

Вы не можете использовать MODIFIED SQL DATA с Compound SQL (compiled) (BEGIN ... END) для табличной функции. И оператор DECLARE GTT не поддерживается Compound SQL (inlined) (BEGIN ATOMIC ... END).
Итак, переписайте вашу табличную функцию, не используя объявленные GTT и INSERT. Или попробуйте Created GTT , но создайте их заранее (не в теле функции).

Что касается вашего случая

Вы можете использовать один оператор SELECT с Common Table Expression:

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
;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...