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

标签 sql postgresql function plpgsql

所需的设置

为了提高某些代码的优雅,我想知道是否/可以做与%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/

相关文章:

c++ - 如何在递归函数调用中返回当前函数值

javascript - 在函数内调用 javascript 函数

postgresql - 如何将另一列添加到 PostgreSQL 子查询?

sql - ActiveRecord 查找并仅返回与 [ :id] 对齐的选定列

sql - PostgreSQL 表重叠计数

mysql - 我的查询说我的专栏不存在

c - 如何使struct指针指向静态char数组

php - CASE 语句未运行两个 WHEN

sql - 如何在SQL中获取当年的所有周末日期?

mysql - SQL 比较具有版本值的字符串