Re: update avec un where = false

From: "thomas(dot)silvi" <thomas(dot)silvi(at)laposte(dot)net>
To: chetzacoalt(at)free(dot)fr, pgsql-fr-generale(at)postgresql(dot)org
Subject: Re: update avec un where = false
Date: 2005-08-15 09:54:40
Message-ID: 43006660.1030207@laposte.net
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-fr-generale

santiago a écrit :

>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
>
>
>
En fait meme avec un each statement, je vois pas trop comment tu peux faire.
Car le probleme, c'est de passer ton id de ligne dans le trigger MEME si
il n'existe pas.
Je ne suis pas un pro des triggers mais je ne crois pas que cela soit
possible.
Car il me semble que les lignes traites par le trigger sont uniquement
celle qui existent dans
la table. Et en fait cela revient a determiner a partir de la clause,
l'id ou la liste d'id
(impossible car WHERE ccooll > 0 donne l'infini entier positif).
Maintenant je peux dire des betises :)

Bon courage tout de meme.

>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

Browse pgsql-fr-generale by date

  From Date Subject
Next Message Francois.Borlet-Hote 2005-08-18 14:55:17 [pgsql-fr-generale] INSERT avec un schéma
Previous Message santiago 2005-08-14 13:24:00 Re: update avec un where = false