PL-SQL ´¥·¢Æ÷
´¥·¢Æ÷ÊÇÐí¶à¹ØÏµÊý¾Ý¿âϵͳ¶¼ÌṩµÄÒ»Ïî¼¼Êõ¡£ÔÚORACLEϵͳÀ´¥·¢Æ÷ÀàËÆ¹ý³ÌºÍº¯Êý£¬¶¼ÓÐÉùÃ÷£¬Ö´ÐкÍÒì³£´¦Àí¹ý³ÌµÄPL/SQL¿é¡£
¢Ù´¥·¢Æ÷ÀàÐÍ
´¥·¢Æ÷ÔÚÊý¾Ý¿âÀïÒÔ¶ÀÁ¢µÄ¶ÔÏó´æ´¢£¬ËüÓë´æ´¢¹ý³Ì²»Í¬µÄÊÇ£¬´æ´¢¹ý³Ìͨ¹ýÆäËü³ÌÐòÀ´Æô¶¯ÔËÐлòÖ±½ÓÆô¶¯ÔËÐУ¬¶ø´¥·¢Æ÷ÊÇÓÉÒ»¸öʼþÀ´Æô¶¯ÔËÐС£
¼´´¥·¢Æ÷Êǵ±Ä³¸öʼþ·¢Éúʱ×Ô¶¯µØÒþʽÔËÐС£²¢ÇÒ£¬´¥·¢Æ÷²»ÄܽÓÊÕ²ÎÊý¡£ËùÒÔÔËÐд¥·¢Æ÷¾Í½Ð´¥·¢»òµã»ð£¨firing£©¡£
ORACLEʼþÖ¸µÄÊǶÔÊý¾Ý¿âµÄ±í½øÐеÄINSERT¡¢UPDATE¼°DELETE²Ù×÷»ò¶ÔÊÓͼ½øÐÐÀàËÆµÄ²Ù×÷¡£
ORACLE½«´¥·¢Æ÷µÄ¹¦ÄÜÀ©Õ¹µ½ÁË´¥·¢ORACLE£¬ÈçÊý¾Ý¿âµÄÆô¶¯Óë¹Ø±ÕµÈ¡£
1.DML´¥·¢Æ÷
ORACLE¿ÉÒÔÔÚDMLÓï¾ä½øÐд¥·¢£¬¿ÉÒÔÔÚDML²Ù×÷ǰ»ò²Ù×÷ºó½øÐд¥·¢£¬²¢ÇÒ¿ÉÒÔ¶Ôÿ¸öÐлòÓï¾ä²Ù×÷ÉϽøÐд¥·¢¡£
2.Ìæ´ú´¥·¢Æ÷
ÓÉÓÚÔÚORACLEÀ²»ÄÜÖ±½Ó¶ÔÓÉÁ½¸öÒÔÉÏµÄ±í½¨Á¢µÄÊÓͼ½øÐвÙ×÷¡£ËùÒÔ¸ø³öÁËÌæ´ú´¥·¢Æ÷¡£
3.ϵͳ´¥·¢Æ÷
Ëü¿ÉÒÔÔÚORACLEÊý¾Ý¿âϵͳµÄʼþÖнøÐд¥·¢£¬ÈçORACLEϵͳµÄÆô¶¯Óë¹Ø±ÕµÈ¡£
¢Ú´¥·¢Æ÷×é³É:
´¥·¢Ê¼þ£º¼´ÔÚºÎÖÖÇé¿öÏ´¥·¢TRIGGER; ÀýÈ磺INSERT, UPDATE, DELETE¡£
´¥·¢Ê±¼ä£º¼´¸ÃTRIGGER ÊÇÔÚ´¥·¢Ê¼þ·¢Éú֮ǰ£¨BEFORE£©»¹ÊÇÖ®ºó(AFTER)´¥·¢£¬Ò²¾ÍÊÇ´¥·¢Ê¼þºÍ¸ÃTRIGGER µÄ²Ù×÷˳Ðò¡£
´¥·¢Æ÷±¾Éí£º¼´¸ÃTRIGGER ±»´¥·¢Ö®ºóµÄÄ¿µÄºÍÒâͼ£¬ÕýÊÇ´¥·¢Æ÷±¾ÉíÒª×öµÄÊÂÇé¡£ÀýÈ磺PL/SQL ¿é¡£
´¥·¢ÆµÂÊ£ºËµÃ÷´¥·¢Æ÷ÄÚ¶¨ÒåµÄ¶¯×÷±»Ö´ÐеĴÎÊý¡£¼´Óï¾ä¼¶(STATEMENT)´¥·¢Æ÷ºÍÐм¶(ROW)´¥·¢Æ÷¡£
Óï¾ä¼¶(STATEMENT)´¥·¢Æ÷£ºÊÇÖ¸µ±Ä³´¥·¢Ê¼þ·¢Éúʱ£¬¸Ã´¥·¢Æ÷Ö»Ö´ÐÐÒ»´Î£»
Ðм¶(ROW)´¥·¢Æ÷£ºÊÇÖ¸µ±Ä³´¥·¢Ê¼þ·¢Éúʱ£¬¶ÔÊܵ½¸Ã²Ù×÷Ó°ÏìµÄÿһÐÐÊý¾Ý£¬´¥·¢Æ÷¶¼µ¥¶ÀÖ´ÐÐÒ»´Î¡£
¢Û´´½¨´¥·¢Æ÷
´´½¨´¥·¢Æ÷µÄÒ»°ãÓï·¨ÊÇ:
CREATE[OR REPLACE] TRIGGER trigger_name
{BEFORE| AFTER}
{INSERT| DELETE| UPDATE[OF column [, column ¡]]}
ON[schema.] table_name
[FOR EACH ROW]
[WHEN condition]
begin
trigger_body;
end;
ÆäÖУº
BEFORE ºÍAFTERÖ¸³ö´¥·¢Æ÷µÄ´¥·¢Ê±Ðò·Ö±ðΪǰ´¥·¢ºÍºó´¥·¢·½Ê½£¬
ǰ´¥·¢ÊÇÔÚÖ´Ðд¥·¢Ê¼þ֮ǰ´¥·¢µ±Ç°Ëù´´½¨µÄ´¥·¢Æ÷£¬ºó´¥·¢ÊÇÔÚÖ´Ðд¥·¢Ê¼þÖ®ºó´¥·¢µ±Ç°Ëù´´½¨µÄ´¥·¢Æ÷¡£
FOR EACH ROWÑ¡Ïî˵Ã÷´¥·¢Æ÷ΪÐд¥·¢Æ÷¡£
Ðд¥·¢Æ÷ºÍÓï¾ä´¥·¢Æ÷µÄÇø±ð±íÏÖÔÚ£ºÐд¥·¢Æ÷ÒªÇóµ±Ò»¸öDMLÓï¾ä²Ù×öÓ°ÏìÊý¾Ý¿âÖеĶàÐÐÊý¾Ýʱ£¬¶ÔÓÚÆäÖеÄÿ¸öÊý¾ÝÐУ¬
Ö»ÒªËüÃÇ·ûºÏ´¥·¢Ô¼ÊøÌõ¼þ£¬¾ù¼¤»îÒ»´Î´¥·¢Æ÷£»
¶øÓï¾ä´¥·¢Æ÷½«Õû¸öÓï¾ä²Ù×÷×÷Ϊ´¥·¢Ê¼þ£¬µ±Ëü·ûºÏÔ¼ÊøÌõ¼þʱ£¬¼¤»îÒ»´Î´¥·¢Æ÷¡£
µ±Ê¡ÂÔFOR EACH ROW Ñ¡Ïîʱ£¬BEFOREºÍAFTER´¥·¢Æ÷ΪÓï¾ä´¥·¢Æ÷£¬¶øINSTEAD OF ´¥·¢Æ÷ÔòΪÐд¥·¢Æ÷¡£
WHEN ×Ó¾ä˵Ã÷´¥·¢Ô¼ÊøÌõ¼þ¡£Condition Ϊһ¸öÂß¼±í´ïʱ£¬ÆäÖбØÐë°üº¬Ïà¹ØÃû³Æ£¬¶ø²»Äܰüº¬²éѯÓï¾ä£¬Ò²²»Äܵ÷ÓÃPL/SQL º¯Êý¡£
WHEN ×Ó¾äÖ¸¶¨µÄ´¥·¢Ô¼ÊøÌõ¼þÖ»ÄÜÓÃÔÚBEFORE ºÍAFTER Ðд¥·¢Æ÷ÖУ¬²»ÄÜÓÃÔÚINSTEAD OF Ðд¥·¢Æ÷ºÍÆäËüÀàÐ͵Ĵ¥·¢Æ÷ÖС£
µ±Ò»¸ö»ù±í±»ÐÞ¸Ä( INSERT, UPDATE, DELETE)ʱҪִÐеĴ洢¹ý³Ì£¬Ö´ÐÐʱ¸ù¾ÝÆäËùÒÀ¸½µÄ»ù±í¸Ä¶¯¶ø×Ô¶¯´¥·¢£¬Òò´ËÓëÓ¦ÓóÌÐòÎ޹أ¬
ÓÃÊý¾Ý¿â´¥·¢Æ÷¿ÉÒÔ±£Ö¤Êý¾ÝµÄÒ»ÖÂÐÔºÍÍêÕûÐÔ¡£
ÿÕűí×î¶à¿É½¨Á¢12ÖÖÀàÐ͵Ĵ¥·¢Æ÷£¬ËüÃÇÊÇ:
BEFORE INSERT
BEFORE INSERT FOR EACH ROW
AFTER INSERT
AFTER INSERT FOR EACH ROW
BEFORE UPDATE
BEFORE UPDATE FOR EACH ROW
AFTER UPDATE
AFTER UPDATE FOR EACH ROW
BEFORE DELETE
BEFORE DELETE FOR EACH ROW
AFTERDELETE
AFTER DELETE FOR EACH ROW
¢Ü´¥·¢Æ÷´¥·¢´ÎÐò
1. Ö´ÐÐBEFOREÓï¾ä¼¶´¥·¢Æ÷;
2. ¶ÔÓëÊÜÓï¾äÓ°ÏìµÄÿһÐУº
Ö´ÐÐBEFOREÐм¶´¥·¢Æ÷
Ö´ÐÐDMLÓï¾ä
Ö´ÐÐAFTERÐм¶´¥·¢Æ÷
3. Ö´ÐÐAFTERÓï¾ä¼¶´¥·¢Æ÷
¢Ý´´½¨DML´¥·¢Æ÷
´¥·¢Æ÷Ãû¿ÉÒԺͱí»ò¹ý³ÌÓÐÏàͬµÄÃû×Ö£¬µ«ÔÚÒ»¸öģʽÖд¥·¢Æ÷Ãû²»ÄÜÏàͬ¡£
´¥·¢Æ÷µÄÏÞÖÆ
CREATE TRIGGERÓï¾äÎı¾µÄ×Ö·û³¤¶È²»Äܳ¬¹ý32KB£»
´¥·¢Æ÷ÌåÄÚµÄSELECT Óï¾äÖ»ÄÜΪSELECT ¡ INTO ¡½á¹¹£¬»òÕßΪ¶¨ÒåÓαêËùʹÓõÄSELECT Óï¾ä¡£
´¥·¢Æ÷Öв»ÄÜʹÓÃÊý¾Ý¿âÊÂÎñ¿ØÖÆÓï¾äCOMMIT; ROLLBACK, SVAEPOINT Óï¾ä£»
ÓÉ´¥·¢Æ÷Ëùµ÷ÓõĹý³Ì»òº¯ÊýÒ²²»ÄÜʹÓÃÊý¾Ý¿âÊÂÎñ¿ØÖÆÓï¾ä£»
ÎÊÌ⣺µ±´¥·¢Æ÷±»´¥·¢Ê±£¬ÒªÊ¹Óñ»²åÈë¡¢¸üлòɾ³ýµÄ¼Ç¼ÖеÄÁÐÖµ£¬ÓÐʱҪʹÓòÙ×÷ǰ¡¢ºóÁеÄÖµ.
ʵÏÖ: :NEW ÐÞÊηû·ÃÎʲÙ×÷Íê³ÉºóÁеÄÖµ
:OLD ÐÞÊηû·ÃÎʲÙ×÷Íê³ÉǰÁеÄÖµ
ÌØÐÔ INSERT UPDATE DELETE
OLD NULL ÓÐЧ ÓÐЧ
NEW ÓÐЧ ÓÐЧ NULL
[Àý]
create or replace trigger hello_trigger
after
update on employees
for each row
begin
dbms_output.put_line('hello...');
dbms_output.put_line('old.salary:'|| :OLD.salary||',new.salary'||:NEW.salary);
end;
È»ºóÖ´ÐУºupdate employees set salary = salary + 1000;
¢Þ´´½¨Ìæ´ú(INSTEAD OF)´¥·¢Æ÷
´´½¨´¥·¢Æ÷µÄÒ»°ãÓï·¨ÊÇ:
CREATE [OR REPLACE] TRIGGER trigger_name
INSTEAD OF
{INSERT | DELETE | UPDATE [OFcolumn [, column ¡]]}
ON[schema.] view_name
[FOR EACH ROW]
[WHENcondition]
begin
trigger_body;
end;
ÆäÖУº
INSTEAD OF Ñ¡ÏîʹORACLE¼¤»î´¥·¢Æ÷£¬¶ø²»Ö´Ðд¥·¢Ê¼þ¡£
Ö»ÄܶÔÊÓͼºÍ¶ÔÏóÊÓͼ½¨Á¢INSTEAD OF´¥·¢Æ÷£¬¶ø²»ÄÜ¶Ô±í¡¢Ä£Ê½ºÍÊý¾Ý¿â½¨Á¢INSTEAD OF ´¥·¢Æ÷¡£
FOR EACH ROWÑ¡Ïî˵Ã÷´¥·¢Æ÷ΪÐд¥·¢Æ÷¡£
Ðд¥·¢Æ÷ºÍÓï¾ä´¥·¢Æ÷µÄÇø±ð±íÏÖÔÚ£ºÐд¥·¢Æ÷ÒªÇóµ±Ò»¸öDMLÓï¾ä²Ù×öÓ°ÏìÊý¾Ý¿âÖеĶàÐÐÊý¾Ýʱ£¬¶ÔÓÚÆäÖеÄÿ¸öÊý¾ÝÐУ¬Ö»ÒªËüÃÇ·ûºÏ´¥·¢Ô¼ÊøÌõ¼þ£¬¾ù¼¤»îÒ»´Î´¥·¢Æ÷£»
¶øÓï¾ä´¥·¢Æ÷½«Õû¸öÓï¾ä²Ù×÷×÷Ϊ´¥·¢Ê¼þ£¬µ±Ëü·ûºÏÔ¼ÊøÌõ¼þʱ£¬¼¤»îÒ»´Î´¥·¢Æ÷¡£
µ±Ê¡ÂÔFOR EACH ROW Ñ¡Ïîʱ£¬BEFORE ºÍAFTER ´¥·¢Æ÷ΪÓï¾ä´¥·¢Æ÷£¬¶øINSTEAD OF ´¥·¢Æ÷ÔòΪÐд¥·¢Æ÷¡£
WHEN ×Ó¾ä˵Ã÷´¥·¢Ô¼ÊøÌõ¼þ¡£Condition Ϊһ¸öÂß¼±í´ïʱ£¬ÆäÖбØÐë°üº¬Ïà¹ØÃû³Æ£¬¶ø²»Äܰüº¬²éѯÓï¾ä£¬Ò²²»Äܵ÷ÓÃPL/SQL º¯Êý¡£
WHEN ×Ó¾äÖ¸¶¨µÄ´¥·¢Ô¼ÊøÌõ¼þÖ»ÄÜÓÃÔÚBEFORE ºÍAFTER Ðд¥·¢Æ÷ÖУ¬²»ÄÜÓÃÔÚINSTEAD OF Ðд¥·¢Æ÷ºÍÆäËüÀàÐ͵Ĵ¥·¢Æ÷ÖС£
INSTEAD_OF ÓÃÓÚ¶ÔÊÓͼµÄDML´¥·¢£¬ÓÉÓÚÊÓͼÓпÉÄÜÊÇÓÉ