Оценка пользовательских переменных в предложениях FROM и WHERE (команда Oracle DEFINE) - PullRequest
0 голосов
/ 17 января 2020

Я хочу использовать команду DEFINE в Oracle, чтобы определить строки и оценить их в предложениях SELECT, FROM и WHERE запроса.

Я хочу выбрать все кредиты, которые начались в январе 2018 года из таблиц credits_201801, credits_201802, credits_201803, credits_201804, credits_201805 и credits_201806. Другими словами, я хочу визуализировать поведение кредитов за январь 2018 года через 0, 1, 2, 3, 4 и 5 месяцев после их начала.

Например, я попробовал следующий код, чтобы проверить состояние Jan 2018 кредитов в Feb 2018:

DEFINE crop   = '2018-01-01';
DEFINE crop_n = ADD_MONTHS(&crop, 1); -- I want this to return 2018-01-01 plus `n = 1` months
DEFINE table_ = REPLACE(SUSBTR(&crop_n, 1, 7), '-'); -- I want this to return '201802'

SELECT
    PERSON_ID,
    BANK_ID,
    ACCOUNT_ID,
    START_DATE,
    MONTHS_BETWEEN(&crop_n, &crop) AS PERIOD,
    DAYS_OVERDUE
FROM
    'MDB.CREDITS_' || &table_ -- I want this to be evaluated as 'MDB.CREDITS_201802'
WHERE
    START_DATE >= &crop -- Credits that started on or after Jan 1 2018
    AND START_DATE < ADD_MONTHS(&crop, 1) -- Credits that started before Feb 1 2018

Пользовательские переменные хорошо работают в предложении SELECT, но кажется, что раздел FROM оценивает таблицу как литерал Строка, а не имя таблицы. Предложение WHERE также не работает.

Мне специально нужно использовать DEFINE, потому что это единственная известная мне команда, которая не требует от меня использования INSERT INTO (мне разрешено только выбирать) .

1 Ответ

1 голос
/ 17 января 2020

Дата пишется как date '2018-01-01', а не '2018-01-01'.

define ожидает одно значение, поэтому, если вы хотите, чтобы оно содержало пробелы, вам нужно будет заключить его в кавычки.

Чтобы построить строку в формате YYYYMM из даты, вам нужно использовать to_char(dateval,'YYYYMM').

Вам также нужно вычислить выражение table_, чтобы вы могли подставить буквенную строку в имя таблицы в последнем запросе.

define crop   = "date '2018-01-01'"
define crop_n = "add_months(&crop, 1)" -- I want this to return 2018-01-01 plus `n = 1` months

column table_ new_value table_

select to_char(&crop_n,'YYYYMM') as table_ from dual;

prompt crop   = &crop
prompt crop_n = &crop_n
prompt table_ = &table_

select person_id
     , bank_id
     , account_id
     , start_date
     , months_between(&crop_n, &crop) as period
     , days_overdue
from   MDB.CREDITS_&table_ -- I want this to be evaluated as 'MDB.CREDITS_201802'
where  start_date >= &crop -- Credits that started on or after Jan 1 2018
and    dcredfaperturacta < add_months(&crop, 1) -- Credits that started before Feb 1 2018
/

Параметр column x new_value y фиксирует последнее значение столбца x в переменной подстановки y. Первоначально он предназначен для заголовков страниц в отчетах, но очень удобен для написания сценариев. Вы можете скрыть вывод, используя set termout off. (set termout on для восстановления вывода терминала.)

Это сгенерирует и запустит

crop   = date '2018-01-01'
crop_n = add_months(date '2018-01-01', 1)
table_ = 201802

select person_id
     , bank_id
     , account_id
     , start_date
     , months_between(add_months(date '2018-01-01', 1), date '2018-01-01') as period
     , days_overdue
from   MDB.CREDITS_201802 -- I want this to be evaluated as 'MDB.CREDITS_201802'
where  start_date >= date '2018-01-01' -- Credits that started on or after Jan 1 2018
and    dcredfaperturacta < add_months(date '2018-01-01', 1) -- Credits that started before Feb 1 2018

Обратите внимание на следующие комментарии: это Oracle SQL* Plus синтаксис. Другие инструменты, такие как Toad, PL / SQL Developer и SQL Developer, в некоторой степени поддерживают его и используют другие методы. Не весь синтаксис SQL* Plus гарантированно работает во всех других инструментах. В PL / SQL Developer это работает только в командном окне. В SQL Developer вам нужно будет использовать «Запуск от имени» (F5), а не обычный «Выполнить» (Ctrl-Enter).

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