Speichern Sie das Abfrageergebnis in einer Variablen, die in PL / pgSQL verwendet wird


129

Wie ordne ich das Ergebnis einer Abfrage einer Variablen in PL / pgSQL zu, der prozeduralen Sprache von PostgreSQL?

Ich habe eine Funktion:

CREATE OR REPLACE FUNCTION test(x numeric)
RETURNS character varying AS
$BODY$
DECLARE
name   character varying(255);
begin
 name ='SELECT name FROM test_table where id='||x;

 if(name='test')then
  --do somthing
 else
  --do the else part
 end if;
end;
return -- return my process result here
$BODY$
LANGUAGE plpgsql VOLATILE

In der obigen Funktion muss ich das Ergebnis dieser Abfrage speichern:

'SELECT name FROM test_table where id='||x;

zur Variablen name.

Wie verarbeite ich das?

Antworten:


196

Ich denke du suchst SELECT INTO:

select test_table.name into name from test_table where id = x;

Das wird das Ziehen namevon test_tablewo idIhre Funktion Argument ist , und lassen Sie ihn in der nameVariable. Lassen Sie das Tabellennamenpräfix nicht aus, test_table.namesonst erhalten Sie Beschwerden über eine mehrdeutige Referenz.


2
Was ist, wenn ich mehrere Variablen benötige? Wie wählen Sie test_table.name, test_table.id, test_table.ssn?
— Dao Lam

2
@DaoLam: Aus der Dokumentation ging hervor: "Das Ergebnis eines SQL-Befehls, der eine einzelne Zeile (möglicherweise aus mehreren Spalten) ergibt, kann einer Datensatzvariablen, einer Zeilentypvariablen oder einer Liste skalarer Variablen zugewiesen werden."
— Mu ist zu kurz

@muistooshort, also sagst du, ich kann das Gleiche tun und ich kann name.id, name.ssn verwenden, um abzurufen? Ich habe es mit IF EXISTS versucht, aber es hat nicht funktioniert: IF EXISTS (wählen Sie * in Name aus test_table ...))
— Dao Lam

@DaoLam Warum kombinierst du INTO mit IF EXISTS? Vielleicht sollten Sie eine neue Frage stellen, damit Sie erklären können, was Sie versuchen zu tun.
— Mu ist zu kurz

2
Es gibt kein Beispiel in der Dokumentation (oder ich habe es verpasst), aber wie @muistooshort feststellte, können Sie mit einer einzigen Auswahl in mehrere Variablen auswählen:SELECT test_table.column1, test_table.column2 INTO variable1, variable2 FROM test_table WHERE id = x;
— Grengas

78

Solange Sie eine einzelne Variable zuweisen, können Sie auch eine einfache Zuweisung in einer plpgsql-Funktion verwenden:

name := (SELECT t.name from test_table t where t.id = x);

Oder verwenden Sie SELECT INTOwie @mu bereits zur Verfügung gestellt .

Das funktioniert auch:

name := t.name from test_table t where t.id = x;

Verwenden Sie jedoch besser eine der ersten beiden klareren Methoden, wie @Pavel kommentierte.

Ich habe die Syntax zusätzlich mit einem Tabellenalias gekürzt.
Update: Ich habe mein Codebeispiel entfernt und empfehle, es IF EXISTS()stattdessen wie von @Pavel bereitgestellt zu verwenden .


1
Dies ist keine gute Idee - diese Funktion ist nicht dokumentiert und es ist hässlich
— Pavel Stehule

2
PL / pgSQL ermöglicht das Mischen von SQL und PL - und manchmal können Sie wirklich seltsame Kreaturen erstellen, aber es ist besser, PL und SQL sauber zu mischen - in isolierten Anweisungen.
— Pavel Stehule

@ PavelStehule: Ich stimme zu, Ihr Formular ist vorzuziehen.
— Erwin Brandstetter

Eigentlich bevorzuge ich Ihre Syntax, aber das Problem ist, wenn Sie Fehler behandeln wollen, Ihre Anweisung sendet FOUND nicht an true im Gegenteil der select-in-Anweisung checkout ( postgresql.org/docs/9.1/plpgsql-statements.html )
— SENHAJI RHAZI Hamza

18

Das übliche Muster ist EXISTS(subselect):

BEGIN
  IF EXISTS(SELECT name
              FROM test_table t
             WHERE t.id = x
               AND t.name = 'test')
  THEN
     ---
  ELSE
     ---
  END IF;

Dieses Muster wird in PL / SQL, PL / pgSQL, SQL / PSM, ...


2

Lerntabelle erstellen:

CREATE TABLE "public"."learning" (
    "api_id" int4 DEFAULT nextval('share_api_api_id_seq'::regclass) NOT NULL,
    "title" varchar(255) COLLATE "default"
);

Daten-Lerntabelle einfügen:

INSERT INTO "public"."learning" VALUES ('1', 'Google AI-01');
INSERT INTO "public"."learning" VALUES ('2', 'Google AI-02');
INSERT INTO "public"."learning" VALUES ('3', 'Google AI-01');

Schritt: 01

CREATE OR REPLACE FUNCTION get_all (pattern VARCHAR) RETURNS TABLE (
        learn_id INT,
        learn_title VARCHAR
) AS $$
BEGIN
    RETURN QUERY SELECT
        api_id,
        title
    FROM
        learning
    WHERE
        title = pattern ;
END ; $$ LANGUAGE 'plpgsql';

Schritt: 02

SELECT * FROM get_all('Google AI-01');

Schritt: 03

DROP FUNCTION get_all();

Demo: Geben Sie hier die Bildbeschreibung ein


-2

Mit dem folgenden Beispiel können Sie ein Abfrageergebnis mithilfe von PL / pgSQL in einer Variablen speichern:

 select * into demo from maintenanceactivitytrack ; 
    raise notice'p_maintenanceid:%',demo;
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.