Создайте временную таблицу, вставьте в нее, а затем выберите из нее внутри функции pgsql

#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 здесь