锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 鏂規硶浜岋細 鍦═OAD鐧婚檰鏃朵嬌鐢ㄥ叏灞鍚嶇О錛?/p> zhouzhenhua:1521/javafan 鎴戠幇鍦ㄧ湅鍒扮殑鐢風殑姝摐瑁傛灒鐨勫お澶氫簡 PL/SQL闆嗗悎鏂規硶鏄敤浜庢搷綰甸泦鍚堝彉閲忕殑鍐呯疆鍑芥暟鎴栬繃紼嬨?/p> 璇硶錛?/p> collection_name.method_name[(parameter)] 娉ㄦ剰錛?strong>闆嗗悎鏂規硶extend鍜宼rim涓嶉傜敤浜嶱L/SQL琛?/strong>銆?/p> 1. exists 2. count 3. limit 榪斿洖VARRAY鍙橀噺鎵鍏佽鐨勬渶澶у厓绱犱釜鏁般傚祵濂楄〃鍜孭L/SQL琛ㄧ殑鍏冪礌涓暟鏃犻檺鍒訛紝鎵浠ヨ皟鐢ㄨ鏂規硶鏃惰繑鍥濶ULL銆?/p> 4. first鍜宭ast 絎竴涓厓绱犵殑涓嬫爣錛屾渶鍚庝竴涓厓绱犵殑涓嬫爣 ename_table(ename_table.first) ename_table(ename_table.last) 5. prior鍜宯ext 鍓嶄竴涓厓绱犵殑涓嬫爣錛屽悗涓涓厓绱犵殑涓嬫爣 ename_table(ename_table.prior(1)) ename_table(ename_table.next(1)) 6.extend 璇ユ柟娉曚負PL/SQL闆嗗悎鍙橀噺澧炲姞鍏冪礌錛?strong>鍙傜敤浜庡祵濂楄〃鍜孷ARRAY銆?/p> 娉ㄦ剰錛氬綋浣跨敤EXTEND澧炲姞鍏冪礌鏃訛紝涓嶈兘涓烘湭鍒濆鍖栫殑闆嗗悎鍙橀噺澧炲姞鍏冪礌銆?/p> EXTEND鏂規硶鏈変笁縐嶈皟鐢ㄦ柟娉曪細 7. trim 璇ユ柟娉曠敤浜庝粠闆嗗悎鍙橀噺灝鵑儴鍒犻櫎鍏冪礌錛屽茍涓?strong>鍙傜敤浜庡祵濂楄〃鍜孷ARRAY銆?/p> TRIM鍏辨湁涓ょ璋冪敤鏂規硶錛?/p> 8. delete 鐢ㄤ簬鍒犻櫎鐗瑰畾鍏冪礌錛?strong>鍙傜敤浜庡祵濂楄〃鍜孭L/SQL琛?/strong>銆?/p> DELETE鏈変笁縐嶈皟鐢ㄦ柟娉曪細 瀹冨彧鑳戒綔涓篜L/SQL綾誨瀷錛?strong>涓嶈兘浣滀負琛ㄥ垪綾誨瀷銆? 涓嬫爣鍙互涓鴻礋鍊鹼紝騫朵笖鍏冪礌涓暟鏃犻檺鍒躲? 涓嬫爣綾誨瀷key_type: 鍖呮嫭BINARY_INTEGER銆丳LS_INTEGER銆乂ARCHAR2銆? 璇硶錛? TYPE type_name IS TABLE OF element_type [NOT NULL] INDEX BY key_type; identifier type_name; 渚嬪錛? DECLARE category_table category_table_type; 絎簩錛屽祵濂楄〃 鍙互浣滀負琛ㄥ垪鐨勬暟鎹被鍨嬩嬌鐢ㄣ? 褰撲嬌鐢ㄥ祵濂楄〃鍏冪礌鏃訛紝闇瑕佷嬌鐢ㄦ瀯閫犳柟娉曞垵濮嬪寲宓屽琛ㄥ彉閲忋? 涓嬫爣浠?寮濮嬭綆椼? 璇硶錛? TYPE type_name IS TABLE OF element_type; identifier type_name; 渚嬪瓙錛? DECLARE category_table category_table_type; SELECT servicename DBMS_OUTPUT.put_line (category_table (1)); 絎笁錛屽彉闀挎暟緇?VARRAY) 闇瑕佷嬌鐢ㄦ瀯閫犳柟娉曞垵濮嬪寲VARRAY鍙橀噺銆? 璇硶錛? TYPE type_name is VARRAY(size_limit) OF element_type [NOT NULL]; identifier type_name;
TYPE category_table_type IS TABLE OF VARCHAR2 (40)
INDEX BY VARCHAR2 (40);
BEGIN
category_table ('闀挎矙') := '闀挎矙錛屾垜鐖變綘錛?;
DBMS_OUTPUT.put_line (category_table ('闀挎矙'));
END;
TYPE category_table_type IS TABLE OF tb_out_service.servicename%TYPE;
BEGIN
category_table := category_table_type ('鍏ㄧ渷', '闀挎矙', '甯稿痙');
INTO category_table (3)
FROM tb_out_service
WHERE serviceid = '&serviceid';
DBMS_OUTPUT.put_line (category_table (2));
DBMS_OUTPUT.put_line (category_table (3));
END;
1. 鑷畾涔塒L/SQL璁板綍
2. 浣跨敤%ROWTYPE灞炴у畾涔夎褰曞彉閲?/p>
涓句緥錛?/p>
-----------------------------------------------
DECLARE
--鑷畾涔夎褰曠被鍨?br> TYPE emp_record_type IS RECORD (
serviceid tb_out_service%TYPE,
sericename tb_out_service%TYPE
);emp_record emp_record_type;
--浣跨敤%ROWTYPE灞炴у畾涔夎褰曞彉閲?br> category_record tb_out_service%ROWTYPE;
BEGIN
NULL;
END;
絎簩錛屼嬌鐢≒L/SQL璁板綍
DECLARE
--浣跨敤%ROWTYPE灞炴у畾涔夎褰曞彉閲?br> category_r tb_out_service%ROWTYPE;
BEGIN
...
UPDATE tb_out_service
SET ROW = category_r --娉ㄦ剰ROW鍏抽敭瀛?br> WHERE serviceid = category_r.serviceid;
...
INSERT INTO tb_out_service
VALUES category_r; --鍦╲alues瀛愬彞涓嬌鐢ㄨ褰曟垚鍛樻挱鍏ユ暟鎹?
...
END;
commit
rollback
savepoint a1
闅愬惈娓告爣錛氫笓闂ㄥ鐞哠ELECT INTO銆両NSERT銆乁PDATE浠ュ強DELETE璇彞銆?/p>
鏄劇ず娓告爣錛氱敤浜庡鐞嗗琛岀殑SELECT璇彞銆?/p>
褰撳湪PL/SQL鍧椾腑鎵цINSERT銆乁PDATE鍙奃ELETE璇彞鏃訛紝涓轟簡鍙栧緱DML璇彞浣滅敤鐨勭粨鏋滐紝闇瑕佷嬌鐢⊿QL娓告爣灞炴с?/p>
絎竴錛屾父鏍囩殑4縐嶅睘鎬?/strong>
1. SQL%ISOPEN
璇ュ睘鎬ф案榪滈兘鏄痜alse錛屾病鏈夊疄闄呮剰涔夈?/p>
2. SQL%FOUND
璇彞鏄惁鎿嶄綔鎴愬姛銆傚綋SQL璇彞鏈変綔鐢ㄨ鏃朵負TRUE.
3. SQL%NOTFOUND
LOOP
FETCH emp_cursor INTO v_name, v_deptno;
EXIT WHEN emp_cursor%NOTFOUND;
...
END LOOP;
4. SQL%ROWCOUNT
榪斿洖SQL璇彞鎵浣滅敤鐨勬昏琛屾暟銆?/p>
璇ュ睘鎬х敤浜庤繑鍥炲凡鎻愬彇鐨勫疄闄呰鏁般?/p>
絎簩錛屾樉紺烘父鏍囦笓鐢ㄤ簬澶勭悊SELECT璇彞榪斿洖鐨勫琛屾暟鎹?/strong>
CURSOR cursor_name IS select_statement;
open cursor_name;
FETCH cursor_name INTO var1[, var2, ...];
CLOSE cursor_name;
渚嬪瓙錛?/p>
DECLARE
CURSOR category_cursor
IS
SELECT *
FROM tb_out_service t
WHERE t.servicename LIKE '闀挎矙%';
TYPE category_table_type IS TABLE OF tb_out_service%ROWTYPE
INDEX BY BINARY_INTEGER;
category_table category_table_type;
i INT;
BEGIN
OPEN category_cursor;
LOOP
i := category_cursor%ROWCOUNT + 1;
FETCH category_cursor
INTO category_table (i);
EXIT WHEN category_cursor%NOTFOUND;
DBMS_OUTPUT.put_line ( RPAD (category_table (i).serviceid, 30)
|| ' '
|| category_table (i).servicename
);
END LOOP;
CLOSE category_cursor;
END;
絎笁錛屾父鏍嘑OR寰幆
璇硶錛?/p>
FOR record_name IN cursor_name LOOP
statement;
...
END LOOP;
娉ㄦ剰錛氬綋浣跨敤娓告爣FOR寰幆鏃訛紝鏃㈠彲浠ュ湪瀹氫箟閮ㄥ垎瀹氫箟娓告爣錛屼篃鍙互鐩存帴鍦‵OR寰幆涓嬌鐢⊿ELECT璇彞銆?/p>
絎洓錛屽弬鏁版父鏍?/strong>
CURSOR cursor_name(parameter_name datatype) is select_statement;
OPEN cursor_name(parameter_value)
娉ㄦ剰錛?/p>
瀹氫箟鍙傛暟鍙兘鎸囧畾鏁版嵁綾誨瀷錛屼笉鑳芥寚瀹氶暱搴︺?/p>
鍙﹀錛屽簲璇ュ湪娓告爣鐨剆elect璇彞鐨剋here瀛愬彞涓紩鐢ㄦ父鏍囧弬鏁幫紝鍚﹀垯澶卞幓浜嗗畾涔夊弬鏁版父鏍囩殑鎰忎箟銆?/p>
---------------------------------------------------------------------------------------------------------------------
DECLARE
CURSOR category_cursor (NAME VARCHAR2)
IS
SELECT *
FROM tb_out_service t
WHERE t.servicename LIKE NAME || '%';
BEGIN
FOR category_record IN category_cursor ('鍚夐')
LOOP
DBMS_OUTPUT.put_line ( RPAD (category_record.serviceid, 30)
|| ' '
|| category_record.servicename
);
END LOOP;
END;
絎簲錛屾洿鏂版垨鍒犻櫎娓告爣琛?/strong>
璇硶錛?/p>
CURSOR cursor_name IS select_statement
FOR UPDATE [OF column_reference] [NOWAIT];
UPDATE table_name SET column=.. WHERE CURRENT OF cursor_name;
DELETE FROM table_name WHERE CURRENT OF cursor_name;
娉ㄦ剰錛?/p>
1. OF瀛愬彞鐨勬牸寮忥細column_reference涓簍able_name.column_name
2. WHERE CURRENT OF cursor_name, 鏇存柊鎴栬呭垹闄ゆ父鏍囨墍鍦ㄨ鐨勬暟鎹?/p>
3. 鍦ㄤ嬌鐢ㄦ父鏍囨洿鏂版垨鍒犻櫎鏁版嵁鏃訛紝瀹氫箟娓告爣蹇呴』甯︽湁FOR UPDATE瀛愬彞錛屽茍涓斿湪鏇存柊鎴栬呭垹闄ゆ父鏍囨椂蹇呴』甯︽湁WHERE CURRENT OF 瀛愬彞銆?/p>
褰撴煡璇㈣鍙ユ秹鍙婂埌澶氬紶琛ㄦ椂錛屽鏋滀笉甯︽湁OF瀛愬彞錛屼細鍦ㄥ寮犺〃涓婂悓鏃跺姞閿侊紝濡傛灉鍙湪鐗瑰畾鐨勮〃涓婂姞閿侊紝闇瑕佸甫鏈塐F瀛愬彞銆?/p>
DECLARE
CURSOR category_cursor (NAME VARCHAR2)
IS
SELECT *
FROM tb_out_service t
WHERE t.servicename LIKE NAME || '%'
FOR UPDATE OF t.querystr;
v_name CONSTANT VARCHAR2 (20) := '闀挎矙';
BEGIN
FOR category_record IN category_cursor (v_name)
LOOP
IF INSTR (category_record.servicename, v_name || '鈥斺?) <> 1
THEN
DBMS_OUTPUT.put_line ( 'delete: '
|| RPAD (category_record.serviceid, 30)
|| ' '
|| category_record.servicename
);
DELETE FROM tb_out_service
WHERE CURRENT OF category_cursor;
ELSE
DBMS_OUTPUT.put_line ( 'upate: '
|| RPAD (category_record.serviceid, 30)
|| ' '
|| category_record.servicename
);
UPDATE tb_out_service t
SET t.querystr = v_name || '鈥斺? || t.servicename
WHERE CURRENT OF category_cursor;
END IF;
END LOOP;
END;
絎叚錛?娓告爣鍙橀噺
娓告爣鍙橀噺鏄熀浜嶳EF CURSOR綾誨瀷鎵瀹氫箟鐨勫彉閲忥紝瀹冨疄闄呬笂鏄寚鍚戝唴瀛樺湴鍧鐨勬寚閽堛傛樉寮忔父鏍囧彧鑳藉畾涔夐潤鎬佹父鏍囷紝鑰屾父鏍囧彉閲忓彲浠ュ湪鎵撳紑鏃舵寚瀹氬叾鎵瀵瑰簲鐨凷ELECT璇彞錛屼粠鑰屽疄鐜板姩鎬佹父鏍囥?/p>
TYPE ref_type_name IS REF CURSOR [RETURN return_type];
cursor_variable ref_type_name;
OPEN cursor_name FOR select_statement;
FETCH cursor_variable INTO var1[, var2, ...];
CLOSE cursor_variable;
娉ㄦ剰錛?/p>
涓嶈兘鍦ㄨ繙紼嬪瓙紼嬪簭涓嬌鐢ㄦ父鏍囧彉閲忋?/p>
褰撴寚瀹氬瓙鏌ヨ鏃訛紝涓嶈兘甯︽湁FOR UPDATE瀛愬彞銆?/p>
褰撴寚瀹歊ETURN瀛愬彞鏃訛紝榪斿洖綾誨瀷蹇呴』浣跨敤PL/SQL璁板綍綾誨瀷銆?/p>
渚嬪瓙錛?/p>
DECLARE
TYPE category_cursor_type IS REF CURSOR
RETURN tb_out_service%ROWTYPE;
category_cursor category_cursor_type;
category_record tb_out_service%ROWTYPE;
v_name CONSTANT VARCHAR2 (40) := '闀挎矙';
BEGIN
OPEN category_cursor FOR
SELECT *
FROM tb_out_service t
WHERE t.servicename LIKE v_name || '%';
LOOP
FETCH category_cursor
INTO category_record;
EXIT WHEN category_cursor%NOTFOUND;
DBMS_OUTPUT.put_line ( RPAD (category_record.serviceid, 30)
|| ' '
|| category_record.servicename
);
END LOOP;
END;
緙栧啓PL/SQL鏃訛紝鍙互鐩存帴浣跨敤澶у鏁扮殑鍗曡SQL鍑芥暟錛岃繖浜涘崟琛屽嚱鏁板寘鎷暟瀛楀嚱鏁般佸瓧絎﹀嚱鏁般佽漿鎹㈠嚱鏁板強鏃ユ湡鍑芥暟銆?/p>
娉ㄦ剰錛氭煇浜汼QL鍑芥暟鍙兘鍦⊿QL璇彞涓紩鐢紝鑰屼笉鑳界洿鎺ュ湪PL/SQL璇彞涓紩鐢紝榪欎簺SQL鍑芥暟鍖呮嫭GREATEST銆丩EAST銆丏ECODE鍙婃墍鏈夌殑鍒嗙粍鍑芥暟錛堝SUM錛夈?/p>
綰︽潫鐢ㄤ簬紜繚鏁版嵁搴撴暟婊¤凍涓氬姟瑙勫垯銆?/p>
綰︽潫鍖呮嫭錛歂OT NULL錛孶NIQUE錛孭RIMARY KEY錛孎OREIGN KEY浠ュ強CHECK絳?縐嶇被鍨嬨?/p>
寤虹珛涓婚敭綰︽潫鍜屽敮涓綰︽潫鏃訛紝Oralce浼氬熀浜庣害鏉熷垪鑷姩寤虹珛鍞竴绱㈠紩錛涗富閿害鏉熶笉鍏佽涓篘ULL錛屽敮涓綰︽潫鍏佽涓篘ULL銆?/p>
涓寮犺〃鍙兘寤虹珛涓涓富閿害鏉熴?/p>
寤鴻〃綰︽潫錛歂OT NULL鍙兘鍦ㄥ垪綰у畾涔夛紱鍏跺畠4縐嶆棦鍙互鍦ㄥ垪綰у畾涔夛紝涔熷彲浠ュ湪琛ㄧ駭瀹氫箟銆傚鍚堜富閿害鏉熷彧鑳藉湪琛ㄧ駭瀹氫箟銆?/p>
緇存姢綰︽潫錛氬鍔燦OT NULL綰︽潫鏃跺繀欏諱嬌鐢∕ODIFY瀛愬彞錛岃屽鍔犲叾瀹冪害鏉熸椂闇瑕佷嬌鐢ˋDD瀛愬彞銆?/p>
絎竴錛?瀹氫箟綰︽潫
---------------------------------------------
璇硶錛?/p>
CREATE TABLE [SCHEMA.]table_name(
column_name datatype [DEFAULT expr] [column_constraint],
...
[table_constraint][, ...]
);
渚嬪瓙錛?/p>
CREATE TABLE tt_user_info
(
ID VARCHAR2(20 BYTE),
NAME VARCHAR2(20 BYTE) NOT NULL,
category_id VARCHAR2(20 BYTE) REFERENCES tb_out_service(serviceid),
remark VARCHAR2(1000)
);
ALTER TABLE tt_user_info ADD (
CHECK ( LENGTH(NAME)>2),
PRIMARY KEY (ID),
UNIQUE (NAME)
);
璇存槑錛?
1. NOT NULL錛岄潪絀虹害鏉?/strong>
not null
2. UNIQUE錛屽敮涓綰︽潫
UNIQUE (COL_NAME)
3. PRIMARY KEY錛屼富閿害鏉?/strong>
primary key (col_name1 [, col_name2])
4. FOREIGN KEY錛屽閿害鏉?/strong>
瀹冩湁涓夌綾誨瀷錛?/p>
references primary_table(primary_col)
on delete cascade
on delete set null
5. CHECK錛屾鏌ョ害鏉?/strong>
check (money > 1000)
絎簩錛?緇存姢綰︽潫
----------------------------------------
1. 澧炲姞綰︽潫
NOT NULL浣跨敤ALTER MODIFY瀛愬彞錛屽叾瀹冪殑浣跨敤ALTER ADD瀛愬彞
-------------------------------
CREATE TABLE tt_user(NAME VARCHAR2(20));
ALTER TABLE tt_user MODIFY user_name NOT NULL;
ALTER TABLE tt_user ADD CONSTRAINT constraint_name UNIQUE(NAME);
ALTER TABLE tt_user ADD CONSTRAINT constraint_name PRIMARY KEY(NAME);
ALTER TABLE tt_user ADD parentid VARCHAR2(20)
CONSTRAINT constraint_name
REFERENCES tb_out_service(serviceid);
2. 淇敼綰︽潫鍚?/p>
ALTER TABLE table_name RENAME CONSTRAINT old_constraint_name TO new_constraint_name
3. 鍒犻櫎綰︽潫
ALTER TABLE table_name DROP CONSTRAINT constraint_name
4. 紱佹綰︽潫
ALTER TABLE table_name DISABLE CONSTRAINT constraint_name [CASCADE];
5.嬋鍔ㄧ害鏉?/p>
ALTER TABLE table_name ENABLE CONSTRAINT constraint_name;
絎笁. 鏄劇ず綰︽潫淇℃伅
鎵鏈夌害鏉熶俊鎭?/p>
SELECT *
FROM user_constraints
鐢ㄦ埛綰︽潫鎵瀵瑰簲鐨勮〃鍒?
SELECT *
FROM user_cons_columns;
------------------------------------
A. 浜嬪姟涓存椂琛?緙虹渷)錛?/p>
CREATE GLOBAL TEMPORARY TABLE table_name(col_name INT);
CREATE GLOBAL TEMPORARY TABLE table_name(col_name INT) ON COMMIT DELETE ROWS;
------------------------------------
B. 浼氳瘽涓存椂琛細
CREATE GLOBAL TEMPORARY TABLE table_name(col_name INT) ON COMMIT PRESERVE ROWS;