Сохраните результат запроса в переменной, использующей PL / pgSQL

130

Как присвоить результат запроса переменной в PL / pgSQL, процедурном языке PostgreSQL?

У меня есть функция:

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

В приведенной выше функции мне нужно сохранить результат этого запроса:

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

к переменной name.

Как это обработать?

Sathish
источник

Ответы:

199

Я думаю, вы ищете SELECT INTO:

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

Это будет тянуть nameиз test_tableкоторых idявляется аргументом вашей функции и оставить его в nameпеременной. Не пропускайте префикс имени таблицы, test_table.nameиначе вы получите жалобы на неоднозначную ссылку.

mu слишком короткий
источник
2
Что, если мне нужно несколько переменных. Например, выберите test_table.name, test_table.id, test_table.ssn?
Дао Лам
2
@DaoLam: Из документации, которая мне понравилась: «Результат команды SQL, дающей одну строку (возможно, из нескольких столбцов), может быть назначен переменной записи, переменной типа строки или списку скалярных переменных».
mu слишком короткое
@muistooshort, значит, вы говорите, что я могу сделать то же самое, и я могу использовать name.id, name.ssn для получения? Я пробовал это с IF EXISTS, но не сработало: IF EXISTS (выберите * в имя из test_table ...))
Дао Лам
@DaoLam Почему вы объединяете INTO с IF EXISTS? Может быть, вам стоит задать новый вопрос, чтобы вы могли объяснить, что вы пытаетесь сделать.
mu слишком короткое
3
В документации нет примера (или я его пропустил), но, как заметил @muistooshort, вы можете выбрать несколько переменных с помощью одного выбора:SELECT test_table.column1, test_table.column2 INTO variable1, variable2 FROM test_table WHERE id = x;
Grengas
78

Пока вы назначаете одну переменную, вы также можете использовать простое присвоение в функции plpgsql:

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

Или использовать SELECT INTOкак @mu уже предусмотрено .

Это тоже работает:

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

Но лучше использовать один из первых двух, более четких методов, как прокомментировал @Pavel.

Я дополнительно сократил синтаксис с помощью псевдонима таблицы.
Обновление: я удалил свой пример кода и предлагаю использовать IF EXISTS()вместо него, как предоставлено @Pavel .

Эрвин Брандштеттер
источник
1
Это
плохая
2
PL / pgSQL позволяет смешивать SQL и PL - и иногда вы можете создавать действительно странные существа, но лучше чисто смешивать PL и SQL - в изолированных операторах.
Павел Стехуле 08
@PavelStehule: Я согласен, ваша форма предпочтительнее.
Эрвин Брандштеттер,
На самом деле я предпочитаю ваш синтаксис, но проблема в том, что когда вы обрабатываете ошибки, ваш оператор не отправляет FOUND значение true в противоположность оператору select into, checkout ( postgresql.org/docs/9.1/plpgsql-statements.html )
SENHAJI RHAZI Hamza
18

Обычный паттерн EXISTS(subselect):

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

Этот шаблон используется в PL / SQL, PL / pgSQL, SQL / PSM, ...

Павел Стехуле
источник
2

Создать учебную таблицу:

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

Вставить таблицу обучения данным:

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

Шаг: 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';

Шаг: 02

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

Шаг: 03

DROP FUNCTION get_all();

Демо-версия: введите описание изображения здесь

Рам Пукар
источник
-2

Вы можете использовать следующий пример, чтобы сохранить результат запроса в переменной с помощью PL / pgSQL:

 select * into demo from maintenanceactivitytrack ; 
    raise notice'p_maintenanceid:%',demo;
Ринку Чоудхари
источник