所需的设置
为了提高某些代码的优雅,我想知道是否/可以做与%ROWTYPE variable from table name相反的事情— 从 %ROWTYPE
或 RECORD
中提取表名(最相关的是,在将其传递给函数后它接受 ANYELEMENT
伪类型):
CREATE OR REPLACE FUNCTION generic_function(row_data ANYELEMENT)
RETURNS INT AS $$
DECLARE
table_name TEXT = get_table_name(row_data);
BEGIN
-- [ work goes here ]
END;
$$ LANGUAGE plpgsql;
当前的解决方法
CREATE OR REPLACE FUNCTION generic_function(row_data ANYELEMENT, table_name TEXT)
RETURNS INT AS $$
BEGIN
-- [ work goes here ]
END;
$$ LANGUAGE plpgsql;
解决方法感觉有点多余,如果您能想象它在调用代码中的样子:
SELECT INTO x * FROM mytable WHERE foo = bar;
PERFORM generic_function(x,'mytable');
优雅但愚蠢的解决方案
为了允许我在顶部显示调用签名,我能想到的最佳解决方案是高开销的猜测和检查方法,这可能是一个非常的坏主意在生产中使用。你可以找到 sqlfiddle here .
最佳答案
有一个简单的解决方案。使用 pg_typeof()
:
CREATE OR REPLACE FUNCTION generic_function(row_data ANYELEMENT)
RETURNS text AS
$func$
DECLARE
table_name text := pg_typeof($1);
BEGIN
RETURN table_name;
END
$func$ LANGUAGE plpgsql;
显然,这只适用于已注册的复合类型。 每个表或 View 都属于这一类。但不是派生表。
测试:
CREATE TEMP TABLE foo (id int);
SELECT generic_function(NULL::foo);
关于sql - 从任意 %ROWTYPE 或 RECORD 值获取表名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34190346/