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,但它并没有更好.我认为问题在于传入的值,所以不确定修改循环是否会做任何事情.
参数的类型应该是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数组,请参阅此答案.