执行PL / pgSQL函数时出错

时间:2016-03-28 14:32:47

标签: postgresql plpgsql

我实际上是在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;

执行测试时,trace表给出了下一个错误:

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

我很感激你的帮助

1 个答案:

答案 0 :(得分:0)

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

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