Как назначить переменную JSON с row_to_json в PostgreSQL - PullRequest
0 голосов
/ 06 октября 2018

Я пытаюсь создать анонимную функцию в PostgreSQL для создания фиктивных данных для приложения. Я хотел бы сначала выполнить запрос SELECT (чтобы получить данные из произвольного чартера) и преобразовать все строки в JSON сrow_to_json, затем присвойте результат переменной типа JSON.

Мне нужна эта чартерная информация, чтобы я мог добавить ее в таблицу заказов.

Это не работает, я думаю, что я не знаю, как ранее связать результат выбора с переменной.создано;Я получаю сообщение об ошибке, что charterData имеет значение null, и я хотел бы знать, как мне этого добиться ..

Это анонимный функционал в SQL:

BEGIN;
    DO $$
    DECLARE charterData JSON;
    DECLARE bookingId INTEGER;
    BEGIN
        SELECT row_to_json(t) INTO charterData FROM (select charter_id, name from charters) t WHERE charter_id = 1;
        INSERT INTO bookings (charter, yacht, email, date, guests, total, start_hour, end_hour, hotel, arrival_date) values (charterData, '{"test":1}', 'a', '12/10/1995', 8, '78', '123', '123', '123', '123')
        RETURNING booking_id INTO bookingId;
    END $$;
COMMIT;

Чартер таблицы:

                                        Table "public.charters"
   Column    |       Type        | Collation | Nullable |                   Default                    
-------------+-------------------+-----------+----------+----------------------------------------------
 charter_id  | integer           |           | not null | nextval('charters_charter_id_seq'::regclass)
 name        | character varying |           | not null | 
 description | character varying |           | not null | 
 sail_hours  | integer           |           | not null | 
Indexes:
    "charters_pk" PRIMARY KEY, btree (charter_id)
    "name_charter" UNIQUE CONSTRAINT, btree (name)
Referenced by:
    TABLE "bookings" CONSTRAINT "charters_bookings_fk" FOREIGN KEY (charter) REFERENCES charters(name) ON DELETE CASCADE
    TABLE "pricing" CONSTRAINT "charters_pricing_fk" FOREIGN KEY (charter_id) REFERENCES charters(charter_id) ON DELETE CASCADE

Стол заказов:

                                         Table "public.bookings"
     Column     |       Type        | Collation | Nullable |                   Default                    
----------------+-------------------+-----------+----------+----------------------------------------------
 booking_id     | integer           |           | not null | nextval('bookings_booking_id_seq'::regclass)
 charter        | json              |           | not null | 
 yacht          | json              |           | not null | 
 email          | character varying |           | not null | 
 date           | date              |           | not null | 
 guests         | integer           |           | not null | 
 total          | numeric           |           | not null | 
 start_hour     | character varying |           | not null | 
 end_hour       | character varying |           | not null | 
 alcohol        | character varying |           |          | 
 transportation | character varying |           |          | 
 others         | character varying |           |          | 
 arrival_date   | character varying |           |          | 
 hotel          | character varying |           |          | 
Indexes:
    "bookings_pk" PRIMARY KEY, btree (booking_id)
    "end_hour" UNIQUE CONSTRAINT, btree (end_hour)
    "start_hour" UNIQUE CONSTRAINT, btree (start_hour)
Foreign-key constraints:
    "charters_bookings_fk" FOREIGN KEY (charter) REFERENCES charters(name) ON DELETE CASCADE
    "yachts_bookings_fk" FOREIGN KEY (yacht) REFERENCES yachts(name) ON DELETE CASCADE
Referenced by:
    TABLE "bookings_extra" CONSTRAINT "bookings_extra_fk" FOREIGN KEY (booking_id) REFERENCES bookings(booking_id) ON DELETE CASCADE

1 Ответ

0 голосов
/ 06 октября 2018

Хорошо, я нашел ответ ... Было довольно глупо, но, возможно, этот ответ кому-нибудь поможет

BEGIN;
    DO $$
    DECLARE charter JSON;
    DECLARE bookingId INTEGER;
    BEGIN
        charter := (SELECT row_to_json(t) FROM (SELECT charter_id, name FROM charters) t WHERE charter_id = $1);
        INSERT INTO bookings
            (charter, yacht, email, date, passengers, total, start_hour, end_hour, hotel, arrival_date, charter_price)
        values (charter, '{"test":1}', 'a', '12/10/1995', 8, '78', '123', '123', '123', '123', '132')
            RETURNING booking_id INTO bookingId;
    END $$;
COMMIT;
...