Преобразование T-SQL в PL / SQL - PullRequest
1 голос
/ 28 февраля 2012

Как я могу преобразовать следующую инструкцию T-SQL в PL / SQL

set @disbursement_no = (select isnull(max(convert(numeric, right(DV_NO, 6))), 0) + 1
            from CD_T_DV_HDR where year(DATE_DV) = year(getdate()))

Тип данных DV_NO - varchar, а Date_Dv - дата.

Я действительно новичок в PL / SQL, и мне трудно преобразовать мой оператор SQL в PL / SQL. Надеюсь, вы сможете мне помочь.

Ответы [ 3 ]

4 голосов
/ 28 февраля 2012

Это будет так:

DECLARE
    disbursement_no NUMBER;
BEGIN
    SELECT ( coalesce(MAX(To_number(Substr(dv_no, -6, 6))), 0) ) + 1
    INTO   disbursement_no
    FROM   cd_t_dv_hdr
    WHERE  To_char(date_dv, 'rrrr') = To_char(SYSDATE, 'rrrr');
END; 

Substr(dv_no, -6, 6) выбирает самые правые 6 символов. to_number преобразует строку в число. max выбирает максимальное число & coalesce проверяет, является ли результирующее число нулевым, и преобразует его в ноль.

0 голосов
/ 08 ноября 2012

Одна вещь относительно комментария @Sathya: в случае, если DATE_DV проиндексирован / используется в качестве столбца многораздельного ключа, Oracle не будет использовать индекс / раздел, потому что у вас есть функция для этого столбца. это приведет к полному сканированию всей таблицы, что будет плохо.

у вас есть 2 варианта: 1. изменить индекс / раздел, чтобы использовать функцию -bad idea в 90% случаев 2. Используйте между вами, где условие

SELECT ( coalesce(MAX(To_number(Substr(dv_no, -6, 6))), 0) ) + 1
INTO   disbursement_no
FROM   cd_t_dv_hdr
WHERE  date_dv between trunc(sysdate,'rrrr') and trunc(add_months(sysdate,12),'rrrr')
0 голосов
/ 28 февраля 2012
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: создание индексов на основе выражений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...