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?

Sathish
quelle

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.

mu ist zu kurz
quelle
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 .

Erwin Brandstetter
quelle
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, ...

Pavel Stehule
quelle
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

Ram Pukar
quelle
-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;
Rinku Choudhary
quelle