Postgres PL/pgSQL,可以声明匿名自定义类型吗?
Postgres PL/pgSQL, possible to declare anonymous custom types?
使用 DB2,我可以为我的用户定义函数声明匿名自定义类型(例如行类型或复合类型)- 请参见以下示例(尤其是最后一行):
DB2 示例:
CREATE OR REPLACE FUNCTION myFunction(IN input1 DECIMAL(5), IN input2 DECIMAL(5))
RETURNS DECIMAL(2)
READS SQL DATA
LANGUAGE SQL
NO EXTERNAL ACTION
NOT DETERMINISTIC
BEGIN
DECLARE TYPE customAnonymousType AS ROW(a1 DECIMAL(2), a2 DECIMAL(2), a3 DECIMAL(2));
/* do something fancy... */
我可以用 PL/pgSQL 做类似的事情吗?我知道我可以使用现有的行类型,也可以使用现有的用户定义类型 - 但我真的必须提前定义类型吗?
我也知道 RECORD 类型,但据我所知我不能在数组中使用它(而且它也不是一个定义明确的类型).
要求提供示例的评论,尽管它确实延长了问题的长度我尝试定义一个非常简单的示例(仍然适用于 DB2):
CREATE OR REPLACE FUNCTION myFunction(IN input1 DECIMAL(5), IN input2 DECIMAL(5))
RETURNS DECIMAL(2)
READS SQL DATA
LANGUAGE SQL
NO EXTERNAL ACTION
NOT DETERMINISTIC
BEGIN
DECLARE TYPE customAnonymousType AS ROW(a1 DECIMAL(2), a2 CHARACTER VARYING(50));
DECLARE TYPE customArray AS customAnonymousType ARRAY[INTEGER];
DECLARE myArray customArray;
SET myArray[input1] = (50, 'Product 1');
SET myArray[input2] = (99, 'Product 2');
RETURN myArray[ARRAY_FIRST(myArray)].a1;
END
这个函数当然只是一个伪函数(但我想这里的问题已经很长了)。实际上,它只是根据 input1 是否大于 input2 来决定 return 的数字。如果input1小于input2,则returns 50,如果input2更小或等于 input2 它将 return 99.
我知道我什至没有使用我的类型的 a2 字符字段(所以在这种情况下我也可以只使用数字数组)并且那里根据输入值,return 两个固定数字可能有很多很多更好的解决方案,但如果我能够在 PL/pgSQL 中使用匿名自定义类型(就像我在 Oracle 或DB2 过程)- 或者是否有任何类似的替代方案。
您不能在 Postgres 中创建具有本地可见性的类型。不支持此功能。 Postgres 仅支持全局自定义复合类型。
请参阅 CREATE TYPE 文档。此语句不能用于 plpgsql 块的 DECLARE
部分。
使用 DB2,我可以为我的用户定义函数声明匿名自定义类型(例如行类型或复合类型)- 请参见以下示例(尤其是最后一行):
DB2 示例:
CREATE OR REPLACE FUNCTION myFunction(IN input1 DECIMAL(5), IN input2 DECIMAL(5))
RETURNS DECIMAL(2)
READS SQL DATA
LANGUAGE SQL
NO EXTERNAL ACTION
NOT DETERMINISTIC
BEGIN
DECLARE TYPE customAnonymousType AS ROW(a1 DECIMAL(2), a2 DECIMAL(2), a3 DECIMAL(2));
/* do something fancy... */
我可以用 PL/pgSQL 做类似的事情吗?我知道我可以使用现有的行类型,也可以使用现有的用户定义类型 - 但我真的必须提前定义类型吗?
我也知道 RECORD 类型,但据我所知我不能在数组中使用它(而且它也不是一个定义明确的类型).
要求提供示例的评论,尽管它确实延长了问题的长度我尝试定义一个非常简单的示例(仍然适用于 DB2):
CREATE OR REPLACE FUNCTION myFunction(IN input1 DECIMAL(5), IN input2 DECIMAL(5))
RETURNS DECIMAL(2)
READS SQL DATA
LANGUAGE SQL
NO EXTERNAL ACTION
NOT DETERMINISTIC
BEGIN
DECLARE TYPE customAnonymousType AS ROW(a1 DECIMAL(2), a2 CHARACTER VARYING(50));
DECLARE TYPE customArray AS customAnonymousType ARRAY[INTEGER];
DECLARE myArray customArray;
SET myArray[input1] = (50, 'Product 1');
SET myArray[input2] = (99, 'Product 2');
RETURN myArray[ARRAY_FIRST(myArray)].a1;
END
这个函数当然只是一个伪函数(但我想这里的问题已经很长了)。实际上,它只是根据 input1 是否大于 input2 来决定 return 的数字。如果input1小于input2,则returns 50,如果input2更小或等于 input2 它将 return 99.
我知道我什至没有使用我的类型的 a2 字符字段(所以在这种情况下我也可以只使用数字数组)并且那里根据输入值,return 两个固定数字可能有很多很多更好的解决方案,但如果我能够在 PL/pgSQL 中使用匿名自定义类型(就像我在 Oracle 或DB2 过程)- 或者是否有任何类似的替代方案。
您不能在 Postgres 中创建具有本地可见性的类型。不支持此功能。 Postgres 仅支持全局自定义复合类型。
请参阅 CREATE TYPE 文档。此语句不能用于 plpgsql 块的 DECLARE
部分。