2015-04-10 2 views
0

Я написал функцию, которая принимает два параметра, один из которых точка идентификатор цены, а вот в том, что таблицаPL SQL Oracle Функция :: Динамический диапазон Проверка

Create table PriceList 
(
PListID number(8), 
PriceListID number(8), 
Pl_Qty number(5), 
pl_Price number(4), 
CONSTRAINT PriceList_PK PRIMARY KEY (PListID) 
); 

Извините за ужасного расстояния. и здесь есть функция

CREATE OR REPLACE FUNCTION PriceOfItem  (pricepointid 
pricelist.plistid%TYPE, qty deliveryline.qtyshipped%TYPE) return 
varchar2 AS 

cursor pricepoint is 
select pricelistid, pl_price, pl_qty from 
pricelist where pricelist.pricelistid = pricepointid;  
pricescursor pricepoint%ROWTYPE;  
BEGIN 
open pricepoint; 
LOOP 
FETCH pricepoint into pricescursor;  
EXIT WHEN pricepoint%NOTFOUND; 

    IF qty = pricescursor.pl_qty THEN   
return pricescursor.pl_price; 
END IF; 

    END LOOP; 
close pricepoint; 

    END PriceOfItem;/

Теперь то, что я пытаюсь сделать с количеством отправленного в нем цена на основе диапазонов, предусмотренных, например: PriceList таблица имеет pricelistid и повторяют для этой конкретной записи которая связана с другой таблицей (из области видимости), и это, как она работает

Pricelistid Qty Price 
18888888,  0,  60 
18888888,  500,  55 
18888888,  1000, 50 

параметр кол-во, что я посылаю в функцию используется для сравнения с Qty в прейскуранте таблицы, теперь в реальности того, что Я хочу, чтобы отправленное количество было 0-499, а затем возвращало цену 60 или 500-599, затем 55, 1000 и более 50. Я сделал это для но по какой-то причине я просто совершенно озадачен.

ответ

0

Ваш оператор возврата в условии IF, и в некоторых случаях он не будет выполняться, что является причиной, а также вы возвращаетесь в цикле, вы должны выйти первым, если обрабатываются несколько записей. Я изменил код, проверьте следующее:

CREATE OR REPLACE FUNCTION PriceOfItem  (pricepointid 
pricelist.plistid%TYPE, qty deliveryline.qtyshipped%TYPE) return 
varchar2 AS 

cursor pricepoint is 
select pricelistid, pl_price, pl_qty from 
pricelist where pricelist.pricelistid = pricepointid;  
pricescursor pricepoint%ROWTYPE; 
vfound boolean := false;  
BEGIN 
open pricepoint; 
LOOP 
FETCH pricepoint into pricescursor;  
EXIT WHEN pricepoint%NOTFOUND; 

    IF qty = pricescursor.pl_qty THEN   
    vfound := true; 
    exit; 
    end if; 
END IF; 

    END LOOP; 
close pricepoint; 
if vfound then 
    return pricescursor.pl_price; 
else 
    -- if not found then also return something, its mandatory 
    return ''; 
end if; 
    END PriceOfItem; 
/
0

Вам, вероятно, не нужен курсор или хранимая процедура, только ваши две переменные связывания. Ниже приведен пример использования PriceListID = 18888888 и Pl_Qty of 499:

SELECT a.* 
    FROM PriceList a 
    WHERE a.PriceListID = 18888888 
    AND a.Pl_Qty = (SELECT MIN(Pl_Qty) 
         FROM PriceList 
         WHERE PriceListID = a.PriceListID 
         AND Pl_Qty >= 499) 

Update: оборачивать его функцию:

CREATE OR REPLACE FUNCTION PriceOfItem(
    p_pricepointid pricelist.plistid%TYPE, 
    p_qty   deliveryline.qtyshipped%TYPE) 
RETURN varchar2 
AS 

    v_result_price pricelist.pl_price%TYPE; 

BEGIN 

    SELECT a.Price 
     INTO v_result_price 
     FROM PriceList a 
     WHERE a.PriceListID = p_pricepointid 
     AND a.Pl_Qty = (SELECT MIN(Pl_Qty) 
          FROM PriceList 
          WHERE PriceListID = a.PriceListID 
          AND Pl_Qty >= p_qty); 

    RETURN v_result_price; 

END PriceOfItem; 
/