2012-10-16 3 views
0

J'ai écrit le déclencheur suivant.Exécuter la mise à jour Toujours SET trouvé à FALSE

CREATE OR REPLACE FUNCTION tbl_scdr_insert_trigger() RETURNS TRIGGER AS $$ 
<<fk>> 
DECLARE 
    rowcount int; 
    myrec RECORD; 
BEGIN 
    EXECUTE 'UPDATE sc_'|| to_char(NEW.start_datetime, 'YYYY_MM') ||' SET a = a + ($1).a, b = b + ($1).b WHERE (e_id = ($1).e_id AND start_datetime = ($1).start_datetime AND c_id = ($1).c_id' 
    USING NEW; 
    GET DIAGNOSTICS rowcount = ROW_COUNT; 
    RAISE NOTICE 'found %', rowcount; 
    IF not found THEN 
     RAISE NOTICE 'not found'; 
    ELSIF found THEN 
     RAISE NOTICE 'found'; 
     RETURN NULL; 
    END IF; 
END; 
$$ 
LANGUAGE plpgsql; 

Lorsque jamais appelé ce retour toujours zéro Rowcount parce que la déclaration n'est pas engagé et pourtant Found est toujours faux, même il y a des enregistrements avec les mêmes valeurs de colonnes où clause.

Répondre

2

Comme les PostgreSQL documentation états:

EXECUTE change la sortie de DIAGNOSTICS GET, mais ne change pas TROUVE

Cela signifie que TROUVE sera toujours FAUX dans votre cas, parce que vous utilisez EXECUTE et pas une instruction UPDATE statique.

+0

J'ai lu ce document et il n'y a aucune déclaration explicite à propos de Execute Update mais pourquoi rowcount est toujours Zero. puisque le déclencheur fonctionne sur une seule transaction et ne peut pas le valider. – sharafjaffri

+0

La transaction n'a pas d'importance dans ce cas. Vous devriez avoir des diagnostics appropriés juste après l'exécution de la requête. Pouvez-vous attribuer la totalité de la chaîne de requête à une variable, puis l'augmenter comme un avis, puis exécuter cette UPDATE dans la console et voir si elle met réellement à jour quelque chose? –

Questions connexes