1

在尝试创建此函数时,我不断收到语法错误,我无法弄清楚发生了什么。

代码:

CREATE OR REPLACE FUNCTION avadi_enterprise.create_doctor(_form json)
 RETURNS json
 LANGUAGE plpgsql
 COST 100
 VOLATILE   
AS $$
BEGIN
RETURN(
SELECT json_agg(results)
FROM(
    INSERT INTO avadi_enterprise.doctor(
        first_name,
        last_name,
        phone_number,
        email,
        office_open,
        office_close,
        shipping_route_id,
        sales_rep_id,
        user_login_id,
        status)
    VALUES 
        (_form::json ->> 'first_name', 
         _form::json ->> 'last_name',
         _form::json ->> 'phone_number', 
         _form::json ->> 'email', 
         CAST(_form::json ->> 'office_open' AS time), 
         CAST(_form::json ->> 'office_close' AS time), 
         CAST(_form::json ->> 'shipping_route_id' AS int), 
         CAST(_form::json ->> 'sales_rep_id' AS int), 
         CAST(_form::json ->> 'user_login_id' AS int), 
         _form::json ->> 'status')
    RETURNING
        *)
AS results)
END;
$$;

错误:

ERROR:  syntax error at or near "INTO"
LINE 18:  INSERT INTO avadi_enterprise.doctor(
                 ^
SQL state: 42601
Character: 310

我试过在后面加上一个分号,RETURNING *但它说我的括号不匹配。

Postgresql 是版本 12。

4

1 回答 1

1

您不能INSERTFROM子句中放置语句。改为使用WITH语句。该函数实际上是一个单一的查询,所以一个SQL函数会更合适:

CREATE OR REPLACE FUNCTION avadi_enterprise.create_doctor(_form json)
 RETURNS json
 LANGUAGE SQL
 COST 100
 VOLATILE

AS $$
    WITH results AS (
        INSERT INTO avadi_enterprise.doctor(
            first_name,
            last_name,
            phone_number,
            email,
            office_open,
            office_close,
            shipping_route_id,
            sales_rep_id,
            user_login_id,
            status)
        VALUES(
            _form::json ->> 'first_name', 
            _form::json ->> 'last_name',
            _form::json ->> 'phone_number', 
            _form::json ->> 'email', 
            CAST(_form::json ->> 'office_open' AS time), 
            CAST(_form::json ->> 'office_close' AS time), 
            CAST(_form::json ->> 'shipping_route_id' AS int), 
            CAST(_form::json ->> 'sales_rep_id' AS int), 
            CAST(_form::json ->> 'user_login_id' AS int), 
            _form::json ->> 'status')
        RETURNING *
    )
    SELECT json_agg(results) 
    FROM results
$$;
于 2020-04-11T18:27:34.997 回答