Bonjour,

Je crée la procédure suivante:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
CREATE OR REPLACE FUNCTION tototest( _clef bigint )
RETURNS void
LANGUAGE plpgsql
AS 
$$
DECLARE
 
BEGIN
	IF _clef <> NULL AND _clef > 0 THEN
		RAISE NOTICE 'UPDATE _clef: %', _clef;
	ELSE
		RAISE NOTICE 'AJOUT _clef: %', _clef;
	END IF;
END;
$$;
ALTER FUNCTION tototest( bigint ) OWNER TO postgres;
Quand je la teste avec les requêtes suivantes:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
select donnees.tototest(NULL);
select donnees.tototest(0::bigint);
select donnees.tototest(1::bigint);
J'obtiens:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
NOTICE:  AJOUT _clef: <NULL>
CONTEXT:  PL/pgSQL function donnees.tototest(bigint) line 8 at RAISE
NOTICE:  AJOUT _clef: 0
CONTEXT:  PL/pgSQL function donnees.tototest(bigint) line 8 at RAISE
NOTICE:  AJOUT _clef: 1
CONTEXT:  PL/pgSQL function donnees.tototest(bigint) line 8 at RAISE
résultat de la requête de 1 ligne annulé.
Or comme c'est un ET dans le IF, quand clef = 1 je devrais avoir un UPDATE ?

Si je change
Code : Sélectionner tout - Visualiser dans une fenêtre à part
IF _clef <> NULL AND _clef > 0 THEN
en
Code : Sélectionner tout - Visualiser dans une fenêtre à part
IF _clef <> NULL OR _clef > 0 THEN
j'obtiens le bon fonctionnement, à savoir:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
NOTICE:  AJOUT _clef: <NULL>
CONTEXT:  PL/pgSQL function donnees.tototest(bigint) line 8 at RAISE
NOTICE:  AJOUT _clef: 0
CONTEXT:  PL/pgSQL function donnees.tototest(bigint) line 8 at RAISE
NOTICE:  UPDATE _clef: 1
CONTEXT:  PL/pgSQL function donnees.tototest(bigint) line 6 at RAISE
Ma version de PostgreSQL est: "PostgreSQL 9.6.15 on x86_64-pc-linux-gnu, compiled by gcc (Debian 6.3.0-18+deb9u1) 6.3.0 20170516, 64-bit"

C'est moi ou je ne sais plus coder de IF ???