4

是否可以同时使用 %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因为以后修改任何列类型更容易。

4

2 回答 2

6

正如手册在这里解释的那样:

通过写入 table_name.column_name%TYPE 来引用列的类型。使用此功能有时可以帮助使函数独立于表定义的更改。

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

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

关于modifying any column type later
您是否知道这种类型的语法只是从表列中派生类型的一种语法便利?一旦创建,就没有任何链接到所涉及的表或列。

它有助于使整个创建脚本保持同步。但是 id 对以后更改数据库中的活动对象没有帮助。

dba.SE 上的相关答案:

于 2013-07-15T17:53:52.513 回答
5

在函数的参数中使用引用类型没有意义(在 PostgreSQL 中),因为它中间转换为实际类型,并且存储为实际类型。抱歉,PostgreSQL 不支持此功能 - 不同之处在于在函数内部使用引用类型,其中每次在会话中第一次执行时都会检测到实际类型。

于 2013-07-16T04:38:27.367 回答