¡¶Êý¾Ý¿âϵͳԭÀí¡·ÊµÑ鱨¸æ ÏÂÔØ±¾ÎÄ

ÄÚÈÝ·¢²¼¸üÐÂʱ¼ä : 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£©¿´³ö£¬¼Ç¼¶ÔÓÚÓαê½á¹û¼Ç¼µÄ´¦ÀíºÜ·½±ã£¬Í¨¹ý¼Ç¼±äÁ¿¿ÉÒÔÖ±½Ó·ÃÎʼǼµÄÿ¸öÊôÐÔ£¬¶øÎÞÐèΪ¼Ç¼µÄÿ¸öÊôÐÔ¶¨ÒåÏàÓ¦µÄ±äÁ¿¡£