ÄÚÈÝ·¢²¼¸üÐÂʱ¼ä : 2025/9/17 8:38:26ÐÇÆÚÒ» ÏÂÃæÊÇÎÄÕµÄÈ«²¿ÄÚÈÝÇëÈÏÕæÔĶÁ¡£
¢Ù ¶¨ÒåÒ»¸ö×Ô¶¨Ò庯Êý£¬¸üв¢·µ»Ø¸ø¶¨¶©µ¥µÄ×ܼÛ
CREATE OR REPLACE FUNCTION FUN_CalTotalPrice4Order(p_okey INTEGER)
RETURN REAL AS
DECLARE
res REAL;
BEGIN UPDATE Orders SET totalprice =
(SELECT SUM(extendedprice * (1-discount)*(1+tax)) FROM Lineitem WHERE Orders.orderkey=Lineitem.orderkey AND
Lineitem.orderkey=p_okey);
SELECT SUM(toyalprice) INTO res FROM Orders; RETURN res; END;
¢Ú Ö´ÐÐ×Ô¶¨Ò庯ÊýFUN_CalTotalPrice4Order()
CALL Fun_CalTotalPrice4Order(5365);
£¨3£©Óоֲ¿±äÁ¿µÄ×Ô¶¨Ò庯Êý
¢Ù ¶¨ÒåÒ»¸ö×Ô¶¨Ò庯Êý£¬¼ÆËã²¢·µ»ØÄ³¸ö¹Ë¿ÍµÄËùÓж©µ¥µÄ×Ü¼Û CREATE OR REPLACE FUNCTION FUN_CalTotalPrice4Customer(p_custname CHAR(25)) RETURN REAL AS
DECLARE
L_custkey INTEGER; res REAL; BEGIN
SELECT cuskey INTO L_custkey FROM Customer
WHERE name = trim(p_custname);
RAISE NOTICE'cueskey is %',L_custkey; UPDATE Orders SET totalprice =
(SELECT SUM(extendedprice * (1-discount)*(1+tax)) FROM Lineitem
WHERE Orders.orderkey=Lineitem.orderkey AND
Orders.custkey=L_custkey);
SELECT SUM(toyalprice) INTO res FROM Orders;
WHERE custkey=L_custkey; RETURN res; END;
¢Ú Ö´ÐÐ×Ô¶¨Ò庯ÊýFUN_CalTotalPrice4Customer()
SELECT FUN_CalTotalPrice4Customer('½½ÔÓî')£»
£¨4£©ÓÐÊä³ö²ÎÊýµÄ×Ô¶¨Ò庯Êý
¢Ù ¶¨ÒåÒ»¸ö×Ô¶¨Ò庯Êý£¬¼ÆËã²¢·µ»ØÄ³¸ö¹Ë¿ÍµÄËùÓж©µ¥µÄ×Ü¼Û CREATE OR REPLACE FUNCTION FUN_CalTotalPrice4Customer2(p_custname
CHAR(25)£¬OUT p_totalprice REAL) RETURN REAL AS
DECLARE
L_custkey INTEGER; res REAL; BEGIN
SELECT cuskey INTO L_custkey FROM Customer
WHERE name = trim(p_custname);
RAISE NOTICE'cueskey is %',L_custkey; UPDATE Orders SET totalprice =
(SELECT SUM(extendedprice * (1-discount)*(1+tax)) FROM Lineitem
WHERE Orders.orderkey=Lineitem.orderkey AND
Orders.custkey=L_custkey);
SELECT SUM(toyalprice) INTO p_totalprice FROM Orders WHERE custkey=L_custkey; Res := p_totalprice; RETURN res; END;
¢Ú Ö´ÐÐ×Ô¶¨Ò庯ÊýFUN_CalTotalPrice4Customer2()¡£
SELECT FUN_CalTotalPrice4Customer2('½½ÔÓî'£¬null)£»
£¨5£©ÐÞ¸Ä×Ô¶¨Ò庯Êý
¢Ù ÐÞ¸Ä×Ô¶¨Ò庯ÊýÃûFUN_CalTotalPrice4Order ΪCalTotalPrice4Order
ALTER FUNCTIONFUN_CalTotalPrice4Order RENAME TO CalTotalPrice4Order ;
¢Ú ±àÒë×Ô¶¨Ò庯ÊýCalTotalPrice4Order
ALTER FUNCTIONFUN_CalTotalPrice4Order£¨okey INTEGER) COMPILE;
£¨6£©É¾³ý×Ô¶¨Ò庯Êý
ɾ³ý×Ô¶¨Ò庯ÊýCalTotalPrice4Order¡£ DROP FUNCTION CalTotalPrice4Order ; 6.3ÓαêʵÑé £¨1£©ÆÕͨÓαê
¢Ù ¶¨ÒåÒ»¸ö´æ´¢¹ý³Ì£¬ÓÃÓαêʵÏÖ¼ÆËãËùÓж©µ¥µÄ×ܼۡ£
CREATE OR REPLACE PROCEDURE ProcCursor_CalTotalPrice() AS
L_orderkey INTEGER; L_totalprice REAL;
CURSOR mycursor FOR
SELECT orderkey,totalprice FROM Orders; BEGIN
OPEN mycursor; LOOP
FETCH mycursor INTO L_orderkey,L_totalprice; IF mycursor%NOTFOUND THEN
EXIT; END IF;
SELECT SUM(extendedprice * (1-discount)*(1+tax))INTO
L_totalprice
FROM Lineitem
WHERE orderkey=L_orderkey ;
UPDATE Orders SET totalprice=L_totalprice WHERE orderkey=L_orderkey; END LOOP;
CLOSE mycuesor; END;
¢Ú Ö´Ðд洢¹ý³ÌProcCursor_CalTotalPrice()
CALL ProcCursor_CalTotalPrice()
£¨2£©REFCURSORÀàÐÍÓαê
¢Ù ¶¨ÒåÒ»¸ö´æ´¢¹ý³Ì£¬ÓÃÓαêʵÑ鼯ËãËùÓж©µ¥µÄ×ܼۡ£
CREATE OR REPLACE PROCEDURE ProcRefCursor_CalTotalPrice() AS
DECLARE
L_orderkey INTEGER; L_totalprice REAL; mycuesor REFCURSOR;
BEGIN
OPEN mycursor FOR SELECT orderkey,totalprice FROM Order; LOOP
FETCH mycursor INTO L_orderkey,L_totalprice; IF mycursor%NOTFOUND THEN EXIT; END IF;
SELECT SUM(extendedprice * (1-discount)*(1+tax))INTO L_totalprice FROM Lineitem
WHERE orderkey=L_orderkey ;
UPDATE Orders SET totalprice=L_totalprice WHERE orderkey=L_orderkey; END LOOP;
CLOSE mycursor;
END;
¢Ú Ö´Ðд洢¹ý³ÌProcRefCursor_CalTotalPrice() CALL ProcRefCursor_CalTotalPrice();
£¨3£©¼Ç¼±äÁ¿ÓëÓαê
¢Ù ¶¨ÒåÒ»¸ö´æ´¢¹ý³Ì£¬ÓÃÓαêʵÏÖ¼ÆËãËùÓж©µ¥µÄ×ܼۡ£
CREATE OR REPLACE PROCEDURE ProcRefCursor_CalTotalPrice() AS
DECLARE
L_totalprice REAL; res RECORD;
CURSOR mycuesor FOR
SELECT orderkey,totalprice FROM Orders; BEGIN
OPEN mycursor LOOP
FETCH mycursor INTO res;
IF mycursor%NOTFOUND THEN EXIT; END IF;
SELECT SUM(extendedprice * (1-discount)*(1+tax))INTO
L_totalprice
FROM Lineitem
WHERE orderkey=res.orderkey ;
UPDATE Orders SET totalprice=L_totalprice WHERE orderkey=res.orderkey; END LOOP;
CLOSE mycursor; END;
¢Ú Ö´Ðд洢¹ý³ÌProcRefCursor_CalTotalPrice() CALL ProcRefCursor_CalTotalPrice()£» £¨4£©´ø²ÎÊýµÄÓαê
¢Ù ¶¨ÒåÒ»¸ö´æ´¢¹ý³Ì£¬ÓÃÓαêʵÏÖ¼ÆËãÖ¸¶¨¹ú¼ÒµÄÓû§¶©µ¥µÄ×ܼۡ£ CREATE OR REPLACE PROCEDURE ProcRefCursor_CalTotalPrice(p_nationname
CHAR(20)) AS
DECLARE
L_totalprice REAL; res RECORD;
CURSOR mycuesor (c_nationname CHAR(20))FOR
SELECT O.orderkey,O.totalprice FROM Orders O,Customer O,Nation N
WHERE O.custkey=C.custkey AND c.nationkey=N.nationkey
AND
TRIM(N.name)=TRIM(c_nationname);
BEGIN
OPEN mycursor (p_nationname); LOOP
FETCH mycursor INTO res; IF mycursor%NOTFOUND THEN EXIT; END IF;
SELECT SUM(extendedprice * (1-discount)*(1+tax))INTO
L_totalprice
FROM Lineitem
WHERE orderkey=res.orderkey ;
UPDATE Orders SET totalprice=L_totalprice WHERE orderkey=res.orderkey; END LOOP;
CLOSE mycursor; END;
¢Ú Ö´Ðд洢¹ý³ÌProcParaCursor_CalTotalPrice()
CALL ProcParaCursor_CalTotalPrice('Öйú')£»
Î塢ʵÑé×ܽá
1.REFCURSORÀàÐ͵ÄÓα궨ÒåÒ»¸öÓαêÓ¦ÓñäÁ¿£¬Ö»ÊÇÔÙ´ò¿ª¸ÃÀàÐÍÓαêʱ²ÅÖ¸¶¨¾ßÌåµÄSELECTÓï¾äÒÔ±ã²úÉúÓαêµÄ½á¹û¼¯¡£Òò´Ë£¬REFCURSORʵÖÊÉÏÊǶ¨ÒåÁËÒ»¸ö¶¯Ì¬Óα꣬¿ÉÒÔÁé»î·½±ãµØ¸ù¾Ý³ÌÐòÔËÐÐʱÇé¿öµÄ±ä¶¯ÉèÖÃÓαêµÄSELECT²éѯ½á¹û¼¯¡£
2.´ÓÈÎÎñ£¨1£©¿ÉÒÔ¿´³ö£¬Óαê¿ÉÒÔʵÏÖ¶ÔÊý¾Ý¿â¼Ç¼ÖðÌõ´¦Àí£¬¶ø²»ÊÇÕû¸ö½á¹û¼¯Ò»Æð´¦Àí£¬Òò´Ë£¬ÓαêÊÇÔÚPL/SQLÓïÑÔÖÐʵÏÖ¹ý³Ì»¯´¦ÀíµÄºËÐŦÄÜ¡£ 3.´ÓÈÎÎñ£¨3£©¿´³ö£¬¼Ç¼¶ÔÓÚÓαê½á¹û¼Ç¼µÄ´¦ÀíºÜ·½±ã£¬Í¨¹ý¼Ç¼±äÁ¿¿ÉÒÔÖ±½Ó·ÃÎʼǼµÄÿ¸öÊôÐÔ£¬¶øÎÞÐèΪ¼Ç¼µÄÿ¸öÊôÐÔ¶¨ÒåÏàÓ¦µÄ±äÁ¿¡£