postgresql中ROWTYPE、TYPE、RECORD的区别?
Differences between ROWTYPE, TYPE, and RECORD in postgresql?
下面的声明有什么用,我们将在什么地方使用这些类型的声明?
myrow tablename%ROWTYPE;
myfield tablename.columnname%TYPE;
arow RECORD;
来自 PostgreSQL's documentation:
TYPE
提供变量或 table 列的数据类型。您可以使用它来声明将保存数据库值的变量。例如,假设您在 users
table 中有一个名为 user_id
的列。要声明与 users.user_id
具有相同数据类型的变量,您可以编写:user_id users.user_id%TYPE;
.
ROWTYPE
:复合类型的变量称为行变量(或row-type变量)。这样的变量可以保存整行 SELECT
或 FOR
查询结果,只要该查询的列集与变量的声明类型相匹配。使用通常的点表示法访问行值的各个字段,例如 rowvar.field
.
RECORD
:记录变量类似于row-type变量,但它们没有预定义的结构。它们采用在 SELECT
或 FOR
命令期间分配给它们的行的实际行结构。记录变量的子结构在每次分配给它时都会发生变化。这样做的结果是,在第一次分配记录变量之前,它没有子结构,任何访问其中字段的尝试都会导致 run-time 错误。
有关更多 in-depth 示例,请参阅 link。
下面的声明有什么用,我们将在什么地方使用这些类型的声明?
myrow tablename%ROWTYPE;
myfield tablename.columnname%TYPE;
arow RECORD;
来自 PostgreSQL's documentation:
TYPE
提供变量或 table 列的数据类型。您可以使用它来声明将保存数据库值的变量。例如,假设您在users
table 中有一个名为user_id
的列。要声明与users.user_id
具有相同数据类型的变量,您可以编写:user_id users.user_id%TYPE;
.ROWTYPE
:复合类型的变量称为行变量(或row-type变量)。这样的变量可以保存整行SELECT
或FOR
查询结果,只要该查询的列集与变量的声明类型相匹配。使用通常的点表示法访问行值的各个字段,例如rowvar.field
.RECORD
:记录变量类似于row-type变量,但它们没有预定义的结构。它们采用在SELECT
或FOR
命令期间分配给它们的行的实际行结构。记录变量的子结构在每次分配给它时都会发生变化。这样做的结果是,在第一次分配记录变量之前,它没有子结构,任何访问其中字段的尝试都会导致 run-time 错误。
有关更多 in-depth 示例,请参阅 link。