將 json 陣列的行插入表中的函式:
create table mytable(col1 text, col2 boolean, col3 boolean);
create function fun1(vja json[])
... as $$
begin
foreach v in array json_array_elements(vja)
loop
insert into mytable(col1, col2, col3)
values(v->'col1', v->'col2'::boolean, v->'col3'::boolean);
end loop;
end;
$$;
呼叫這個函式:
select fun1('[
{"col1": "[email protected]", "col2": false, "col3": true},
{"col1": "[email protected]", "col2": false, "col3": true}
]')
或這種形式:
select fun1('[
{"col1": "[email protected]", "col2": "false", "col3": "true"},
{"col1": "[email protected]", "col2": "false", "col3": "true"},
]')
或這種形式:
select fun1('[
{"col1": "[email protected]", "col2": "false", "col3": "true"},
{"col1": "[email protected]", "col2": "false", "col3": "true"},
]'::json[])
一直收到:
ERROR: malformed array literal: "[ {"col1": "turow1@af.com", "col2": "false", "col3": "true"}, {"col1": "xy2@af.com", "col2": "false", "col3": "true"}, ]" LINE 2: '[ ^ DETAIL: "[" must introduce explicitly-specified array dimensions. SQL state: 22P02 Character: 136
uj5u.com熱心網友回復:
甲JSON陣列(json)是不同從JSON值Postgres的陣列(json[])。
SELECT '[{"foo": "bar"}, {"foo1": "bar1"}]'::json; -- JSON array
對比:
SELECT '{"{\"foo\": \"bar\"}","{\"foo1\": \"bar1\"}"}'::json[] -- array of JSON
第一個是嵌套在單個 JSON 值中的陣列,第二個是 JSON 值的陣列。
JSON ( json[]) 的Postgres 陣列
您的(固定!)功能:
CREATE OR REPLACE FUNCTION fun1(vja json[])
RETURNS void
LANGUAGE plpgsql AS
$func$
DECLARE
v json;
BEGIN
FOREACH v IN ARRAY vja
LOOP
INSERT INTO mytable(col1, col2, col3)
VALUES(v ->> 'col1', (v ->> 'col2')::bool, (v ->> 'col3')::bool);
END LOOP;
END
$func$;
期待這樣的呼叫(注意json[]文字的所有轉義):
SELECT fun1('{"{\"col1\": \"[email protected]\", \"col2\": false, \"col3\": true}","{\"col1\": \"[email protected]\", \"col2\": false, \"col3\": true}"}'::json[]);
看:
- 如何將自定義型別陣列傳遞給 Postgres 函式
但單INSERT用json_populate_record()的程式節拍回圈的功能:
CREATE OR REPLACE PROCEDURE proc1(vja json[])
LANGUAGE sql AS
$proc$
INSERT INTO mytable -- target column list redundant in this particular case
SELECT r.*
FROM unnest(vja) v, json_populate_record(NULL::mytable, v) r
$proc$;
看:
- 什么時候使用存盤程序/用戶定義函式?
或者使用Postgres 14或更高版本中的標準 SQL 變體更簡單:
CREATE OR REPLACE PROCEDURE proc1(vja json[])
BEGIN ATOMIC
INSERT INTO mytable
SELECT r.*
FROM unnest(vja) v, json_populate_record(NULL::mytable, v) r;
END;
看:
- BEGIN ATOMIC ... END 在 PostgreSQL SQL 函式/程序中是什么意思?
稱呼 (!):
CALL proc1('{"{\"col1\": \"[email protected]\", \"col2\": false, \"col3\": true}","{\"col1\": \"[email protected]\", \"col2\": false, \"col3\": true}"}'::json[]);
db<>在這里擺弄
JSON 陣列 ( json)
通常,您希望像嘗試的那樣傳遞JSON 陣列。所以,現在json_populate_recordset():
CREATE OR REPLACE PROCEDURE proc2(vja json)
LANGUAGE sql AS
$proc$
INSERT INTO mytable
SELECT * FROM json_populate_recordset(NULL::mytable, vja);
$proc$;
或(Postgres 14):
CREATE OR REPLACE PROCEDURE proc2(vja json)
BEGIN ATOMIC
INSERT INTO mytable
SELECT * FROM json_populate_recordset(NULL::mytable, vja);
END;
呼叫(現在您可以使用最初測驗的值!):
CALL proc2('[
{"col1": "[email protected]", "col2": false, "col3": true},
{"col1": "[email protected]", "col2": false, "col3": true}
]');
db<>在這里擺弄
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/318492.html
標籤:sql 数组 json PostgreSQL 功能
上一篇:我怎樣才能做到這一點,以便在我的功能期間的任何時候,用戶都可以輸入“重置”并將他們帶回到我的功能的開頭?
下一篇:POST后的PHP重定向
