Skip site navigation (1) Skip section navigation (2)

Re: update avec un where = false

From: santiago <chetzacoalt(at)free(dot)fr>
To: pgsql-fr-generale(at)postgresql(dot)org
Subject: Re: update avec un where = false
Date: 2005-08-14 13:24:00
Message-ID: 42FF45F0.80105@free.fr (view raw or flat)
Thread:
Lists: pgsql-fr-generale

salut

merci pour l'astuce.
le probleme reste toujours : mon but etait de masque completement a un
'user du nievau haut dessus' le travail que tu encapsule dans set_testA.
par contre, effectivement, le code de ta fonction fait ce que je veux,
avec la notable amelioration de coalese (je connaissais pas cette
fonction, merci  :)  ).

on m'a suggere de faire un trigger avec la clause 'for each statement'
au lieu de 'for each row', mais je croyais que ce n'etais pas implemente
par postgres (en tout cas je suis sur que ca ne l'est pas sur 7.1). si
c'est possible sur des versions suivantes, c'est peut etre une solution.
je vais regarder..

merci encore


thomas.silvi wrote:

>> santiago a écrit :
>>
>
>>>> bonjour
>>>>
>>>> j'aimerai ecrire un trigger pour intercepter les update qui cherchent a
>>>> mettre a jour des lignes n'exhistant pas:
>>>>
>>>> du type:
>>>>
>>>> update table set col=3 where ccooll=2;
>>>> -- avec aucune ligne ne repondant a ccooll=2
>>>>
>>>> je voudrais intercepter ca pour creer une ligne, avec ccooll=2, et le
>>>> reste aux valeurs par defaut.
>>>>
>>>> y'a t-il un moyen de realiser ca ?
>>>>
>>>>
>
>>       Hello,
>> via un trigger, je ne crois pas que cela soit possible.
>>
>> Dans le cas ou c'est un mise a jour de une ligne avec un id donnee de
>> ccooll,
>> tu peux le faire indirectement via une procedure en plgsql
>>
>> par exemple
>>
>> CREATE TABLE testA
>> (
>>    ccooll        INT NOT NULL PRIMARY KEY,
>>    col        INT DEFAULT(1),
>>    col2        VARCHAR(5) DEFAULT('hello')
>> )
>> ;
>>
>>
>> CREATE OR REPLACE FUNCTION set_testA (INT,INT,VARCHAR(5))
>> RETURNS INTEGER AS '
>> DECLARE
>>    v_ccooll ALIAS FOR $1;
>>    v_col     ALIAS FOR $2;
>>    v_col2   ALIAS FOR $3;
>>    v_error    SMALLINT;
>>    v_rowcount INT;
>> BEGIN
>>    UPDATE    testA
>>    SET    col = COALESCE(v_col,col),
>>        col2 = COALESCE(v_col2,col2)
>>    WHERE    ccooll = v_ccooll;
>>      GET DIAGNOSTICS v_rowcount = ROW_COUNT;
>>
>>    IF (v_rowcount = 0) THEN
>>        INSERT INTO testA(ccooll) VALUES (v_ccooll);
>>
>>        UPDATE    testA
>>        SET    col = COALESCE(v_col,col),
>>            col2 = COALESCE(v_col2,col2)
>>        WHERE    ccooll = v_ccooll;
>>    END IF;
>>
>>    RETURN 0;
>> END;
>> ' LANGUAGE 'plpgsql';
>>
>>
>> INSERT INTO testA (ccooll) SELECT 1;
>> INSERT INTO testA (ccooll) SELECT 3;
>>
>> donne
>>
>> ccooll|col|col2
>> ------+---+-----
>>     1|  1|hello
>>     3|  1|hello
>> (2 rows)
>>
>>
>>
>> SELECT    set_testA (1, NULL, 'world');
>>
>> SELECT    set_testA (3, 20, NULL);
>>
>> SELECT    set_testA (2, 20, NULL);
>>
>> SELECT    set_testA (4, NULL, 'bye');
>>
>> SELECT * FROM testA;
>>
>> donne
>>
>> ccooll|col|col2
>> ------+---+-----
>>     1|  1|world
>>     3| 20|hello
>>     2| 20|hello
>>     4|  1|bye (4 rows)
>>
>>
>> Le truc du COALESCE c'est pour dire que si la valeur donne en parametre
>> pour la colonne x vaut NULL,
>> alors la colonne x est mise a jour avec la valeur de la colonne x (bref
>> aucun effet). Mais si la valeur donne
>> en parametre pour la colonne x est differente de NULL, alors la mise a
>> jour est bien effective. Cela permet
>> de faire une seule procedure.
>>
>> Cela ne resout pas completement ta question dans le sens  ou si il y a
>> un UPDATE direct sur la table avec un
>> id inexistant et bien la ligne ne sera jamais creee. Donc pas sur a 100%.
>>
>>    Bonne journee,
>>
>>         Thomas
>>
>
>>>> ---------------------------(end of
broadcast)---------------------------
>>>> TIP 4: Have you searched our list archives?
>>>>
>>>>               http://archives.postgresql.org
>>>>
>>>>
>>>>
>
>>
>>
>> ---------------------------(end of broadcast)---------------------------
>> TIP 3: Have you checked our extensive FAQ?
>>
>>               http://www.postgresql.org/docs/faq
>>
>>

In response to

pgsql-fr-generale by date

Next:From: thomas.silviDate: 2005-08-15 09:54:40
Subject: Re: update avec un where = false
Previous:From: thomas.silviDate: 2005-08-14 08:50:16
Subject: Re: update avec un where = false

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group