postgresql - 调用函数传递 JSONB 作为参数 - Postgres
问题描述
下面是我写的函数
CREATE OR REPLACE FUNCTION upd.insert_testdata(spec jsonb[])
RETURNS void
LANGUAGE 'plpgsql' AS $BODY$
BEGIN
--Consider all columns in specialist table as character varying and code column as integer.
insert into upd.specialist (to_cd, empid, code, booking_status, availability)
select j.spec->>'to_cd',
j.spec->>'empid',
j.spec->>'code',
j.spec->>'booking_status',
j.spec->>'availability'
from jsonb_populate_record(spec) j;
END;
$BODY$;
我正在尝试通过以下命令调用函数
SELECT upd.insert_testdata(
'{
"to_cd":"NFG",
"empid":"test",
"code":123,
"booking_status":"Y",
"availability":"MTWTFSS"
}'::jsonb[]
);
但是我收到错误,因为格式错误的数组文字
详细信息:意外的数组元素。 SQL状态:22P02
另外我想知道如何在单个 json 变量中插入多条记录/传递多行
解决方案
不要传递 json 值的数组,传递 json 数组:
CREATE OR REPLACE FUNCTION upd.insert_testdata( spec jsonb)
RETURNS void
LANGUAGE plpgsql
AS $BODY$
begin
--Consider all columns in specialist table as character varying and code column as integer.
insert into upd.specialist (to_cd, empid, code, booking_status, availability)
select j.spec->>'to_cd',
j.spec->>'empid',
(j.spec->>'code')::int,
j.spec->>'booking_status',
j.spec->>'availability'
from jsonb_array_elements(spec) as j(spec);
end;
$BODY$;
如果您不想手动列出所有键,并且您 100% 确定键名始终与表中的列名匹配,则可以使用jsonb_populate_record
CREATE OR REPLACE FUNCTION upd.insert_testdata( spec jsonb)
RETURNS void
LANGUAGE plpgsql
AS $BODY$
begin
--Consider all columns in specialist table as character varying and code column as integer.
insert into upd.specialist (to_cd, empid, code, booking_status, availability)
select (jsonb_populate_record(null::specialist, j.spec)).*
from jsonb_array_elements(spec) as j(spec);
end;
$BODY$;
然后像这样使用它:
select upd.insert_testdata('[
{"to_cd":"NFG",
"empid":"test",
"code":123,
"booking_status": "Y",
"availability":"MTWTFSS"}
]'::jsonb);
如果你想传递多个元素,你可以像这样使用它:
select upd.insert_testdata('[
{"to_cd":"NFG",
"empid":"test",
"code":123,
"booking_status": "Y",
"availability":"MTWTFSS"},
{"to_cd":"CFG",
"empid":"test2",
"code": 456,
"booking_status": "N",
"availability":"MT"}
]'::jsonb);
推荐阅读
- c# - 循环访问 JObject 并替换属性值
- spring-data-elasticsearch - spring-data-elasticsearch中的DBRef相当于什么
- python - 如何在 pandas 列中处理不同的日期格式?
- youtube - Youtube m3u8 url 无法播放视频 js 和 hls
- r - devtools::check - 系统命令“Rcmd.exe”失败,退出 status:1,stdout + stderr:
- javascript - 笑话:SyntaxError:意外的令牌导出
- node.js - Nodejs Expressjs Mongodb Javascript 单元测试使用 Mocha Chai Sinon 进行随机 Nodejs 项目
- javascript - CORS 策略已阻止从源“http://localhost:3000”访问 XMLHttpRequest
- sql - 显示两列,但其中一列与 SQL Server 中另一个表中的另一列联合
- decidable - 具有有限状态的给定 TM 是否可判定?