Postgres对象数组错误`错误:无法确定多态类型,因为输入类型为"unknown"

Bra*_*don 2 arrays postgresql json plpgsql jsonb

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

[
  {
    "number": 1,
    "letter": "a"
  },
  {
    "number": 2,
    "letter": "b"
  }
]
Run Code Online (Sandbox Code Playgroud)

功能如下.我已经制作了类型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;
Run Code Online (Sandbox Code Playgroud)

我也尝试过FOREACH,但它并没有更好.我认为问题在于传入的值,所以不确定修改循环是否会做任何事情.

kli*_*lin 5

参数的类型应该是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;
Run Code Online (Sandbox Code Playgroud)

使用示例:

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

NOTICE:  Checking Item {"letter": "a", "number": 1}
NOTICE:  Checking Item {"letter": "b", "number": 2}
Run Code Online (Sandbox Code Playgroud)

UPDATE

使用SQL记录通知的位置?

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

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

它适用于Postgres数组类型,例如text [],int []等.Json数组不是Postgres数组,请参阅此答案.