Синтаксическая ошибка при создании функции для возврата json Postgresql - PullRequest
1 голос
/ 11 апреля 2020

Я получаю синтаксическую ошибку при попытке создать эту функцию и не могу понять, что происходит.

Код:

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.

1 Ответ

1 голос
/ 11 апреля 2020

Нельзя поместить оператор INSERT в предложение FROM. Вместо этого используйте оператор 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
$$;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...