;
帖子
3919 
精华
积分
11710 
鱼币
0 ¥ 
来自
大连 
在线时间
1858 小时 
注册时间
2007-6-11 
最后登录
2009-10-20 

贴图大师勋章新人进步勋章宣传大使勋章论坛元老勋章

3
发表于 2009-1-5 19:48 | 只看该作者
Oracle鏁版嵁搴撴父鏍囦娇鐢ㄥぇ鍏(1) - 缂栫▼搴 - Powered by SupeSite

浣犵殑浣嶇疆锛缂栫▼搴 >> 璧勮 >> Oracle >> oracel鍩虹 >> 璇︾粏鍐呭 鍦ㄧ嚎鎶曠ǹ

Oracle鏁版嵁搴撴父鏍囦娇鐢ㄥぇ鍏(1)

鍙戝竷: 2008-11-30 16:18 |  浣滆: 缃戠粶杞浇 |   鏉ユ簮: 缃戠粶杞浇 |  鏌ョ湅: 29娆

QL鏄敤浜庤闂甇RACLE鏁版嵁搴撶殑璇█锛孭L/SQL鎵╁睍鍜屽姞寮轰簡SQL鐨勫姛鑳斤紝瀹冨悓鏃跺紩鍏ヤ簡鏇村己鐨勭▼搴忛昏緫銆 PL/SQL鏀寔DML鍛戒护鍜孲QL鐨勪簨鍔℃帶鍒惰鍙ャ侱DL鍦≒L/SQL涓笉琚敮鎸侊紝杩欏氨鎰忓懗浣滃湪PL/SQL绋嬪簭鍧椾腑涓嶈兘鍒涘缓琛ㄦ垨鍏朵粬浠讳綍瀵硅薄銆傝緝濂界殑PL/SQL绋嬪簭璁捐鏄湪PL/SQL鍧椾腑浣跨敤璞BMS_SQL杩欐牱鐨勫唴寤哄寘鎴栨墽琛孍XECUTE IMMEDIATE鍛戒护寤虹珛鍔ㄦ丼QL鏉ユ墽琛孌DL鍛戒护锛孭L/SQL缂栬瘧鍣ㄤ繚璇佸璞″紩鐢ㄤ互鍙婄敤鎴风殑鏉冮檺銆備笅闈㈡垜浠皢璁ㄨ鍚勭鐢ㄤ簬璁块棶ORACLE鏁版嵁搴撶殑DDL鍜孴CL璇彞銆

鏌ヨ

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;
    

 

 
TAG: Oracle ORACLE 澶у叏 鏁版嵁搴 娓告爣
鎵撳嵃 | 鏀惰棌姝ら〉 |  鎺ㄨ崘缁欏ソ鍙 | 涓炬姤
涓婁竴绡 涓嬩竴绡
 

璇勫垎锛0

鍙戣〃璇勮
鏌ョ湅鍏ㄩ儴鍥炲銆愬凡鏈0浣嶇綉鍙嬪彂琛ㄤ簡鐪嬫硶銆