Postgresql 调用将JSONB作为参数传递的函数-Postgres

Postgresql 调用将JSONB作为参数传递的函数-Postgres,postgresql,function,jsonb,postgresql-9.6,Postgresql,Function,Jsonb,Postgresql 9.6,下面是我写的函数 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.

下面是我写的函数

     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变量中插入多条记录/传递多行

您实际上不必作为
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%确定键名始终与表中的列名匹配,则可以使用
jsonb\u populate\u 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);
如果要传递多个元素,可以按如下方式使用:

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);

我的基本目的是在表中插入数据。这将如何将数据插入表中?错误:类型json的输入语法第2行:(“[^DETAIL:Expected:”,但找到“,”。我在您的JSON中的某个地方使用postgres v9.6,您没有使用
来分隔键和值。代码是的,它正在工作,最后一个问题不应该是jsonb_populate_记录更适合这种情况。。。???