2017-01-29 3 views
0

Ich habe 2 Tabellen. Tabelle 1 und Tabelle 2. Nur Tabelle 1 wird ausgefüllt und dann durch einen Trigger füllen ich die Werte von Tabelle2.PL/Pgsql mehr als eine Zeile von einer Unterabfrage zurückgegeben

Also, ich habe Auslöser wie diese,

CREATE OR REPLACE FUNCTION function_copy() RETURNS TRIGGER AS                                 
$BODY$                                               
BEGIN                                               
    INSERT INTO table2 (name) values ((select unnest(xpath('/attendee/bio/name/text()',data)) from table1));                      

    RETURN new;                                             
END;                                               
$BODY$                                               
language plpgsql;   

Triggerfunktion

CREATE TRIGGER trig_copy                                          
AFTER INSERT ON table1                                          
FOR EACH ROW                                             
    EXECUTE PROCEDURE function_copy();   

Also, wenn ich mehr als 1 Zeile in Tabelle 1 einfügen Ich erhalte diesen Fehler

ERROR: more than one row returned by a subquery used as an expression

Antwort

2

Verwenden Sie nicht insert . . . values. Verwenden Sie insert . . . select:

INSERT INTO table2 (name) 
    select unnest(xpath('/attendee/bio/name/text()', data)) 
    from table1; 

Die values Klausel geht davon aus, dass es nur einen Wert. Ihre Abfrage weist darauf hin, dass mehrere Zeilen eingefügt werden müssen.

+0

Vielen Dank. Das funktioniert! etwas so Feines. Jetzt habe ich meinen Trigger geändert, um TRUNCATE TABLE2 zu machen; EINFÜGEN IN Tabelle2 (Name) ... – NinjaGaiden

2

@Gordon addresses your immediate SQL error mit einer Set-Return-Funktion. Aber der ganze Ansatz ist sehr kaputt. Sie bearbeiten die gesamte Tabelle für jede eingefügte Zeile, wodurch ein stetig wachsender Dublettenstrom entsteht. Sie kommentierte später, wie Sie redundante Einsätze beheben:

TRUNCATE TABLE2; INSERT INTO table2(name)...

Art .. kreativ. :) aber nicht. Verarbeiten Sie nur die einzelne eingefügte Zeile. Dieaist für diesen Zweck genau:

CREATE OR REPLACE FUNCTION function_copy() 
    RETURNS trigger AS 
$func$ 
BEGIN 
    INSERT INTO table2 (name) 
    SELECT * 
    FROM unnest(xpath('/attendee/bio/name/text()', NEW.data)) 

    RETURN NULL; -- irrelevant for AFTER trigger 
END 
$func$ LANGUAGE plpgsql;
+0

Danke. Ich wusste, dass es zu meinem Besten clever war. – NinjaGaiden

Verwandte Themen