#postgresql
#postgresql
Вопрос:
У меня есть функция psql, как указано ниже :
create or replace function close_issue(issue varchar(128), device bigint, issue_daterange daterange) returns integer as $$
declare curr_daterange daterange;
begin
if lower_inf(issue_daterange) then
raise exception 'Issue date % cannot have lower bound infinity when closing issues', issue_daterange
USING HINT = 'issue_date should have a date range with interval, [date, date)';
elsif upper_inf(issue_daterange) then
raise exception 'Issue date % should not have upper bound infinity when closing issues', issue_daterange
USING HINT = 'issue_date should have a date range with interval, [date, date)';
end if;
if EXISTS(select * from issue_device_relation where issue_id = issue and device_id = device) then
select distinct on (occurrence_id) occurrence_id, issue_date into curr_daterange from issue_device_relation where issue_id = issue and
device_id = device order by occurrence_id desc;
raise notice 'date range %', curr_daterange;
if not (lower_inf(curr_daterange) and upper_inf(curr_daterange)) then --closed interval
raise notice 'issue_id % on device_id % is already closed', issue, device;
return 1;
elsif not (issue_daterange <@ curr_daterange) then -- issue cannot be closed in history
raise notice 'issue_id % cannot be closed on device_id % with historical date range %', issue, device, issue_daterange;
return 2;
else
raise notice 'issue is closed.'; --update date range here
return 3;
end if;
else
raise notice 'issue id and device id not found';
return 4;
end if;
end;
$$
LANGUAGE plpgsql SECURITY definer;
Когда я вызываю указанную выше функцию, используя следующий запрос:
select close_issue('test_issue', 12345, daterange('2020-09-01'::date, '2020-10-01'::date, '[)'))
Это выдает мне следующую ошибку:
Ошибка SQL [22P02]: ОШИБКА: неверно сформированный литерал диапазона: «1» Деталь: отсутствует левая скобка или скобка.
У меня есть подозрение, что это может быть связано с диапазоном дат, но я не могу понять, что именно не так.
Комментарии:
1. Было бы неплохо указать номер строки для ошибки. Я подозреваю, что это происходит от
select distinct on (occurrence_id) occurrence_id, issue_date into curr_daterange
.current_daterange
объявляется как daterange иselect into
пытается ввестиoccurrence_id
в него значение (угадывание 1). Этоselect into
приведет к сбою, даже если оба значения, где даты в любом случае. Вам нужно будет передать ихcurrent_daterange
какdaterange
.2. Мне просто нужно передать issue_date в curr_daterange, а не вхождение. id
3. Во-первых, это
issue_date
daterange
? Если нет, то его нужно будет создать, прежде чем ему можно будет назначитьcurr_daterange
. Во-вторых,select distinct on (occurrence_id) occurrence_id, issue_date into curr_daterange
не будет работать, поскольку вы пытаетесь присвоить две колонки одной переменной. Для получения дополнительной информации смотрите Здесь4. issue_date — это диапазон данных, чего я пытаюсь добиться, так это получить issue_date максимального значения. да, кажется, присваивает два столбца одной переменной.
5. Затем избавьтесь
occurrence_id
от возвращаемых полей. Также вы не получаетеmax
появления. Вы получаетеdistinct on(occurrence_id)
. Это может привести к возвращению несколькихoccurrence_id
s, если они отличаются друг от друга.