PL/pgSQL - %TYPE 和 ARRAY

inf*_*rno 4 postgresql plpgsql

是否可以同时使用 %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[]
)
Run Code Online (Sandbox Code Playgroud)

我因此遇到语法错误,但我不想复制任何列类型,所以我想使用"user".user_id % TYPE而不是仅仅INT因为这样以后修改任何列类型会更容易。

Erw*_*ter 5

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

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

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

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

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

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

dba.SE 上的相关答案:


Pav*_*ule 5

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

  • 在函数的内部变量中使用 `%TYPE` 是完全有效的。 (2认同)