DECLARE
disbursement_no int;
BEGIN
select (case when DV_NO is null 0 else max(to_number(right(DV_NO,6),'999999')) end)+1 into disbursement_no
from CD_T_DV_HDR
where extract(year from DATE_DV) = extract(year from current_date);
END;
Я думаю, что это в значительной степени сделает это. Я уверен, что есть и другие способы, в postgresql может быть эквивалент isnull (), но я не знаю, есть ли он. Очевидно, вам понадобится остальная часть функции, в том числе возврат и т. Д.
Стоит также отметить, что текстовый тип в PostgreSQL намного умнее, чем его эквивалент в других системах, и varchar обычно можно заменить текстом, если нет особых соображений.
Кроме того, если это частый запрос, вы можете создать индекс для предложения where:
create index my_year_index on CD_T_DV_HDR (extract(year from DATE_DV));
Это одна из действительно приятных возможностей PostgreSQL: создание индексов на основе выражений.