2016-03-18 4 views
5

Я не могу найти ясное объяснение синтаксиса для создания (и использования) таблиц только для внутренних вычислений функции. Может ли кто-нибудь дать мне пример синтаксиса, пожалуйста?Временная таблица postgresql function

Из того, что я нашел, я попробовал это (с и без @ до того temp_table):

CREATE FUNCTION test.myfunction() 
RETURNS SETOF test.out_table 
AS $$ 

DECLARE @temp_table TABLE 
( 
     id int, 
     value text 
) 
BEGIN 
INSERT INTO @temp_table 
     SELECT id, value 
     FROM test.another_table; 

INSERT INTO test.out_table 
     SELECT id, value 
     FROM @temp_table; 
RETURN END 
$$ LANGUAGE SQL; 

я получаю:

ERROR: syntax error at or near "DECLARE" LINE 5: DECLARE @temp_table TABLE

-

Я также попытался Предлагаемый подход CREATE TABLE here, таким образом:

CREATE FUNCTION test.myfunction() 
RETURNS SETOF test.out_table 
AS $$ 

    CREATE TABLE temp_table AS 
     SELECT id, value 
     FROM test.another_table; 

    INSERT INTO test.out_table 
     SELECT id, value 
     FROM temp_table; 

$$ LANGUAGE SQL; 

И я получаю это:

ERROR: relation "temp_table " does not exist LINE 11: FROM temp_table

(Очевидно, я знаю temp_table не нужно для того, что я делаю в коде выше, но это не главное :) => Я хочу чтобы понять синтаксис, чтобы заставить его работать)

+0

Postgres использует временные таблицы для этой цели. Переменные таблицы являются особенностью SQL Server. –

+0

Где в руководстве вы находите синтаксис 'DECLARE @temp_table TABLE ...'? –

ответ

8

соответствующий синтаксис для создания временной таблицы является

create temp table... 

, но вы должны быть уверены, чтобы сбросить временную таблицу, прежде чем существующие из функции. Кроме того, я хотел бы предложить этот синтаксис вместо:

CREATE TEMP TABLE IF NOT EXISTS temp_table AS 
    SELECT id, value 
    FROM test.another_table; 

Таким образом, ваша функция будет выглядеть следующим образом:

CREATE FUNCTION test.myfunction() 
RETURNS SETOF test.out_table 
AS $$ 

    CREATE TEMP TABLE IF NOT EXISTS temp_table AS 
     SELECT id, value 
     FROM test.another_table; 

    INSERT INTO test.out_table 
     SELECT id, value 
     FROM temp_table; 

DROP TABLE temp_table; 

$$ LANGUAGE SQL; 

Но если я могу быть так любезны, я хотел бы переписать эту функцию, так это вернее:

CREATE FUNCTION test.myfunction() 
RETURNS TABLE (id int, value varchar) -- change your datatype as needed 
AS $$ 
BEGIN; 
CREATE TEMP TABLE IF NOT EXISTS temp_table AS 
    SELECT id, value 
    FROM test.another_table; 

INSERT INTO test.out_table 
    SELECT id, value 
    FROM temp_table; 

DROP TABLE temp_table; 

RETURN QUERY 
SELECT id, value 
from temp_table; 

END; 
$$ LANGUAGE plpgsql; 

Непрошеный; дайте мне знать, если это не поможет.

+0

Я буду тестировать его на работе завтра и сообщит вам (и примите его, если он работает), тем временем я просто хотел поблагодарить вас за то, что вы нашли время :) –

+0

Я получаю синтаксическую ошибку из-за 'CREATE 'заявление. Точнее, я получаю следующее: «ОШИБКА: синтаксическая ошибка на или рядом» create »// // ' LINE 4: создать TEMP TABLE temp_mag_ref_compl AS' // '********** Erreur * ********* '// ' ОШИБКА: ошибка синтаксиса при или около "create" '// ' État SQL: 42601' // 'Caractère: 114' –

+0

да, вы правы. Я изменил его, чтобы добавить «begin;» и конец;" Это должно предотвратить синтаксическую ошибку. – dizzystar

Смежные вопросы