在 DO $$ bloc 中调用以下过程似乎无法正常工作。
程序 :
CREATE OR REPLACE PROCEDURE pLog(P_VAR_LOG text)
AS $$
BEGIN
IF D_SetLog THEN
RAISE NOTICE '[LOG %] %',to_char(sysdate,'DD/MM/YYYY - HH24:MI:SS'),P_VAR_LOG;
END IF
;
END;
$$ LANGUAGE plpgsql;
我试图在 declare bloc 中声明 PROCEDURE 但它不起作用。
这是 DO $$ bloc 定义:
DO $$
DECLARE
CRITERE1 CURSOR FOR
SELECT
DOSSIER.ID_DOSSIER,
DOSSIER.ED_ETAT
FROM
IMM_DOSSIER DOSSIER,
IMM_CHANTIER CHANTIER
WHERE
DOSSIER.ID_DOSSIER = CHANTIER.ID_DOSSIER
AND DOSSIER.ED_ETAT <> 'CLOS'
AND CHANTIER.DATE_FIN_REELLE is null
AND CHANTIER.DATE_FIN_SOUHAITEE is not null
AND CHANTIER.DATE_FIN_SOUHAITEE < LOCALTIMESTAMP
UNION
SELECT
DOSSIER.ID_DOSSIER,
DOSSIER.ED_ETAT
FROM (
SELECT
DEVIS.ID_DOSSIER,
MIN(TRAVAUX.DATE_FIN_SOUHAITEE) DATE_FIN_SOUHAITEE
FROM
IMM_DEVIS DEVIS, IMM_TRAVAUX_DEVIS TRAVAUX
WHERE
DEVIS.ID_DEVIS = TRAVAUX.ID_DEVIS
AND TRAVAUX.DATE_FIN_REELLE is null
AND TRAVAUX.DATE_FIN_SOUHAITEE is not null
GROUP BY DEVIS.ID_DOSSIER
)
DOSSIER_CIBLE,
IMM_DOSSIER DOSSIER
WHERE
DOSSIER.ID_DOSSIER = DOSSIER_CIBLE.ID_DOSSIER
AND DOSSIER.ED_ETAT <> 'CLOS'
and DOSSIER_CIBLE.DATE_FIN_SOUHAITEE < LOCALTIMESTAMP;
-- Def des enregistrements pour les curseurs
V_C_CRITERE1 RECORD;
V_INSERT INTEGER := 0;
D_CodeRet INTEGER;
D_SetLog BOOLEAN;
/*****************************************************************************
** NOM MNEMONIQUE : pLog
*****************************************************************************/
/*****************************************************************************
** MAIN
*****************************************************************************/
BEGIN
D_SetLog := TRUE
;
CALL pLog('Suppression des anciennes alertes : ')
;
END $$;
当我执行这个 sql 脚本时,我得到以下信息:
SET
DROP SEQUENCE
WARNING: there is no transaction in progress
COMMIT
CREATE SEQUENCE
WARNING: there is no transaction in progress
COMMIT
CREATE PROCEDURE
DO
NOTICE未显示,无法弄清楚原因。
PostgreSQL 中没有全局变量,所以您必须将其
d_setlog
作为参数传递给过程。另一种方法是在 PostgreSQL 中使用自定义占位符参数:
调用函数确实
和被调用的程序测试
请注意,此类参数始终是字符串。