2017-12-24 14 views
3

Beispiel: Wenn ich 1,2,3 Params an gespeicherte Prozedur mit IDxyz gesendet haben, dann hat Tabelle 1, 2,3,4,5 IDs, dann 4,5 sollte aus der Tabelle gelöscht werden.Erstellen Sie gespeicherte Prozedur (int [] als param), die vorhandene Datensätze in der Tabelle löscht, wenn keine Übereinstimmung im Array int

CREATE OR REPLACE FUNCTION example_array_input(INT[]) RETURNS SETOF ids AS 
$BODY$ 
DECLARE 
     in_clause ALIAS FOR $1; 
     clause TEXT; 
     rec  RECORD; 
BEGIN 
     FOR rec IN SELECT id FROM ids WHERE id = ANY(in_clause) 

     LOOP 
       RETURN NEXT rec; 
     END LOOP; 
     -- final return 
     RETURN; 
END 
$BODY$ language plpgsql; 

ex: SELECT * FROM example_array_input('{1,2,4,5,6}'::INT[]); 

wenn vorhandene Tabelle hat 1,2,3,4,5,6,7,8,9. dann sollte es 7,8,9 aus dieser Tabelle löschen, da diese nicht im Eingabe-Array vorhanden sind

Antwort

0

Sie können eine DELETE Anweisung wie diese für Ihren Zweck verwenden.

DELETE FROM ids 
where id NOT IN (select UNNEST('{1,2,4,5,6}'::INT[])) ; 

DEMO

0

können Sie eine SQL-Funktion verwenden, die die gelöschten IDs zurückgibt:

CREATE OR REPLACE FUNCTION example_array_input(in_clause INT[]) RETURNS SETOF ids 
    language sql 
AS 
$SQL$ 
    DELETE 
    FROM ids 
    WHERE id NOT IN (SELECT unnest(in_clause)) 
    RETURNING id; 
$SQL$; 

Sie können in http://rextester.com/PFG55537

In einem 1 bis 10 Tabelle laufenden Lauf Beispiel sehen

SELECT * FROM example_array_input('{1,2,4,5,6}'::INT[]); 

erhalten Sie:

Verwandte Themen