我实际上是在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"
我很感激你的帮助
答案 0 :(得分:0)
这段代码绝对不可读。在这种情况下,很好的帮助是在执行之前使用RAISE NOTICE '%', V_SQL_QRY;
。当动态字符串很复杂时,函数format
和自定义字符串分隔符会有所帮助:
EXECUTE format($str$ UPDATE foo SET %I='AHOJ' $str$, column_name)