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

Как присвоить результат запроса переменной в 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.

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


person Sathish    schedule 08.09.2012    source источник


Ответы (6)


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

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

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

person mu is too short    schedule 08.09.2012
comment
Что, если мне нужно несколько переменных. Например, выберите test_table.name, test_table.id, test_table.ssn? - person Dao Lam; 05.03.2015
comment
@DaoLam: Из документации, которая мне понравилась: результат команды SQL, дающей одну строку (возможно, из нескольких столбцов), может быть назначен переменной записи, переменной типа строки или списку скалярных переменных. - person mu is too short; 05.03.2015
comment
@muistooshort, значит, вы говорите, что я могу сделать то же самое и могу использовать name.id, name.ssn для получения? Я пробовал это с IF EXISTS, но не сработало: IF EXISTS (выберите * в имя из test_table ...)) - person Dao Lam; 05.03.2015
comment
@DaoLam Почему вы объединяете INTO с IF EXISTS? Может быть, вам стоит задать новый вопрос, чтобы вы могли объяснить, что вы пытаетесь сделать. - person mu is too short; 06.03.2015
comment
@muistooshort этот способ не работает, когда запрос возвращает массив. Есть ли альтернатива этому в случае массивов? Вот мой вопрос по тому же поводу: stackoverflow.com/questions/34194818/ - person Mitaksh Gupta; 10.12.2015
comment
Обратите внимание на возможность добавления TEMPORARY перед именем таблицы для создания временной таблицы. (В противном случае можно использовать DROP TABLE IF EXISTS test_table; и следить за ненужными таблицами.) - person Fabien Snauwaert; 09.03.2019
comment
В документации нет примера (или я его пропустил), но, как заметил @muistooshort, вы можете выбрать несколько переменных с помощью одного выбора: SELECT test_table.column1, test_table.column2 INTO variable1, variable2 FROM test_table WHERE id = x; - person Grengas; 12.04.2019
comment
К вашему сведению, я только что обнаружил, что в моей старой версии Postgres НИКТО из этих решений не работает, если за ним следует динамический запрос. Если ваш основной запрос является динамическим, вы должны сделать первый запрос динамическим, также используя переменную EXECUTE .... INTO. Мне потребовалось очень много времени, чтобы понять. - person blissweb; 13.06.2020
comment
В документации Postgres этот синтаксис называется SELECT select_expressions INTO (который не создает таблицу), а не SELECT INTO (который создает). Дополнительная информация - person Edward Brey; 15.04.2021
comment
@EdwardBrey Спасибо за разъяснения. - person mu is too short; 15.04.2021

Пока вы назначаете одну переменную, вы также можете использовать простое присваивание в функции 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() вместо предоставленного @ Павел.

person Erwin Brandstetter    schedule 08.09.2012
comment
Это плохая идея - эта функция не задокументирована и некрасива. - person Pavel Stehule; 08.09.2012
comment
PL / pgSQL позволяет смешивать SQL и PL - и иногда вы можете создавать действительно странные существа, но лучше чисто смешивать PL и SQL - в изолированных операторах. - person Pavel Stehule; 08.09.2012
comment
@PavelStehule: Я согласен, ваша форма предпочтительнее. - person Erwin Brandstetter; 10.09.2012
comment
На самом деле я предпочитаю ваш синтаксис, но проблема в том, что когда вы обрабатываете ошибки, ваш оператор не отправляет FOUND значение true в противоположность оператору select into, checkout (postgresql.org/docs/9.1/plpgsql-statements.html) - person SENHAJI RHAZI Hamza; 26.11.2018

Обычный шаблон 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, ...

person Pavel Stehule    schedule 08.09.2012

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

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

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

person Ram Pukar    schedule 08.05.2017

Согласно Выполнение запроса с однострочным результатом используйте этот синтаксис:

SELECT select_expressions INTO [STRICT] target FROM ...

где target может быть переменной записи, переменной строки или разделенным запятыми списком простых переменных и полей записи / строки.

В отличие от SELECT INTO, SELECT select_expressions INTO не создает таблицу.

В вашем примере у вас есть одна простая переменная name, поэтому оператор выбора будет выглядеть следующим образом:

SELECT test_table.name INTO name FROM test_table WHERE test_table.id = x;
person Edward Brey    schedule 15.04.2021

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

 select * into demo from maintenanceactivitytrack ; 
    raise notice'p_maintenanceid:%',demo;
person rinku Choudhary    schedule 08.10.2018