Как устранить ошибку с daterange в функции psql?

#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, если они отличаются друг от друга.