Как использовать функцию, чтобы получить из таблицы в postgresql? - PullRequest
0 голосов
/ 13 марта 2019

спасибо за помощь. Извините за плохой английский.

Я создал функцию для возврата имени таблицы, для использования в моем операторе select, здесь скрипт функции:

CREATE OR REPLACE FUNCTION getfromtable(objecttype varchar, destinationtable varchar, firstdate date, OUT tablename varchar)
AS $BODY$
declare 
 objectType       ALIAS FOR $1;
 destinationTable ALIAS FOR $2;
 firstDate        ALIAS FOR $3;
 --tableResult varchar;
BEGIN
   IF UPPER(objectType) = 'VIEW' THEN
      select destinationTable || to_char(cast(firstDate as date),'yy') into tablename;
   END IF;
   IF UPPER(objectType) = 'TABLE' THEN
      select destinationTable || to_char(cast(firstDate as date),'mmyy') into tablename;
   END IF;
END;
$BODY$
LANGUAGE plpgsql

Мне нужно использовать эту функцию, потому что у меня есть имена таблиц с MMYY или представления с YY в имени ... функция работает правильно, но мне нужно использовать ее в select, например:

select * from getfromtable('TABLE','tab_venda_',current_date)

Но вот моя проблема: если я выполняю скрипт, postgres возвращает имя таблицы, но не выполняет выборку из таблицы ... мне нужно выполнить выборку в таблице, а не вернуть функцию ...

Как бы мне хотелось, чтобы это было

select * from tab_venda_0319

Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 13 марта 2019

Вместо возвращения имени таблицы вы можете вернуть результат запроса.См. Измененную функцию.

CREATE OR REPLACE FUNCTION getfromtable(objecttype varchar, destinationtable varchar, firstdate date) 
RETURNS SETOF RECORD
AS $BODY$
declare 
 objectType       ALIAS FOR $1;
 destinationTable ALIAS FOR $2;
 firstDate        ALIAS FOR $3;
 tablename varchar;
BEGIN
   IF UPPER(objectType) = 'VIEW' THEN
      select destinationTable || to_char(cast(firstDate as date),'yy') into tablename;
   END IF;
   IF UPPER(objectType) = 'TABLE' THEN
      select destinationTable || to_char(cast(firstDate as date),'mmyy') into tablename;
   END IF;
   RETURN QUERY EXECUTE 'SELECT * FROM '||tablename;
END;
$BODY$
LANGUAGE plpgsql;

При выборе необходимо предоставить список столбцов, чтобы это работало, как показано ниже

SELECT * FROM getfromtable('TABLE','tab_venda_',current_date) AS tab(column1_name column1_type, ...);
0 голосов
/ 13 марта 2019

Вы на самом деле не делаете что-то не так, но функции просто не работают таким образом. Функция возвращает не имя таблицы, а значение (на этом этапе синтаксический анализ и сборка плана запроса уже выполнены).

Возможно разбиение может вам помочь?

...