错误的Postgres对象数组`error:无法确定多态类型,因为输入的类型为“未知”

时间:2018-08-20 19:46:07

标签: arrays json postgresql plpgsql jsonb

我一直试图遍历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,但并没有取得更好的结果。我认为问题出在传递的值上,因此不确定是否修改循环到目前为止是否可以做任何事情。

1 个答案:

答案 0 :(得分: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;

示例用法:

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.