我正在嘗試創建一個迭代 jsonb 陣列的函式,但我遇到了一個完全阻止我的奇怪錯誤訊息。這是我的測驗用例。
CREATE OR REPLACE
FUNCTION public.questiontemplate_match_customattributes(
id int,
customattributes jsonb
)
RETURNS boolean LANGUAGE plpgsql AS
$function$
DECLARE
group_attrs JSONB;
attr JSONB;
attr_name TEXT;
BEGIN
RAISE NOTICE 'Test 1';
FOR attr IN (select * from jsonb_to_recordset(customattributes) AS x("name" TEXT, "value" TEXT)) LOOP
RAISE NOTICE 'Test 2';
END LOOP;
RETURN FALSE;
END $function$;
SELECT
questiontemplate_match_customattributes(
12,
jsonb_build_array(
jsonb_build_object('name', 'pack', 'value', 'box'),
jsonb_build_object('name', 'brand', 'value', 'pepsi')
)
)
當我運行上面的查詢時,我收到以下訊息
SQL 錯誤 [22P02]:錯誤:json 型別的無效輸入語法詳細資訊:令牌“pack”無效。其中:JSON 資料,第 1 行:在 FOR over SELECT 行處打包 PL/pgSQL 函式 questiontemplate_match_customattributes(integer,jsonb) 第 8 行
并且只Test 1出現在我的輸出中但是當我運行時
SELECT * FROM jsonb_to_recordset(
jsonb_build_array(
jsonb_build_object('name', 'pack', 'value', 'box'),
jsonb_build_object('name', 'brand', 'value', 'pepsi')
)
) AS x("name" TEXT, "value" TEXT)
我得到了正確的記錄集。有什么建議嗎?
版本:Postgres 12.5
環境:碼頭工人
uj5u.com熱心網友回復:
將變數的型別attr從JSONBto更改為record或 - 如果您需要它作為 JSONB - 更改回圈查詢以生成 JSONB,如下所示。
FOR attr IN select to_jsonb(x) from jsonb_to_recordset(customattributes) AS x("name" TEXT, "value" TEXT) LOOP
RAISE NOTICE '%', attr;
END LOOP;
順便說一句,回圈查詢可以簡化為
FOR attr IN select jsonb_array_elements(customattributes) LOOP
RAISE NOTICE '%', attr;
END LOOP;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/410432.html
標籤:
