Bonjour,
Je crée la procédure suivante:
Quand je la teste avec les requêtes suivantes:
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;
J'obtiens:
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);
Or comme c'est un ET dans le IF, quand clef = 1 je devrais avoir un UPDATE ?
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é.
Si je changeen
Code : Sélectionner tout - Visualiser dans une fenêtre à part IF _clef <> NULL AND _clef > 0 THENj'obtiens le bon fonctionnement, à savoir:
Code : Sélectionner tout - Visualiser dans une fenêtre à part IF _clef <> NULL OR _clef > 0 THEN
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"
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
C'est moi ou je ne sais plus coder de IF ???
Partager