Postgresql
如何將變數傳遞給儲存過程?
在 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 ...
請注意,此類參數始終是字元串。