我有30个状态明智的数据表。表格名称,例如aa_shg_detail,ab_shg_detail,ac_shg_detail。
我还有一个主状态表,其中存储了状态简称和状态代码。我创建了2个postgresql函数getTableName(Code text)和getDataByTable()。
在第一个函数中,我传递状态代码,以便它使用_shg_detail String提取状态简称和简称concat,并准备完整的表名并返回它。示例:如果我传递状态代码2,则查询将从状态主表中基于状态代码2获取状态简称。状态代码2的状态简称为'ab',因此在使用_shg_detail的第一个函数concat状态简称后,返回ab_shg_detail表名。
第二个函数从第一个函数获取表名,并从该表中获取数据。但是我在第二个功能中遇到了错误。
CREATE OR REPLACE FUNCTION getTableName(code text)
RETURNS text
AS $$
select concat(lower(state_short_name), '_shg_detail') from main_state where state_code = code))
$$
LANGUAGE sql;
CREATE OR REPLACE FUNCTION getDataByTable()
RETURNS text AS $$
DECLARE
tablename text;
BEGIN
tablename := gettablename('2');
RETURN (select shg_code from tablename);
END;
$$ LANGUAGE plpgsql;
当我执行第二个功能select getDataByTable()
时,每次都会出现此错误:
ERROR: relation "tablename" does not exist LINE 1: SELECT (select shg_code from tableName)
答案 0 :(得分:1)
您需要dynamic SQL:
CREATE OR REPLACE FUNCTION getDataByTable()
RETURNS text AS $$
DECLARE
tablename text;
l_result text;
BEGIN
tablename := gettablename('2');
execute format('select shg_code from %I', tablename)
into l_result;
RETURN l_result;
END;
$$ LANGUAGE plpgsql;
format()函数的%I
占位符可以根据需要正确处理标识符的引用。