#postgresql
#postgresql
Вопрос:
Привет, я хочу создать временную таблицу, вставить в нее, а затем выбрать из нее внутри функции pgsql. может кто-нибудь сказать мне, как я могу это сделать.
вот как я пытаюсь, но он не работает и говорит неправильный синтаксис рядом с select
create or replace function myfunction()
returns table ("id" int,"trans_doc_type" character varying
)
as
$
CREATE TEMPORARY TABLE "new_table_name"
(
"id" int,
trans_doc_type VARCHAR(80)
);
SELECT
t.id ,
t.trans_doc_type
INTO temp table "new_table_name"
FROM
"transaction" t;
select * from "new_table_name";
$
language sql;
Комментарии:
1. Рассмотрим: dba.stackexchange.com/questions/42924 /…
2. вы не можете сделать это непосредственно в функции, вы можете создать процедуру для этого или использовать динамический sql внутри функции (не рекомендуется)
3. @eshirvana пожалуйста, добавьте его в качестве ответа, чтобы я мог пометить его правильно
4. Да, вы можете использовать функцию для этого. Смотрите Ответ ниже.
5. Как правило, вам не нужна временная таблица в подобных случаях. CTE s выполнит эту работу намного чище и эффективнее.
Ответ №1:
Использование plpgsql
функции:
create table transaction(id integer, trans_doc_type varchar);
insert into transaction values (1, 'test');
insert into transaction values (2, 'test2');
create or replace function myfunction()
returns table ("id" int,"trans_doc_type" character varying
)
as
$
BEGIN
CREATE TEMPORARY TABLE new_table_name ON COMMIT drop AS
SELECT
t.id ,
t.trans_doc_type
FROM
"transaction" t
;
RETURN QUERY select * from "new_table_name";
END;
$
language plpgsql;
select * from myfunction();
id | trans_doc_type
---- ----------------
1 | test
2 | test2
Это можно сократить до:
create or replace function myfunction()
returns table ("id" int,"trans_doc_type" character varying
)
as
$
BEGIN
RETURN QUERY
SELECT
t.id ,
t.trans_doc_type
FROM
"transaction" t
;
END;
$
language plpgsql;
Комментарии:
1. Смотрите Сокращенную версию, добавленную к ответу.
2. спасибо, но меня беспокоило использование временной таблицы и выбор из нее, который работал отлично
3. Я знал о другом подходе, который я сократил
4. Вам даже не нужен PL / pgSQL здесь