列引用 "col_1" 不明确 plpgsql

column reference "col_1" is ambiguous plpgsql

我正在编写插入数据的 postgresql 函数,returns 成功插入了数据行。

代码如下

CREATE OR REPLACE FUNCTION public.fn_insert_test(json_data jsonb)
 returns  table(col_1 varchar(255),
                col_2 varchar(255),
                col_3 timestamp)
LANGUAGE plpgsql
AS $function$
declare
    --
begin
    with my_table as (
       with my_table1(my_json) as (
            values(
            json_data
            )
         )
        insert into "test"(col_1, col_2, col_3)
        select
            elem->>'val1', elem->>'val2', now()
        from
            my_table1 t, jsonb_array_elements(my_json->'_data') elem
        on conflict(col_1) do nothing
        returning *
    )
    select * from my_table;
end
$function$
;

select fn_insert_test('{"_data": [{"val1":"1", "val2":"1"}, {"val1":"2", "val2":"2"}]}');

出现以下错误

SQL Error [42702]: ERROR: column reference "col_1" is ambiguous
  Detail: It could refer to either a PL/pgSQL variable or a table column.
  Where: PL/pgSQL function fn_insert_test(jsonb) line 5 at SQL statement

[编辑]

这不是真正的问题所在。您的代码中存在很多问题: -> 如果你想return一个table,你必须使用'return query':http://www.postgresqltutorial.com/plpgsql-function-returns-a-table/ -> 我认为您不能像现在这样使用 WITH:https://www.postgresql.org/docs/current/queries-with.html

这是您的代码的功能版本。但我不太确定你想要什么:

CREATE OR REPLACE FUNCTION public.fn_insert_test(json_data jsonb)
 returns  table(col_1 varchar(255),
                col_2 varchar(255),
                col_3 timestamp)
LANGUAGE plpgsql AS
$$
declare
    --json_data jsonb := '{"_data": [{"val1":"1", "val2":"1"}, {"val1":"2", "val2":"2"}]}';
begin
    create temp table res (col_1 varchar (255), col_2 varchar (255), col_3 timestamp) on commit drop;

    with my_table1(my_json) as
    (
        values(
        json_data 
        )
    )
    , inserted as
    (
        insert into test(col_1, col_2, col_3)
            select
                elem->>'val1', elem->>'val2', now()
            from
                my_table1 t
                , jsonb_array_elements(json_data->'_data') elem
        on conflict do nothing
        returning *
    )
    insert into res
    select *
    from inserted;

    --raise notice '%', res_v;

    return query select * from res;
end
$$
;


select fn_insert_test('{"_data": [{"val1":"1", "val2":"1"}, {"val1":"2", "val2":"2"}]}');