Збережіть результат запиту в змінній за допомогою 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.

Як це обробити?

Відповіді:


198

Я думаю, ти шукаєш SELECT INTO:

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

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


2
Що робити, якщо мені потрібно кілька змінних. Як і виберіть test_table.name, test_table.id, test_table.ssn?
Дао Лам

2
@DaoLam: З документації, яку мені подобалося: "Результат команди SQL, що дає один рядок (можливо, декілька стовпців), може бути призначений змінній запису, змінній типу рядка або списку скалярних змінних."
mu занадто короткий

@muistooshort, так що ви говорите, я можу зробити те саме, і я можу використовувати name.id, name.ssn для отримання? Я спробував це з IF EXISTS, але не вийшло: ЯКЩО ВИНАГАЄТЬСЯ (виберіть * у назві з test_table ...))
Дао Лам,

@DaoLam Чому ти поєднуєш INTO з АКОМИ Є? Можливо, вам слід задати нове запитання, щоб ви могли пояснити, що ви намагаєтеся зробити.
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 чисто - в ізольованих операторах.
Павло Стехуле

@PavelStehule: Я згоден, ваша форма краща.
Ервін Брандстеттер

Насправді я віддаю перевагу вашому синтаксису, але проблема полягає в тому, що коли ви обробляєте помилки, ваш вислів не надсилає FOUND на істину, протилежну оператору select in check, 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;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.