执行 PL/pgSQL 函数时出错

An error while executing a PL/pgSQL function

我实际上是在用 postgres 开发一个函数。我正在使用一些痕迹从这一个中收集信息。我正在尝试这段让我不知何故卡住的代码,你的帮助会让我更容易。

    --For Month-Year, we subtract the last part so we could have only "Month"    
V_SQL_QRY := 'UPDATE ZONE AS ZN '||
                            'SET '||V_CAT_DMOIS||' = regexp_replace(EC.OCCURRENCE, ''\-[0-9]{4}'',''''), ' 
                        ||V_CAT_ANNEE||' = SUBSTRING(EC.OCCURRENCE FROM ''....$''), '
                              ||V_CAT_DM||' = ROUND(EC.MONTANT_BASE::numeric, 2) '|| 
                       'FROM ECHEANCE AS EC '||
                          'WHERE '||V_ZONE_C||' AND ZN.UNID = EC.ZONE_ID AND EC.CANEVAS_ID = '||V_TAX_ID||' AND EC.ETAT = ''P'' '||
                            'AND SUBSTRING(EC.OCCURRENCE FROM ''....$'')||convertmonth(regexp_replace(EC.OCCURRENCE,''\-[0-9]{4}'','''')) '||
                            '= (SELECT MAX(SUBSTRING(EH.OCCURRENCE FROM ''....$'')||convertmonth(regexp_replace(EH.OCCURRENCE,''\-[0-9]{4}'','''')) '|| 
                             'FROM ECHEANCE AS EH '||
                            'WHERE EH.ZONE_ID = EC.ZONE_ID AND EH.CANEVAS_ID = EC.CANEVAS_ID AND EH.ETAT = ''P'') '||
                        'AND NOT ( '||V_CAT_DMOIS||' IS NOT NULL '||
                        'AND '||V_CAT_ANNEE||' IS NOT NULL AND ' ||V_CAT_ANNEE||' SIMILAR TO ''\d{4}'' '||
                            'AND '||V_CAT_DM||' IS NOT NULL AND '||V_CAT_DM||' SIMILAR TO ''[\d\s]+[.]?\d*'' '|| -- On considère le montant avec '.' au lieu de la ','
                            'AND CAST(FORMAT('||V_CAT_DM||') AS DOUBLE PRECISION) > 0 '||
                            'AND '||V_CAT_ANNEE||' > EC.ANNEE_REFERENCE '||
                                'OR '||V_CAT_ANNEE||' = EC.ANNEE_REFERENCE '||
                               'AND convertmonth('||V_CAT_DMOIS||') > convertmonth(regexp_replace(EH.OCCURRENCE,''-[0-9]{4}'',''''))))';
                    EXECUTE V_SQL_QRY;

为测试执行它时,跟踪 table 给了我下一个错误:

SQLSTATE=42601, SQLERRM=Syntax Error Near "FROM"

非常感谢你的帮助

这段代码绝对不可读。在这种情况下,很好的帮助是在执行前使用 RAISE NOTICE '%', V_SQL_QRY;。当动态字符串很复杂时,函数 format 和自定义字符串分隔符会有所帮助:

EXECUTE format($str$ UPDATE foo SET %I='AHOJ' $str$, column_name)