ОШИБКА: синтаксическая ошибка в СТРОКЕ «С» или рядом С ней 2: С РЕКУРСИВНЫМ cte КАК

#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:

На самом деле в вашем запросе есть несколько ошибок.

  1. точка с запятой в: ВЫБЕРИТЕ сериат «X»; С …
  2. Вы не можете использовать курсоры внутри рекурсивного CTE Рекурсивные CTE на самом деле довольно ограничены. Вы не можете выполнить внешнее соединение с cte внутри рекурсивной части, вы не можете использовать предложение группировки, не можете использовать имя cte внутри подзапроса…

Я не уверен, чего вы пытаетесь достичь, но использование рекурсивного метода здесь не подходит… Кроме того, помните, что сопоставление регулярных выражений происходит очень медленно…