如何使用函数从Postgresql中的表名获取?

时间:2019-03-13 11:52:25

标签: database postgresql function select tablename

感谢您的帮助。 对不起,英语不好。

我创建了一个返回表名的函数,供我的select语句使用,此处为函数脚本:

select

我需要使用此功能,因为我具有名称为MMYY的表名或名称为YY的视图...该功能可以正常工作,但是,我需要在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

但是,这是我的问题,如果我执行脚本,postgres返回表名,但不执行表中的选择...我需要在表中执行选择,而不返回函数...

希望如此

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

我在做什么错了?

2 个答案:

答案 0 :(得分:0)

您并没有真正在做错事,但是函数并不能那样工作。该函数返回的不是表名,而是一个值(此时已经完成了解析和查询计划的构建)。

也许partitioning可以帮助您吗?

答案 1 :(得分:0)

您可以返回查询结果,而不是返回表名。查看修改后的功能。

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, ...);