PL SQL Oracle 函数 :: 动态范围检查

PL SQL Oracle Function :: Dynamic Range Checking

我写了一个接受两个参数的函数,一个是价格点 ID,这里是 table

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 table 有一个 pricelistid,它针对链接到的特定记录重复另一个 table(超出范围),这就是它的工作原理

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

我发送到函数中的参数数量用于与价目表中的数量进行比较table,现在实际上我想要的是如果发送的数量是 0-499 那么 return 价格 60,或者如果 500 到 999 则为 55、1000 和更大的 50。我以前这样做过,但出于某种原因,我感到非常困惑。

您的 return 语句在 IF 条件下,在某些情况下它不会执行,这就是原因,而且您正在 return 循环中,如果正在处理多个记录,您必须先退出.我修改了代码,检查以下内容:

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; 
/

您可能不需要游标或存储过程,只需要两个绑定变量。这是一个使用 PriceListID = 18888888Pl_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) 

更新:将它包装成一个函数:

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;
/