2014-11-27 3 views
0

У меня есть набор сущностей в таблицу, как это:укорочение 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. Я предполагаю, что я слишком многому обижен. Может ли кто-нибудь предложить, как упростить и сократить?

ответ

3

Это один простой оператор выбора, не PL/SQL не требуется:

select multiplier 
from multipliers 
where input between min_period and max_period; 
+0

Дело в том, что будет несколько операторов случае, до шести или семи лет - я не хочу использовать несколько операторов выбора –

+0

@Andrew С небольшим сбоем, что вы не можете использовать 'между 'здесь из-за полуоткрытого интервала, не могли бы вы немного разобраться, что не так с этим решением? Он будет напрямую возвращать «правильный» множитель, независимо от количества случаев в вашей «таблице сущностей». –

+0

Вы правы. Я, конечно, эйджит. Извиняюсь. Голова сейчас просто жареная. Конечно, это способ сделать это. –

0
declare 
    l_mult multipliers.entity_name%type; 
    input_period multipliers.max_period%type; 
begin 
    select multiplier into l_mult 
    from multipliers 
    where input_period >= min_period 
    and input_period < max_period; 

    -- return l_mult; 
exception 
    when no_data_found then 
     -- do something 
    when others then 
     -- do something else 
end;  
Смежные вопросы