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

时间:2016-01-19 08:17:48

标签: postgresql plpgsql

使用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程序中那样),或者如果有的话,我的原始问题仍然存在类似的替代方案。

1 个答案:

答案 0 :(得分:1)

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

请参阅CREATE TYPE doc。此语句不能在plpgsql块的DECLARE部分中使用。