PL/pgSQL - %TYPE和ARRAY

5

是否可以同时使用%TYPE和数组?

CREATE FUNCTION role_update(
  IN id "role".role_id % TYPE,
  IN name   "role".role_name % TYPE,
  IN user_id_list "user".user_id % TYPE[],
  IN permission_id_list  INT[]
)

我因为这样得到了语法错误,但我不想复制任何列类型,所以我想使用"user".user_id % TYPE而不是简单的INT,因为这样可以更容易地修改任何列类型。
2个回答

7
如官方手册 所述

通过在表名称后跟上 . 列名称 % TYPE 的方式引用列的类型。有时使用此特性可以使函数独立于对表定义的更改。

RETURNS 子句中也可以使用相同的功能。

但是,没有简单的方法从引用的列导出数组类型,至少我不知道有这样的方法。

关于“稍后修改任何列类型”:

您应该意识到这种语法仅是一种从表列派生类型的语法便利性吗?一旦创建,就完全没有任何链接与表或列相关联了。

它有助于保持整个创建脚本同步。但它不能帮助数据库中现有对象的后续更改。

有关dba.SE上的相关答案:


  • 你知道这种语法只是从表列派生类型的一种语法便利吗? - 是的,我知道。
- inf3rno

5

在PostgreSQL中,使用引用类型作为函数参数没有任何意义,因为它会被转换成实际类型并存储为实际类型。很抱歉,PostgreSQL不支持这种功能。但是,在函数内部使用引用类型的情况不同,在会话的第一次执行时检测到实际类型。


2
在函数的内部变量中使用“%TYPE”是完全有效的。 - Cromax
“没有意义” - 它确实有意义,因为它有助于可读性,就像 %TYPE 一样。 - Meglio
@Meglio - 在这种情况下,我不确定。这可能是一个陷阱,因为源对象上没有真正的持久依赖关系。在这种情况下(函数参数),语法与Oracle相同,但行为不同。这种情况非常特殊,我不知道这个特性是好还是坏。 - Pavel Stehule

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接