У меня есть набор сущностей в таблицу, как это:укорочение Oracle использование записи/курсора
PK Entity_Name Multiplier Min_Period Max_Period
01 No Mult 100 0 12
02 5% Mult 105 12 36
03 10% Mult 115 36 100
Я хочу, чтобы проверить вход против них и, в зависимости от того, какой период этот вход падает, верните мультипликатор. В настоящее время мой способ сделать это настолько запутан, и я уверен, что должен быть более простым способом. Мой текущий метод, чтобы создать запись и курсор:
TYPE r_multipliers IS RECORD (
entity_name VARCHAR2(100),
multiplier NUMBER(10),
min_period NUMBER(10),
max_period NUMBER(10)
);
TYPE t_multipliers IS TABLE OF r_multipliers
INDEX BY VARCHAR2(100);
my_rec r_multipliers;
l_multipliers t_multipliers;
CURSOR c_multipliers
IS
SELECT entity_name, multiplier, min_period, max_period
FROM multipliers;
Я тогда петля через курсор, чтобы сохранить каждый возможный объект:
FOR record IN c_multipliers
LOOP
my_rec.entity_name := record.entity_name;
my_rec.multiplier := record.multiplier;
my_rec.min_period := record.min_period;
my_rec.max_period := record.max_period;
l_multipliers(record.entity_name) := my_rec;
END LOOP;
Наконец, я использую эту логику в запросе, например, так:
SELECT CASE
WHEN [input] BETWEEN l_multipliers('No Mult').min_period AND l_multipliers('No Mult').max_period
THEN l_multipliers('No Mult').multiplier
WHEN [input] BETWEEN l_multipliers('5% Mult').min_period AND l_multipliers('5% Mult').max_period
THEN l_multipliers('5% Mult').multiplier
//etc (up to six or seven of these case statements)
Теперь есть так много кода используется здесь, чтобы сделать что-то, что, очевидно, очень просто. Я очень неопытен с PL/SQL. Я предполагаю, что я слишком многому обижен. Может ли кто-нибудь предложить, как упростить и сократить?
Дело в том, что будет несколько операторов случае, до шести или семи лет - я не хочу использовать несколько операторов выбора –
@Andrew С небольшим сбоем, что вы не можете использовать 'между 'здесь из-за полуоткрытого интервала, не могли бы вы немного разобраться, что не так с этим решением? Он будет напрямую возвращать «правильный» множитель, независимо от количества случаев в вашей «таблице сущностей». –
Вы правы. Я, конечно, эйджит. Извиняюсь. Голова сейчас просто жареная. Конечно, это способ сделать это. –