相关疑难解决方法(0)

PL/pgSQL regclass 引用名为 like 关键字的表

我想通过在现有表名的基础上附加后缀来创建一个新表名。Postgres 9.5 PL/pgSQL 函数获取作为regclass类型传入的现有表名,并以字符串形式返回新名称。我format()用来构造新名称,通常会使用%I占位符。只要传入的表名不匹配任何 PL/pgSQL 关键字,这就会起作用。在这种情况下,无论我选择(%I%s)什么类型的组件,引用都是错误的。

考虑以下函数:

CREATE OR REPLACE FUNCTION make_name(old_name regclass)
RETURNS text                                           
LANGUAGE plpgsql AS                                    
$$                                                     
BEGIN                                                  
    RETURN format('%I_new', old_name);                 
END;                                                   
$$;                                                    
Run Code Online (Sandbox Code Playgroud)

进一步假设有两个表:treenodeoverlay。为这两个函数调用此函数会产生以下新名称:

SELECT make_name('overlay'::regclass);
     make_name     
-------------------
 """overlay"""_new
(1 row)

SELECT make_name('treenode'::regclass);
  make_name   
--------------
 treenode_new
(1 row)
Run Code Online (Sandbox Code Playgroud)

事实证明overlay它也是一个 PL/pgSQL 函数(就像format,但treenode不是),它似乎改变了引用行为。如果%s与 一起使用format(),结果将是"overlay"_new。当我使用||运算符时也会发生同样的情况。如果我使用text作为输入参数类型,一切都按预期工作,但我更喜欢使用regclass.

有没有办法用不带引号的关键字匹配regclass表名(例如overlay …

postgresql syntax datatypes plpgsql regclass

5
推荐指数
1
解决办法
2087
查看次数

标签 统计

datatypes ×1

plpgsql ×1

postgresql ×1

regclass ×1

syntax ×1