调用函数将 JSONB 作为参数传递 - Postgres
Calling function passing JSONB as parameter - 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 变量中插入多个 records/pass 多行
您实际上不必以 jsonb
的身份发送和接收。您可以作为文本发送并在函数内转换为 jsonb
对象。
CREATE OR REPLACE FUNCTION upd.insert_testdata(spec text)
RETURNS void LANGUAGE 'plpgsql'
AS $BODY$
declare
your_json jsonb;
begin
your_json := spec::jsonb;
然后您将 jsonb
作为文本发送。
select upd.insert_testdata(
'{
"to_cd":"NFG",
"empid":"test",
"code":123,
"booking_status":"Y",
"availability":"MTWTFSS"
}'
)
不要传递 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% 确定键名始终与 table 中的列名匹配,则可以使用 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);
下面是我写的函数
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 变量中插入多个 records/pass 多行
您实际上不必以 jsonb
的身份发送和接收。您可以作为文本发送并在函数内转换为 jsonb
对象。
CREATE OR REPLACE FUNCTION upd.insert_testdata(spec text)
RETURNS void LANGUAGE 'plpgsql'
AS $BODY$
declare
your_json jsonb;
begin
your_json := spec::jsonb;
然后您将 jsonb
作为文本发送。
select upd.insert_testdata(
'{
"to_cd":"NFG",
"empid":"test",
"code":123,
"booking_status":"Y",
"availability":"MTWTFSS"
}'
)
不要传递 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% 确定键名始终与 table 中的列名匹配,则可以使用 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);