Przechowuj wynik zapytania w zmiennej, używając w PL / pgSQL


130

Jak przypisać wynik zapytania do zmiennej w PL / pgSQL, języku proceduralnym PostgreSQL?

Mam funkcję:

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

W powyższej funkcji muszę zapisać wynik tego zapytania:

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

do zmiennej name.

Jak to zrobić?

Odpowiedzi:


198

Myślę, że szukasz SELECT INTO:

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

Że będzie wyciągnąć namez test_tablektórym idjest argumentem czynność i zostawić ją w namezmiennej. Nie pomijaj przedrostka nazwy tabeli test_table.name, bo otrzymasz skargi dotyczące niejednoznacznych odwołań.


2
A jeśli potrzebuję wielu zmiennych. Podobnie jak select test_table.name, test_table.id, test_table.ssn?
Dao Lam

2
@ 365Lam: Z dokumentacji, która mi się podobała: „Wynik polecenia SQL dający pojedynczy wiersz (prawdopodobnie wiele kolumn) można przypisać do zmiennej rekordowej, zmiennej typu wierszowego lub listy zmiennych skalarnych”.
mu jest za krótkie

@muistooshort, więc mówisz, że mogę zrobić to samo i mogę użyć name.id, name.ssn do pobrania? Wypróbowałem to z IF EXISTS, ale nie zadziałało: IF EXISTS (wybierz * w nazwie z test_table ...))
Dao Lam

@IcketLam Dlaczego łączysz INTO z IF EXISTS? Może powinieneś zadać nowe pytanie, abyś mógł wyjaśnić, co próbujesz zrobić.
mu jest za krótkie

3
W dokumentacji nie ma przykładu (lub przegapiłem go), ale jak zauważył @muistooshort, możesz wybrać wiele zmiennych za pomocą pojedynczego wyboru:SELECT test_table.column1, test_table.column2 INTO variable1, variable2 FROM test_table WHERE id = x;
Grengas

78

Dopóki przypisujesz pojedynczą zmienną, możesz również użyć zwykłego przypisania w funkcji plpgsql:

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

Lub użyj SELECT INTOjak @mu już dostarczone .

To też działa:

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

Ale lepiej użyj jednej z pierwszych dwóch, jaśniejszych metod, jak skomentował @Pavel.

Skróciłem dodatkowo składnię o alias tabeli.
Aktualizacja: usunąłem mój przykładowy kod i sugeruję użycie IF EXISTS()zamiast tego, jak zapewnia @Pavel .


1
To nie jest dobry pomysł - ta funkcja nie jest udokumentowana i jest brzydka
Pavel Stehule

2
PL / pgSQL pozwala na mieszanie SQL i PL - i czasami można tworzyć naprawdę dziwne stworzenia, ale lepiej jest mieszać PL i SQL w czysty sposób - w izolowanych instrukcjach.
Pavel Stehule

@PavelStehule: Zgadzam się, twoja forma jest lepsza.
Erwin Brandstetter

Właściwie wolę twoją składnię, ale problem polega na tym, że gdy chcesz obsłużyć błędy, twoje oświadczenie nie wysyła FOUND do true w przeciwieństwie do instrukcji select into, checkout ( postgresql.org/docs/9.1/plpgsql-statements.html )
SENHAJI RHAZI Hamza

18

Typowy wzór to EXISTS(subselect):

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

Ten wzorzec jest używany w PL / SQL, PL / pgSQL, SQL / PSM, ...


2

Utwórz tabelę do nauki:

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

Wstaw tabelę uczenia się danych:

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');

Krok: 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';

Krok: 02

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

Krok: 03

DROP FUNCTION get_all();

Próbny: wprowadź opis obrazu tutaj


-2

Możesz użyć następującego przykładu, aby zapisać wynik zapytania w zmiennej przy użyciu PL / pgSQL:

 select * into demo from maintenanceactivitytrack ; 
    raise notice'p_maintenanceid:%',demo;
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.