执行 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)
我实际上是在用 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)