#sql #postgresql #common-table-expression
Вопрос:
Пожалуйста, дайте мне знать, где я совершаю ошибку, так как я не могу создать процедуру:
CREATE OR REPLACE PROCEDURE dpk_mc_tr.dpr_mc_tr_cmo_med_form_arc_inf ( in_usercode text, in_usersess text, in_compcode text, in_stardate text, in_stopdate text, in_sericate text, in_matccate text, in_seritycd text, in_matycode text, in_venucode text, in_teamcode text, in_drsmflag text, in_daynight text, in_telecast text, in_progname text, out_code INOUT numeric ) AS $body$
WITH RECURSIVE cte AS (
DECLARE
c01 CURSOR FOR
SELECT DISTINCT REPLACE(SUBSTR((SELECT array_to_string(a, '') FROM regexp_matches(in_sericate, '[^,] ', 'g') AS foo(a) LIMIT 1 OFFSET (LEVEL
- 1)),
2,
6
),
']',
''
) sericate
(SELECT array_to_string(a, '') FROM regexp_matches(in_sericate, '[^,] ', 'g') AS foo(a) LIMIT 1 OFFSET (LEVEL - 1)) IS NOT NULL UNION ALL
DECLARE
c01 CURSOR FOR
SELECT DISTINCT REPLACE(SUBSTR((SELECT array_to_string(a, '') FROM regexp_matches(in_sericate, '[^,] ', 'g') AS foo(a) LIMIT 1 OFFSET (LEVEL
- 1)),
2,
6
),
']',
''
) sericate
(SELECT array_to_string(a, '') FROM regexp_matches(in_sericate, '[^,] ', 'g') AS foo(a) LIMIT 1 OFFSET (LEVEL - 1)) IS NOT NULL JOIN cte c ON ()
) SELECT * FROM cte;
;
m01 CURSOR FOR
SELECT sysofcde sericate
FROM sycodmas
WHERE compcode = '001' AND modlcode = 'MM' AND syhrdcde = 'SRC'
UNION ALL
SELECT 'X' sericate
;WITH RECURSIVE cte AS (
c02 CURSOR FOR
SELECT DISTINCT REPLACE(SUBSTR((SELECT array_to_string(a, '') FROM regexp_matches(in_matccate, '[^,] ', 'g') AS foo(a) LIMIT 1 OFFSET (LEVEL
- 1)),
2,
6
),
']',
''
) matccate
(SELECT array_to_string(a, '') FROM regexp_matches(in_matccate, '[^,] ', 'g') AS foo(a) LIMIT 1 OFFSET (LEVEL - 1)) IS NOT NULL UNION ALL
c02 CURSOR FOR
SELECT DISTINCT REPLACE(SUBSTR((SELECT array_to_string(a, '') FROM regexp_matches(in_matccate, '[^,] ', 'g') AS foo(a) LIMIT 1 OFFSET (LEVEL
- 1)),
2,
6
),
']',
''
) matccate
(SELECT array_to_string(a, '') FROM regexp_matches(in_matccate, '[^,] ', 'g') AS foo(a) LIMIT 1 OFFSET (LEVEL - 1)) IS NOT NULL JOIN cte c ON ()
) SELECT * FROM cte;
;
m02 CURSOR FOR
SELECT sysofcde matccate
FROM sycodmas
WHERE compcode = '001' AND modlcode = 'MM' AND syhrdcde = 'MAC'
UNION ALL
SELECT 'X' matccate
;WITH RECURSIVE cte AS (
c03 CURSOR FOR
SELECT DISTINCT REPLACE(SUBSTR((SELECT array_to_string(a, '') FROM regexp_matches(in_seritycd, '[^,] ', 'g') AS foo(a) LIMIT 1 OFFSET (LEVEL
- 1)),
2,
6
),
']',
''
) seritycd
(SELECT array_to_string(a, '') FROM regexp_matches(in_seritycd, '[^,] ', 'g') AS foo(a) LIMIT 1 OFFSET (LEVEL - 1)) IS NOT NULL UNION ALL
c03 CURSOR FOR
SELECT DISTINCT REPLACE(SUBSTR((SELECT array_to_string(a, '') FROM regexp_matches(in_seritycd, '[^,] ', 'g') AS foo(a) LIMIT 1 OFFSET (LEVEL
- 1)),
2,
6
),
']',
''
) seritycd
(SELECT array_to_string(a, '') FROM regexp_matches(in_seritycd, '[^,] ', 'g') AS foo(a) LIMIT 1 OFFSET (LEVEL - 1)) IS NOT NULL JOIN cte c ON ()
) SELECT * FROM cte;
;
ОШИБКА: синтаксическая ошибка в или рядом с «С»
СТРОКА 2: С РЕКУРСИВНЫМ cte КАК (**
Спасибо
Ответ №1:
На самом деле в вашем запросе есть несколько ошибок.
- точка с запятой в: ВЫБЕРИТЕ сериат «X»; С …
- Вы не можете использовать курсоры внутри рекурсивного CTE Рекурсивные CTE на самом деле довольно ограничены. Вы не можете выполнить внешнее соединение с cte внутри рекурсивной части, вы не можете использовать предложение группировки, не можете использовать имя cte внутри подзапроса…
Я не уверен, чего вы пытаетесь достичь, но использование рекурсивного метода здесь не подходит… Кроме того, помните, что сопоставление регулярных выражений происходит очень медленно…