gpt4 book ai didi

sql - 从任意 %ROWTYPE 或 RECORD 值获取表名

转载 作者:行者123 更新时间:2023-11-29 12:19:27 24 4
gpt4 key购买 nike

所需的设置

为了提高某些代码的优雅,我想知道是否/可以做与%ROWTYPE variable from table name相反的事情— 从 %ROWTYPERECORD 中提取表名(最相关的是,在将其传递给函数后它接受 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);

Here is a search for related answers.

关于sql - 从任意 %ROWTYPE 或 RECORD 值获取表名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34190346/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com