Postgresql

如何將變數傳遞給儲存過程?

  • April 24, 2020

在 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 中使用自定義佔位符參數:

呼叫函式確實

SET mylog.active = true;

和被呼叫的程序測試

IF current_setting('mylog.active', TRUE) = 'true' THEN ...

請注意,此類參數始終是字元串。

引用自:https://dba.stackexchange.com/questions/265517