оператор 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
;