问题:Postgres 对象数组错误error: could not determine polymorphic type because input has type "unknown"

我一直在尝试遍历 postgres 中的一组对象。但是,我反复收到错误error: could not determine polymorphic type because input has type "unknown"。我认为这与我传递给看起来像这样的函数的值有关。

[
  {
    "number": 1,
    "letter": "a"
  },
  {
    "number": 2,
    "letter": "b"
  }
]

功能如下。我已经制作了 ANYARRAY 类型,我认为它应该完全按照名称所暗示的那样做。我不介意有更具体的选项可用。

CREATE OR REPLACE FUNCTION "CheckArrayOfObjects" (
  "@arrayOfObjects"           ANYARRAY
)
RETURNS void AS
$func$
DECLARE "e" JSONB;
BEGIN
  FOR "e" IN json_array_elements("@arrayOfObjects")
  LOOP
    RAISE NOTICE 'Checking Item %', "e";
  END LOOP;
END;
$func$ LANGUAGE PLPGSQL;

我也尝试过 FOREACH,但效果并不好。我认为问题在于传入的值,所以现在还不确定修改循环是否会做任何事情。

解答

参数的类型应该是JSONB(或JSON):

CREATE OR REPLACE FUNCTION "CheckArrayOfObjects" ("@arrayOfObjects" JSONB)
RETURNS void AS
$func$
DECLARE "e" JSONB;
BEGIN
  FOR "e" IN SELECT jsonb_array_elements("@arrayOfObjects")
  LOOP
    RAISE NOTICE 'Checking Item %', "e";
  END LOOP;
END;
$func$ LANGUAGE PLPGSQL;

示例使用:

SELECT "CheckArrayOfObjects"(
'[
  {
    "number": 1,
    "letter": "a"
  },
  {
    "number": 2,
    "letter": "b"
  }
]')

NOTICE:  Checking Item {"letter": "a", "number": 1}
NOTICE:  Checking Item {"letter": "b", "number": 2}

更新

在哪里使用 SQL 记录通知?

取决于服务器配置参数log_min_messages (enum)

如果不是数组,ANYARRAY 的类型是什么?

它适用于 Postgres 数组类型,例如text[], int[] 等 Json 数组不是 Postgres 数组,请参见 this answer.

Logo

PostgreSQL社区为您提供最前沿的新闻资讯和知识内容

更多推荐