Oracle鏁版嵁搴撴父鏍囦娇鐢ㄥぇ鍏(1)
鍙戝竷: 2008-11-30 16:18 | 浣滆: 缃戠粶杞浇 | 鏉ユ簮: 缃戠粶杞浇 | 鏌ョ湅: 29娆
鏌ヨ
SELECT璇彞鐢ㄤ簬浠庢暟鎹簱涓煡璇㈡暟鎹紝褰撳湪PL/SQL涓娇鐢⊿ELECT璇彞鏃讹紝瑕佷笌INTO瀛愬彞涓璧蜂娇鐢紝鏌ヨ鐨勮繑鍥炲艰璧嬩簣INTO瀛愬彞涓殑鍙橀噺锛屽彉閲忕殑澹版槑鏄湪DELCARE涓係ELECT INTO璇硶濡備笅锛
SELECT [DISTICT|ALL]{*|column[,column,...]}
INTO (variable[,variable,...] |record)
FROM {table|(sub-query)}[alias]
WHERE............
PL/SQL涓璖ELECT璇彞鍙繑鍥炰竴琛屾暟鎹傚鏋滆秴杩囦竴琛屾暟鎹紝閭d箞灏辫浣跨敤鏄惧紡娓告爣锛堝娓告爣鐨勮璁烘垜浠皢鍦ㄥ悗闈㈣繘琛岋級锛孖NTO瀛愬彞涓鏈変笌SELECT瀛愬彞涓浉鍚屽垪鏁伴噺鐨勫彉閲忋侷NTO瀛愬彞涓篃鍙互鏄褰曞彉閲忋
TYPE灞炴
鍦≒L/SQL涓彲浠ュ皢鍙橀噺鍜屽父閲忓0鏄庝负鍐呭缓鎴栫敤鎴峰畾涔夌殑鏁版嵁绫诲瀷锛屼互寮曠敤涓涓垪鍚嶏紝鍚屾椂缁ф壙浠栫殑鏁版嵁绫诲瀷鍜屽ぇ灏忋傝繖绉嶅姩鎬佽祴鍊兼柟娉曟槸闈炲父鏈夌敤鐨勶紝姣斿鍙橀噺寮曠敤鐨勫垪鐨勬暟鎹被鍨嬪拰澶у皬鏀瑰彉浜嗭紝濡傛灉浣跨敤浜%TYPE,閭d箞鐢ㄦ埛灏变笉蹇呬慨鏀逛唬鐮侊紝鍚﹀垯灏卞繀椤讳慨鏀逛唬鐮併
渚嬶細
v_empno SCOTT.EMP.EMPNO%TYPE;
v_salary EMP.SALARY%TYPE;
涓嶄絾鍒楀悕鍙互浣跨敤%TYPE,鑰屼笖鍙橀噺銆佹父鏍囥佽褰曪紝鎴栧0鏄庣殑甯搁噺閮藉彲浠ヤ娇鐢%TYPE銆傝繖瀵逛簬瀹氫箟鐩稿悓鏁版嵁绫诲瀷鐨勫彉閲忛潪甯告湁鐢ㄣ
DELCARE
V_A NUMBER(5):=10;
V_B V_A%TYPE:=15;
V_C V_A%TYPE;
BEGIN
DBMS_OUTPUT.PUT_LINE
(V_A=||V_A||V_B=||V_B||V_C=||V_C);
END
SQL>/
V_A=10 V_B=15 V_C=
PL/SQL procedure successfully completed.
SQL>
鍏朵粬DML璇彞
鍏跺畠鎿嶄綔鏁版嵁鐨凞ML璇彞鏄:INSERT銆乁PDATE銆丏ELETE鍜孡OCK TABLE,杩欎簺璇彞鍦≒L/SQL涓殑璇硶涓庡湪SQL涓殑璇硶鐩稿悓銆傛垜浠湪鍓嶉潰宸茬粡璁ㄨ杩嘍ML璇彞鐨勪娇鐢ㄨ繖閲屽氨涓嶅啀閲嶅浜嗐傚湪DML璇彞涓彲浠ヤ娇鐢ㄤ换浣曞湪DECLARE閮ㄥ垎澹版槑鐨勫彉閲忥紝濡傛灉鏄祵濂楀潡锛岄偅涔堣娉ㄦ剰鍙橀噺鐨勪綔鐢ㄨ寖鍥淬
渚嬶細
CREATE OR REPLACE PROCEDURE FIRE_EMPLOYEE (pempno in number)
銆AS
v_ename EMP.ENAME%TYPE;
銆BEGIN
SELECT ename INTO v_ename
FROM emp
WHERE empno=p_empno;
INSERT INTO FORMER_EMP(EMPNO,ENAME)
VALUES (p_empno,v_ename);
DELETE FROM emp
WHERE empno=p_empno;
UPDATE former_emp
SET date_deleted=SYSDATE
WHERE empno=p_empno;
EXCEPTION
銆WHEN NO_DATA_FOUND THEN
銆DBMS_OUTPUT.PUT_LINE(Employee Number Not Found!);
銆END
DML璇彞鐨勭粨鏋
褰撴墽琛屼竴鏉ML璇彞鍚庯紝DML璇彞鐨勭粨鏋滀繚瀛樺湪鍥涗釜娓告爣灞炴т腑锛岃繖浜涘睘鎬х敤浜庢帶鍒剁▼搴忔祦绋嬫垨鑰呬簡瑙g▼搴忕殑鐘舵併傚綋杩愯DML璇彞鏃讹紝PL/SQL鎵撳紑涓涓唴寤烘父鏍囧苟澶勭悊缁撴灉锛屾父鏍囨槸缁存姢鏌ヨ缁撴灉鐨勫唴瀛樹腑鐨勪竴涓尯鍩燂紝娓告爣鍦ㄨ繍琛孌ML璇彞鏃舵墦寮锛屽畬鎴愬悗鍏抽棴銆傞殣寮忔父鏍囧彧浣跨敤SQL%FOUND,SQL%NOTFOUND,SQL%ROWCOUNT涓変釜灞炴.SQL%FOUND,SQL%NOTFOUND鏄竷灏斿硷紝SQL%ROWCOUNT鏄暣鏁板笺
SQL%FOUND鍜孲QL%NOTFOUND
鍦ㄦ墽琛屼换浣旸ML璇彞鍓峉QL%FOUND鍜孲QL%NOTFOUND鐨勫奸兘鏄疦ULL,鍦ㄦ墽琛孌ML璇彞鍚庯紝SQL%FOUND鐨勫睘鎬у煎皢鏄細
. TRUE :INSERT
. TRUE :DELETE鍜孶PDATE锛岃嚦灏戞湁涓琛岃DELETE鎴朥PDATE.
. TRUE :SELECT INTO鑷冲皯杩斿洖涓琛
褰揝QL%FOUND涓篢RUE鏃,SQL%NOTFOUND涓篎ALSE銆
SQL%ROWCOUNT
鍦ㄦ墽琛屼换浣旸ML璇彞涔嬪墠锛孲QL%ROWCOUNT鐨勫奸兘鏄疦ULL,瀵逛簬SELECT INTO璇彞锛屽鏋滄墽琛屾垚鍔燂紝SQL%ROWCOUNT鐨勫间负1,濡傛灉娌℃湁鎴愬姛锛孲QL%ROWCOUNT鐨勫间负0锛屽悓鏃朵骇鐢熶竴涓紓甯窷O_DATA_FOUND.
SQL%ISOPEN
SQL%ISOPEN鏄竴涓竷灏斿硷紝濡傛灉娓告爣鎵撳紑锛屽垯涓篢RUE, 濡傛灉娓告爣鍏抽棴锛屽垯涓篎ALSE.瀵逛簬闅愬紡娓告爣鑰岃█SQL%ISOPEN鎬绘槸FALSE锛岃繖鏄洜涓洪殣寮忔父鏍囧湪DML璇彞鎵ц鏃舵墦寮锛岀粨鏉熸椂灏辩珛鍗冲叧闂
浜嬪姟鎺у埗璇彞
浜嬪姟鏄竴涓伐浣滅殑閫昏緫鍗曞厓鍙互鍖呮嫭涓涓垨澶氫釜DML璇彞锛屼簨鐗╂帶鍒跺府鍔╃敤鎴蜂繚璇佹暟鎹殑涓鑷存с傚鏋滀簨鍔℃帶鍒堕昏緫鍗曞厓涓殑浠讳綍涓涓狣ML璇彞澶辫触锛岄偅涔堟暣涓簨鍔¢兘灏嗗洖婊氾紝鍦≒L/SQL涓敤鎴峰彲浠ユ槑纭湴浣跨敤COMMIT銆丷OLLBACK銆丼AVEPOINT浠ュ強SET TRANSACTION璇彞銆
COMMIT璇彞缁堟浜嬪姟锛屾案涔呬繚瀛樻暟鎹簱鐨勫彉鍖栵紝鍚屾椂閲婃斁鎵鏈塋OCK,ROLLBACK缁堟鐜拌浜嬪姟閲婃斁鎵鏈塋OCK锛屼絾涓嶄繚瀛樻暟鎹簱鐨勪换浣曞彉鍖,SAVEPOINT鐢ㄤ簬璁剧疆涓棿鐐癸紝褰撲簨鍔¤皟鐢ㄨ繃澶氱殑鏁版嵁搴撴搷浣滄椂锛屼腑闂寸偣鏄潪甯告湁鐢ㄧ殑锛孲ET TRANSACTION鐢ㄤ簬璁剧疆浜嬪姟灞炴э紝姣斿read-write鍜岄殧绂荤骇绛夈
鏄惧紡娓告爣
褰撴煡璇㈣繑鍥炵粨鏋滆秴杩囦竴琛屾椂锛屽氨闇瑕佷竴涓樉寮忔父鏍囷紝姝ゆ椂鐢ㄦ埛涓嶈兘浣跨敤select into璇彞銆侾L/SQL绠$悊闅愬紡娓告爣锛屽綋鏌ヨ寮濮嬫椂闅愬紡娓告爣鎵撳紑锛屾煡璇㈢粨鏉熸椂闅愬紡娓告爣鑷姩鍏抽棴銆傛樉寮忔父鏍囧湪PL/SQL鍧楃殑澹版槑閮ㄥ垎澹版槑锛屽湪鎵ц閮ㄥ垎鎴栧紓甯稿鐞嗛儴鍒嗘墦寮锛屽彇鏁版嵁,鍏抽棴銆備笅琛ㄦ樉绀轰簡鏄惧紡娓告爣鍜岄殣寮忔父鏍囩殑宸埆锛
琛1 闅愬紡娓告爣鍜屾樉寮忔父鏍
闅愬紡娓告爣
鏄惧紡娓告爣
PL/SQL缁存姢锛屽綋鎵ц鏌ヨ鏃惰嚜鍔ㄦ墦寮鍜屽叧闂
鍦ㄧ▼搴忎腑鏄惧紡瀹氫箟銆佹墦寮銆佸叧闂紝娓告爣鏈変竴涓悕瀛椼
娓告爣灞炴у墠缂鏄疭QL
娓告爣灞炴х殑鍓嶇紑鏄父鏍囧悕
灞炴%ISOPEN鎬绘槸涓篎ALSE
%ISOPEN鏍规嵁娓告爣鐨勭姸鎬佺‘瀹氬
SELECT璇彞甯︽湁INTO瀛愪覆锛屽彧鏈変竴琛屾暟鎹澶勭悊
鍙互澶勭悊澶氳鏁版嵁锛屽湪绋嬪簭涓缃惊鐜紝鍙栧嚭姣忎竴琛屾暟鎹
浣跨敤娓告爣
杩欓噷瑕佸仛涓涓0鏄庯紝鎴戜滑鎵璇寸殑娓告爣閫氬父鏄寚鏄惧紡娓告爣锛屽洜姝や粠鐜板湪璧锋病鏈夌壒鍒寚鏄庣殑鎯呭喌锛屾垜浠墍璇寸殑娓告爣閮芥槸鎸囨樉寮忔父鏍囥傝鍦ㄧ▼搴忎腑浣跨敤娓告爣锛屽繀椤婚鍏堝0鏄庢父鏍囥
澹版槑娓告爣
璇硶锛
CURSOR cursor_name IS select_statement;
鍦≒L/SQL涓父鏍囧悕鏄竴涓湭澹版槑鍙橀噺锛屼笉鑳界粰娓告爣鍚嶈祴鍊兼垨鐢ㄤ簬琛ㄨ揪寮忎腑銆
渚嬶細
DELCARE
CURSOR C_EMP IS SELECT empno,ename,salary
FROM emp
WHERE salary>2000
ORDER BY ename;
........
BEGIN
鍦ㄦ父鏍囧畾涔変腑SELECT璇彞涓笉涓瀹氶潪瑕佽〃鍙互鏄鍥撅紝涔熷彲浠ヤ粠澶氫釜琛ㄦ垨瑙嗗浘涓夋嫨鐨勫垪锛岀敋鑷冲彲浠ヤ娇鐢*鏉ラ夋嫨鎵鏈夌殑鍒 銆
鎵撳紑娓告爣
浣跨敤娓告爣涓殑鍊间箣鍓嶅簲璇ラ鍏堟墦寮娓告爣锛屾墦寮娓告爣鍒濆鍖栨煡璇㈠鐞嗐傛墦寮娓告爣鐨勮娉曟槸锛
OPEN cursor_name
cursor_name鏄湪澹版槑閮ㄥ垎瀹氫箟鐨勬父鏍囧悕銆
渚嬶細
OPEN C_EMP;
鍏抽棴娓告爣
璇硶锛
CLOSE cursor_name
渚嬶細
CLOSE C_EMP;




发表于 2009-1-5 19:48
| 











