gpt4 book ai didi

postgresql - Postgres PL/pgSQL,可以声明匿名自定义类型吗?

转载 作者:行者123 更新时间:2023-11-29 12:11:01 24 4
gpt4 key购买 nike

使用 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 来决定返回哪个数字。如果 input1 小于 input2,则返回 50,如果 input2 小于或等于 input2,则返回99.

我知道我什至没有使用我的类型的 a2 字符字段(所以在这种情况下我也可以只使用数字数组)并且可能有很多很多根据输入值返回两个固定数字的更好解决方案,但如果我能够在 PL/pgSQL 中使用匿名自定义类型(就像在 Oracle 或 DB2 过程中那样),或者是否有任何类似的替代方案,我最初的问题仍然存在.

最佳答案

您不能在 Postgres 中创建具有本地可见性的类型。不支持此功能。 Postgres 仅支持全局自定义复合类型。

参见 CREATE TYPE医生。此语句不能用于 plpgsql block 的 DECLARE 部分。

关于postgresql - Postgres PL/pgSQL,可以声明匿名自定义类型吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34871609/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com