Prozedur steckt im Merge-Code fest

Im Zusammenführungscode stecken geblieben. Ab sofort kann die Postgresql-Version nicht aktualisiert werden.

FEHLER: Syntaxfehler bei oder in der Nähe von "FROM"
ZEILE 3: VON

CREATE OR REPLACE PROCEDURE abc.spr_customer_upd_updation(
  cust_no text,
  bill_comp text,
  v_clone_grp text)
LANGUAGE 'plpgsql'
AS $BODY$
DECLARE
    strsql TEXT;strsql_main CHARACTER VARYING(1000);
strsql_main_Clone CHARACTER VARYING(1000);
strsql_sel CHARACTER VARYING(3000);
strsql_select CHARACTER VARYING(20);
strsql_select2 CHARACTER VARYING(80);
strsql_set TEXT;

cust_ff_update_cur CURSOR FOR

SELECT
        iuc_webm_inv_cols, iuc_table_name, iuc_query, iuc_inv_col_desc
        FROM abb.invoice_upd_bco_col_mapping AS mc, abb.invoice_upd_column_master AS clm
        WHERE mc.ium_upd_cols = clm.iuc_id AND ium_bco_no = bill_comp AND clm.iuc_table_name = 'CUSTOMER';CUST_FF_UPD_CUR_RECORD RECORD;BEGIN
     
 /*  strsql_main := CONCAT_WS('', 'MERGE INTO CUSTOMER C
               USING
               (
               SELECT  <>
               FROM CUSTOMER_UPD_WORKING cuw
               WHERE cuw.CUW_BILLING_COMP = ''', bill_comp, ''' and
               cuw.CUW_CUST_NO = ''', cust_no, '''
               ) CUST_DATA
               ON (C.CUST_NO_717 = CUST_DATA.CUW_CUST_NO)
               WHEN MATCHED THEN
               UPDATE SET '); */
    
  
  strsql_main := CONCAT_WS('','
UPDATE abb.CUSTOMER C SET  FROM 
(SELECT  <<SELECTCOL>>     
            FROM abb.CUSTOMER_UPD_WORKING cuw                 WHERE cuw.CUW_BILLING_COMP = ''', bill_comp, ''' and  
               cuw.CUW_CUST_NO = ''', cust_no, '''   
              ) AS CUST_DATA                 WHERE C.CUST_NO_717 = CUST_DATA.CUW_CUST_NO');
 
 /*  strsql_main_Clone := CONCAT_WS('', 'MERGE INTO CUSTOMER C
                     USING
                     (
                     SELECT  <>
                     FROM CUSTOMER_UPD_WORKING cuw
                     INNER JOIN CUSTOMER cust
                     ON cust.Cust_Clone_Group_717 = ''', v_clone_grp, '''
                     WHERE cuw.CUW_BILLING_COMP = ''', bill_comp, ''' and
                     cuw.CUW_CUST_NO = ''', cust_no, '''
                     ) CUST_DATA
                     ON (C.CUST_NO_717 = CUST_DATA.CUST_NO_717)
                     WHEN MATCHED THEN
                     UPDATE SET '); */
          
  strsql_main_Clone :=  CONCAT_WS('', '
UPDATE abb.CUSTOMER C    SET   FROM    (   
                    SELECT  <<SELECTCOL>>                       FROM abb.CUSTOMER_UPD_WORKING cuw   
                    INNER JOIN abb.CUSTOMER cust                       ON cust.Cust_Clone_Group_717 = ''', v_clone_grp, '''   
                    WHERE cuw.CUW_BILLING_COMP = ''', bill_comp, ''' and                       cuw.CUW_CUST_NO = ''', cust_no, '''                       ) CUST_DATA  
 WHERE C.CUST_NO_717 = CUST_DATA.CUST_NO_717');
                      
                      RAISE NOTICE 'strsql_main_Clone%',strsql_main_Clone;
            
  strsql_select := 'CUW_CUST_NO,';
    strsql_select2 := 'CUW_CUST_NO, cust.CUST_NO_717, cust.Cust_Clone_Group_717,';
    strsql_sel := '';
    strsql_set := '';

   OPEN cust_ff_update_cur;

    LOOP
        
    FETCH cust_ff_update_cur INTO CUST_FF_UPD_CUR_RECORD;
      
             EXIT WHEN NOT FOUND;
       strsql_sel := CONCAT_WS('', strsql_sel, cust_ff_upd_cur_record.iuc_webm_inv_cols, ',');
        strsql_set := (CONCAT_WS('', strsql_set, cust_ff_upd_cur_record.iuc_query, ','))::TEXT;
     
END LOOP;
CLOSE cust_ff_update_cur;
IF strsql_set IS NOT NULL THEN
       
 SELECT
           substring(strsql_sel, 1, LENGTH(strsql_sel) - 1)
               INTO STRICT strsql_sel;
SELECT
           substring(strsql_set, 1, LENGTH(strsql_set::TEXT) - 1)
            INTO STRICT strsql_set;

IF v_clone_grp IS NULL THEN
            strsql := (CONCAT_WS('', strsql_main, strsql_set))::TEXT;

SELECT
                replace(strsql::TEXT, '<<SELECTCOL>>'::TEXT,
        coalesce(CONCAT_WS('', strsql_select, strsql_sel)::TEXT, ''))
                INTO STRICT strsql;

strsql := (CONCAT_WS('', strsql, ' , Timestamp = CURRENT_TIMESTAMP::TIMESTAMP(0) '))::TEXT;EXECUTE strsql;


RAISE NOTICE 'strsql%,SELECTCOL%',strsql,SELECTCOL;ELSE
            strsql := (CONCAT_WS('', strsql_main_Clone, strsql_set))::TEXT;
SELECT
                replace(strsql::TEXT, '<<SELECTCOL>>'::TEXT,
        coalesce(CONCAT_WS('', strsql_select2, strsql_sel)::TEXT, ''))
                INTO STRICT strsql;
strsql := (CONCAT_WS('', strsql, ' , Timestamp = CURRENT_TIMESTAMP::TIMESTAMP(0) '))::TEXT;
EXECUTE strsql;
ENDIF;
ENDIF;
END;
$BODY$;

Das sieht schon besser aus, als der erste Versuch. Aber trotzdem, warum postest Du auskommentierten Code?
Wenn Du den Code etwas aufräumst und Zeilenumbrüche einfügst, wo ein Semicolon steht, dann wird es noch besser lesbar.
Vielleicht kommt der Compiler dann auch besser mit dem Code zurecht. Versuch’s mal!
Besonders dort, wo der Syntaxfehler kommt.
Falls Du auf dem Weg nicht weiter kommst, nimmst Du jedes einzelne Statement aus der Prozedur und versuchst es stand-alone auszuführen, Parameter und Variablen musst Du natürlich sinnvoll ersetzen. Es muss kein sinnvolles Ergebnis herauskommen, aber jedes Statement sollte für sich genommen ausführbar sein. Pass auf, dass Du mit den Updates nichts kaputt schreibst.

1 „Gefällt mir“

Dieses Thema wurde automatisch 60 Tage nach der letzten Antwort geschlossen. Es sind keine neuen Antworten mehr erlaubt.