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 = 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)
更新:将它包装成一个函数:
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;
/
我写了一个接受两个参数的函数,一个是价格点 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 = 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)
更新:将它包装成一个函数:
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;
/