Я пытаюсь сделать doctor_availability, как в приведенном ниже примере, атрибут, который будет массивом:
[
[
["2020-03-10 09:00:00+00","2020-03-10 10:00:00+00"], False
],
...
...
]
Вот так выглядит таблица доктора:
CREATE TABLE IF NOT EXISTS doctor
(
doctor_id SERIAL PRIMARY KEY NOT NULL,
doctor_primary BOOLEAN DEFAULT FALSE,
doctor_address TEXT NOT NULL,
doctor_first_name varchar(100) NOT NULL,
doctor_last_name varchar(100) NOT NULL,
doctor_phone_number TEXT NOT NULL,
doctor_office INT NOT NULL REFERENCES office (office_id),
doctor_spec TEXT NOT NULL,
doctor_availability availability[],
doctor_user SERIAL NOT NULL REFERENCES db_user (user_id) ON UPDATE CASCADE ON DELETE CASCADE,
doctor_diagnosis INT,
doctor_test INT
);
Атрибут doctor_availability - это доступность типа, которая определяется как:
CREATE TYPE availability AS
(
available_time TSTZRANGE,
taken BOOLEAN
);
У меня есть триггер, когда новый доктор - doctor_availability для нового доктора:
CREATE TRIGGER insert_doctor_availability
BEFORE INSERT
ON doctor
FOR EACH ROW
WHEN (NEW.doctor_availability IS NULL)
EXECUTE PROCEDURE insert_availability();
Функция insert_availability определяется как :
CREATE FUNCTION insert_availability() RETURNS trigger AS
$$
BEGIN
NEW.doctor_availability := array(select tstzrange(a, a + '1 hour'::interval, '[]')
from generate_series
(
timestamp '2020-03-10 09:00:00',
CURRENT_TIMESTAMP + '2 YEAR',
interval '1 HOUR'
) AS a (dt)
WHERE MOD(EXTRACT(DOW FROM dt)::INTEGER, 6) != 0
AND dt::TIME >= '09:00:00'
AND dt::TIME < '17:00:00'::TIME);
RETURN NEW;
END
$$ LANGUAGE plpgsql;
Когда я пытаюсь добавить нового доктора, выдается ошибка:
Вставить запрос:
INSERT INTO doctor(doctor_address, doctor_first_name, doctor_last_name, doctor_phone_number, doctor_office, doctor_spec,
doctor_user)
VALUES ('4444 Test St. Test, TX 90000', 'Test', 'Test_last', '992000000', 1, 'ENT', 1);
[22P02] ERROR: malformed record literal: "["2020-03-10 09:00:00+00","2020-03-10 10:00:00+00"]" Detail: Missing left parenthesis. Where: PL/pgSQL function insert_availability() line 3 at assignment