posts - 60,comments - 71,trackbacks - 0
          from: http://www.javaeye.com/topic/79108

              
        1. --[4]// Oracle Cursor and OOP Conception   
        2. -------------------------------------------------------------------------------------//   
        3. --顯示游標---------------------------------------------------------//   
        4. --001  
        5. DECLARE   
        6.     CURSOR c1 IS  --聲明游標   
        7.         SELECT name,address FROM student ORDER BY name;   
        8.     v_name student.name%TYPE;   
        9.     v_addr student.address%TYPE;   
        10. BEGIN   
        11.     OPEN c1;  --打開游標   
        12.     FETCH c1 INTO v_name,v_addr;  --第一次定位讀取數(shù)據(jù),并保存在變量   
        13.     --循環(huán)讀取數(shù)據(jù)   
        14.     WHILE c1%FOUND LOOP   
        15.         DBMS_OUTPUT.PUT_LINE(TO_CHAR(c1%ROWCOUNT) || '  ' || v_name || ' , ' || v_addr);   
        16.         FETCH c1 INTO v_name,v_addr;   
        17.     END LOOP;   
        18.     DBMS_OUTPUT.PUT_LINE('Total rows is : ' || c1%ROWCOUNT);   
        19.     CLOSE c1;  --關閉游標   
        20. END;   
        21. /   
        22. --002  
        23. DECLARE   
        24.     CURSOR cur_emp IS   
        25.         SELECT sal FROM emp WHERE deptno = 20 FOR UPDATE OF sal;   
        26.     v_sal emp.sal%TYPE;   
        27. BEGIN   
        28.     OPEN cur_emp;   
        29.     FETCH cur_emp INTO v_sal;   
        30.     LOOP   
        31.         EXIT WHEN cur_emp%NOTFOUND;   
        32.         IF v_sal < 2000 THEN   
        33.             UPDATE emp SET sal = 2000 WHERE current OF cur_emp;  --更新當前數(shù)據(jù)   
        34.         END IF;   
        35.         FETCH cur_emp INTO v_sal;   
        36.     END LOOP;   
        37.     DBMS_OUTPUT.PUT_LINE('命令執(zhí)行完畢');   
        38.        
        39.     IF cur_emp%ISOPEN THEN   
        40.         CLOSE cur_emp;   
        41.         IF cur_emp%ISOPEN THEN   
        42.             DBMS_OUTPUT.PUT_LINE('Cursor state : Open');   
        43.             CLOSE cur_emp;   
        44.         ELSE   
        45.             DBMS_OUTPUT.PUT_LINE('Cursor state : Close');   
        46.         END IF;   
        47.     END IF;   
        48. END;   
        49. /   
        50.   
        51. --隱式游標---------------------------------------------------------//   
        52. --不能顯式的使用OPEN、CLOSE和FETCH語句,他會自動完成   
        53. DECLARE   
        54.     no   emp.empno%TYPE;   
        55.     name emp.ename%TYPE;       
        56. BEGIN   
        57.     SELECT empno,ename INTO no,name FROM emp WHERE empno = '7788';   
        58.     IF SQL%ISOPEN THEN   
        59.         DBMS_OUTPUT.PUT_LINE('Cursor state : Open');   
        60.     ELSE   
        61.         DBMS_OUTPUT.PUT_LINE('Cursor state : Close');   
        62.     END IF;   
        63.     DBMS_OUTPUT.PUT_LINE(no || '    ' || name);   
        64.     DBMS_OUTPUT.PUT_LINE('Return rows : ' || SQL%ROWCOUNT);   
        65. EXCEPTION   
        66.     WHEN CURSOR_ALREADY_OPEN THEN   
        67.         DBMS_OUTPUT.PUT_LINE('Cursor already open');   
        68.     WHEN NO_DATA_FOUND THEN   
        69.         DBMS_OUTPUT.PUT_LINE('No data found');   
        70.     WHEN TOO_MANY_ROWS THEN   
        71.         DBMS_OUTPUT.PUT_LINE('Return many rows');   
        72. END;   
        73. /   
        74.   
        75. --游標變量(一個游標變量可以在一個PL\SQL塊中使用多次)---------------------------//   
        76. DECLARE   
        77.     TYPE refcur IS REF CURSOR;  --[RETURN TYPE]   
        78.     cur_emp refcur;  --引用游標   
        79.     dept emp.deptno%TYPE;   
        80.     name emp.ename%TYPE;   
        81. BEGIN   
        82.     OPEN cur_emp FOR SELECT deptno FROM emp WHERE empno = '7788';   
        83.     FETCH cur_emp INTO dept;   
        84.     DBMS_OUTPUT.PUT_LINE('Dept : ' || dept);   
        85.     CLOSE cur_emp;   
        86.   
        87.     OPEN cur_emp FOR SELECT ename FROM emp WHERE empno = '7788';   
        88.     FETCH cur_emp INTO name;   
        89.     DBMS_OUTPUT.PUT_LINE('Name : ' || name);   
        90.     CLOSE cur_emp;   
        91. END;   
        92. /   
        93.   
        94. --游標在三種循環(huán)中的使用-------------------------------------------//   
        95. --001--Loop   
        96. DECLARE   
        97.     CURSOR cur_emp IS   
        98.         SELECT ename FROM emp;   
        99.     v_name emp.ename%TYPE;   
        100. BEGIN   
        101.     OPEN cur_emp;   
        102.     FETCH cur_emp INTO v_name;   
        103.     LOOP   
        104.         EXIT WHEN cur_emp%NOTFOUND;   
        105.         DBMS_OUTPUT.PUT_LINE('Name is : ' || v_name);   
        106.         FETCH cur_emp INTO v_name;   
        107.     END LOOP;   
        108.     DBMS_OUTPUT.PUT_LINE('Return rows : ' || cur_emp%ROWCOUNT);   
        109.     CLOSE cur_emp;   
        110. END;   
        111. /   
        112. --002--While   
        113. DECLARE   
        114.     CURSOR cur_emp IS   
        115.         SELECT ename FROM emp;   
        116.     v_name emp.ename%TYPE;   
        117. BEGIN   
        118.     OPEN cur_emp;   
        119.     FETCH cur_emp INTO v_name;   
        120.     WHILE cur_emp%FOUND LOOP   
        121.         DBMS_OUTPUT.PUT_LINE('Name is : ' || v_name);   
        122.         FETCH cur_emp INTO v_name;   
        123.     END LOOP;   
        124.     DBMS_OUTPUT.PUT_LINE('Return rows : ' || cur_emp%ROWCOUNT);   
        125.     CLOSE cur_emp;   
        126. END;   
        127. /   
        128. --003--For   
        129. --注:在使用 FOR 循環(huán)時,不能顯式的使用 open、colse 和 FETCH 語句,他會自動完成   
        130. DECLARE   
        131.     rows number := 0;   
        132.     CURSOR cur_emp IS   
        133.         SELECT ename FROM emp;   
        134. BEGIN   
        135.     FOR v_emp in cur_emp LOOP   
        136.         DBMS_OUTPUT.PUT_LINE('name is : ' || v_emp.ename);   
        137.         rows := rows + 1;   
        138.     END LOOP;   
        139.     DBMS_OUTPUT.PUT_LINE('Return rows : ' || rows);   
        140. END;   
        141. /   
        142.   
        143. --OOP Conception---------------------------------------------------//   
        144. --001  
        145. --創(chuàng)建對象類型(相當于C中的結構體,可實現(xiàn)代碼重用機制)---   
        146. --**注意:OR REPLACE表示將覆蓋此用戶下的同名對象類型,在不熟悉數(shù)據(jù)庫結構的時候不要濫用   
        147. CREATE OR REPLACE TYPE t_score AS OBJECT   
        148. (   
        149.     java number(5,2),   
        150.     net  number(5,2)   
        151. )   
        152. /   
        153. --可指定類型名稱直接創(chuàng)建對象表   
        154. CREATE TABLE score OF t_score;   
        155. --或應用于表中   
        156. CREATE TABLE student   
        157. (   
        158.     id    VARCHAR2(4),   
        159.     name  VARCHAR2(20),   
        160.     score t_score   
        161. );   
        162. --為上表插入數(shù)據(jù)(利用構造函數(shù))   
        163. INSERT INTO student VALUES('s101','張三',t_score(85,76));   
        164. --或   
        165. INSERT INTO student(id,name,score) VALUES('s102','李四',t_score(80,89));   
        166. --查詢指定   
        167. SELECT s.score.java FROM student s;  --必須賦予別名   
        168. --002  
        169. --或者可以創(chuàng)建更為復雜的對象類型,即類型嵌套   
        170. CREATE OR REPLACE TYPE t_stu AS OBJECT   
        171. (   
        172.     id    VARCHAR2(4),   
        173.     name  VARCHAR2(20),   
        174.     score t_score   
        175. )   
        176. /   
        177. --應用于表中   
        178. CREATE TABLE student   
        179. (   
        180.     stu_base t_stu,   
        181.     teacher  varchar2(20)   
        182. );   
        183. --查看表結構   
        184. SET DESC DEPTH ALL;  --指定查看層次,否則只能看到第一層   
        185. DESC student;   
        186. --插入數(shù)據(jù)   
        187. INSERT INTO student   
        188.     VALUES(t_stu('s101','zhao',t_score(76,81)),'zhang');   
        189. --查詢指定   
        190. SELECT s.stu_base.score.java FROM student s WHERE s.stu_base.id = 's101';   
        191.   
        192. --修改對象類型(注:修改對象類型需9i以上版本)------------------------//   
        193. --其中INVALIDATE選項使得所有依賴于t_stu類型的對象和表標記為invalid   
        194. --增加屬性address,注:修改后可能引起一些未知的錯誤,所以請不要隨意修改   
        195. ALTER TYPE t_stu   
        196.     ADD ATTRIBUTE address VARCHAR2(50) INVALIDATE;   
        197.   
        198. --刪除類型(注:需按嵌套逐級刪除)   
        199. DROP TYPE t_stu;   
        200. DROP TYPE t_score;   
        201.   
        202. --繼承-------------------------------------------------------------//   
        203. --創(chuàng)建一個不可被繼承的類型   
        204. CREATE OR REPLACE TYPE super_TYPE AS OBJECT   
        205. (   
        206.     n NUMBER,   
        207.     FINAL MEMBER PROCEDURE cannot_override   
        208. )   
        209. NOT FINAL   
        210. /   
        211. --繼承時將出錯,可用【SHOW ERROR】語句查看錯誤信息   
        212. CREATE OR REPLACE TYPE sub_TYPE UNDER super_TYPE   
        213. (   
        214.     OVERRIDING MEMBER PROCEDURE cannot_override   
        215. )   
        216. /   
        217. --創(chuàng)建一個不可被實例化、不可被繼承的類型   
        218. CREATE OR REPLACE TYPE shape AS OBJECT   
        219. (   
        220.     n NUMBER,   
        221.     NOT INSTANTIABLE MEMBER FUNCTION calculate_area RETURN NUMBER   
        222. )   
        223. NOT INSTANTIABLE NOT FINAL   
        224. /   
        225. --實例化改類型將出錯   
        226. DECLARE   
        227.     l_shape shape;   
        228. BEGIN   
        229.     l_shape := shape(2);   
        230. END;   
        231. /   
        232.   
        233. --嵌套表(表中之表)-------------------------------------------------//   
        234. --創(chuàng)建類型,(以下實例將創(chuàng)建一組動物飼養(yǎng)員嵌套表)   
        235. CREATE TYPE animal_ty AS OBJECT   
        236. (   
        237.     breed VARCHAR2(25),   
        238.     name  VARCHAR2(25),   
        239.     birthdate DATE   
        240. );   
        241. /   
        242. --此類型將用作一個嵌套表的基礎類型   
        243. CREATE TYPE animal_nt AS TABLE OF animal_ty;   
        244. /   
        245. --創(chuàng)建嵌套表   
        246. CREATE TABLE breeder   
        247. (   
        248.     breedername VARCHAR2(25),   
        249.     animals     animal_nt   
        250. )   
        251. NESTED TABLE animals STORE AS animals_nt_tab;  --animals_nt_tab代表別名   
        252. --插入數(shù)據(jù)   
        253. INSERT INTO breeder VALUES('Mary',   
        254.     animal_nt   
        255.     (   
        256.         animal_ty('dog','butch',to_date('2004-3-31','yyyy-mm-dd')),   
        257.         animal_ty('dog','rover',to_date('2005-8-20','yyyy-mm-dd')),   
        258.         animal_ty('dog','julio',sysdate)   
        259.     )   
        260. );   
        261. INSERT INTO breeder VALUES('Jane',   
        262.     animal_nt   
        263.     (   
        264.         animal_ty('cat','an',to_date('2005-10-12','yyyy-mm-dd')),   
        265.         animal_ty('cat','jame',to_date('2002-1-23','yyyy-mm-dd')),   
        266.         animal_ty('cat','killer',to_date('2004-6-2','yyyy-mm-dd'))   
        267.     )   
        268. );   
        269. --查詢表中姓名為Jane所養(yǎng)的動物   
        270. SELECT breed,name,birthdate   
        271.     FROM TABLE(SELECT animals FROM breeder WHERE breedername='Jane');   
        272.   
        273. --可變數(shù)組(類似于嵌套表,概念上講它是限定了行集合的嵌套表)----------//   
        274. --創(chuàng)建類型(以下實例將創(chuàng)建一組聯(lián)系人嵌套表)   
        275. CREATE TYPE comm_info AS OBJECT   
        276. (   
        277.     no        NUMBER(3),    --通訊類型號   
        278.     comm_TYPE VARCHAR2(20), --通訊類型   
        279.     comm_no   VARCHAR2(30)  --號碼   
        280. )   
        281. /   
        282. --創(chuàng)建可變數(shù)組   
        283. CREATE TYPE comm_info_list AS VARRAY(50) OF comm_info;   
        284. /   
        285. --創(chuàng)建表   
        286. CREATE TABLE user_info   
        287. (   
        288.     user_id   NUMBER(6),     --用戶ID   
        289.     user_name VARCHAR2(20),  --用戶名   
        290.     user_comm comm_info_list --與用戶聯(lián)系的通訊方式   
        291. );   
        292. --插入數(shù)據(jù)   
        293. INSERT INTO user_info VALUES(101,'Mary',   
        294.     comm_info_list(comm_info(1,'手機','13652369888'),   
        295.                comm_info(2,'座機','02125689366')));   
        296. INSERT INTO user_info VALUES(102,'Tom',   
        297.     comm_info_list(comm_info(1,'手機','13765235898'),   
        298.                comm_info(2,'座機','021-65234789')));   
        299. --查詢用戶ID為101的手機號碼   
        300. SELECT comm_type,comm_no   
        301.     FROM TABLE(SELECT user_comm FROM user_info WHERE user_id = 101)   
        302.     WHERE no = 1;   
        303.   
        304. --對象表-----------------------------------------------------------//   
        305. --創(chuàng)建對象   
        306. CREATE OR REPLACE TYPE address AS OBJECT   
        307. (   
        308.     id     NUMBER(4),   
        309.     street VARCHAR2(50),   
        310.     state  VARCHAR2(2),   
        311.     zip    VARCHAR2(11)   
        312. )   
        313. /   
        314. --創(chuàng)建對象表   
        315. CREATE TABLE address_table OF address;   
        316. --插入數(shù)據(jù)   
        317. INSERT INTO address_table    
        318.     VALUES(1,'Oracle way','US','90001');   
        319. --或使用構造函數(shù)   
        320. INSERT INTO address_table   
        321.     VALUES(address(2,'Microsoft way','US','80863'));   
        322. --查詢數(shù)據(jù)   
        323. SELECT * FROM address_table;   
        324.   
        325. --VALUE關鍵字:以對象表別名做參數(shù),返回對象實例   
        326. SELECT VALUE(a) FROM address_table a;   
        327.   
        328. --REF數(shù)據(jù)類型:在關系表中關聯(lián)對象   
        329. CREATE TABLE employee_location   
        330. (   
        331.     empno   NUMBER,   
        332.     loc_ref REF address SCOPE IS address_table  --此列引用了類型address   
        333. );   
        334. --查看結構   
        335. SET DESC DEPTH ALL;   
        336. DESC employee_location;   
        337.   
        338. --REF()函數(shù):將引用對象表中的數(shù)據(jù)插入   
        339. INSERT INTO employee_location   
        340.     SELECT 101,REF(a)   
        341.         FROM address_table a WHERE id = 1;   
        342. INSERT INTO employee_location   
        343.     SELECT 102,ref(a)   
        344.         FROM address_table a WHERE id = 2;   
        345. --查詢   
        346. --注:用此語句查詢的結果是未解析過的REF數(shù)據(jù)   
        347. SELECT * FROM employee_location   
        348. --DEREF():解析REF數(shù)據(jù),返回真正指向的實例   
        349. SELECT empno,DEREF(loc_ref)   
        350.     FROM employee_location;   
        351.   
        352. --懸空REF:REF指向的對象實例被刪除了,此時成為REF懸空(dangling),說明REF指向不存在的實例   
        353. DELETE FROM address_table WHERE id = 2;   
        354. --查詢   
        355. --懸空的REF會返回NULL,使用 IS DANGLING 確定那些REF懸空   
        356. SELECT empno FROM employee_location   
        357.     WHERE loc_ref IS DANGLING;   
        358. --清除懸空的REF,將REF更新未NULL   
        359. UPDATE employee_location   
        360.     SET loc_ref = NULL   
        361.     WHERE loc_ref IS DANGLING;   
        362. --再查看:已經(jīng)將懸空的REF清除   
        363. SELECT * FROM employee_location;   
        364.   
        365. --對象視圖---------------------------------------------------------//   
        366. --創(chuàng)建表--關系表   
        367. CREATE TABLE item   
        368. (   
        369.     item_code VARCHAR2(10),   
        370.     item_hand NUMBER(10),   
        371.     item_sode NUMBER(10)   
        372. );   
        373. --創(chuàng)建對象--使用相同列   
        374. CREATE OR REPLACE TYPE item_type AS OBJECT   
        375. (   
        376.     item_code VARCHAR2(10),   
        377.     item_hand NUMBER(10),   
        378.     item_sode NUMBER(10)   
        379. )   
        380. /   
        381. --建立對象視圖   
        382. CREATE VIEW item_view OF item_type  --OF item_type 說明基于對象   
        383.     WITH OBJECT OID(item_code)  --WITH OBJECT OID(item_code)明確生成OID   
        384.     AS   
        385.     SELECT * FROM item   
        386. /   
        387. --我們現(xiàn)在可以通過視圖來操作數(shù)據(jù)   
        388. INSERT INTO item_view VALUES(item_type('i101',15,50));   
        389.   
        390. --MAKE_REF()   
        391. --關系主表   
        392. CREATE TABLE itemfile   
        393. (   
        394.     itemcode   VARCHAR2(5) PRIMARY KEY,   
        395.     itemdesc   VARCHAR2(20),   
        396.     p_category VARCHAR2(20),   
        397.     qty_hand   NUMBER(5),   
        398.     re_level   NUMBER(5),   
        399.     max_level  NUMBER(5),   
        400.     itemrate   NUMBER(9,2)   
        401. );   
        402. --關系從表   
        403. CREATE TABLE order_detail   
        404. (   
        405.     orderno  VARCHAR2(5),   
        406.     itemcode VARCHAR2(5),   
        407.     qty_ord  NUMBER(5),   
        408.     qty_deld NUMBER(5)   
        409. );   
        410.   
        411. --PL/SQL表和記錄---------------------------------------------------//   
        412. SET SERVEROUTPUT ON;   
        413. DECLARE   
        414.     TYPE rec_emp IS RECORD  --定義記錄   
        415.     (   
        416.     no   emp.empno%TYPE,   
        417.     name emp.ename%TYPE   
        418.     );   
        419.   
        420.     TYPE tab_emp IS TABLE OF rec_emp  --定義 PL/SQL 表   
        421.         INDEX BY binary_integer;   
        422.   
        423.     i NUMBER := 1;   
        424.     temp_emp tab_emp;  --定義 PL/SQL 表的變量   
        425.   
        426.     CURSOR cur_emp IS   
        427.         SELECT empno,ename FROM emp;   
        428. BEGIN   
        429.     OPEN cur_emp;   
        430.     FETCH cur_emp INTO temp_emp(i);   
        431.     LOOP   
        432.         EXIT WHEN cur_emp%NOTFOUND;   
        433.         DBMS_OUTPUT.PUT_LINE(temp_emp(i).no || '  ' || temp_emp(i).name);   
        434.         i := i + 1;   
        435.         FETCH cur_emp INTO temp_emp(i);   
        436.     END LOOP;   
        437.     DBMS_OUTPUT.PUT_LINE('總計打印了 ' || temp_emp.count || ' 條記錄');   
        438.   
        439.     CLOSE cur_emp;   
        440. END;   
        441. /   
        442. ----------------------------------------------------------------------------------End
        443. posted on 2008-09-28 21:41 henry1451 閱讀(675) 評論(1)  編輯  收藏

          FeedBack:
          # re: Oracel 游標Cursor的使用(轉(zhuǎn))
          2009-03-02 15:07 | 包裝機械
          ok hen hao  回復  更多評論
            

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導航:
           
          主站蜘蛛池模板: 金堂县| 新野县| 天门市| 连云港市| 塔城市| 长顺县| 金华市| 屯门区| 昆山市| 项城市| 延安市| 九龙城区| 商南县| 鹤壁市| 方正县| 文昌市| 西城区| 高碑店市| 堆龙德庆县| 庄浪县| 永平县| 阳新县| 嘉祥县| 隆安县| 林甸县| 刚察县| 碌曲县| 县级市| 莱阳市| 黑龙江省| 阳城县| 田阳县| 北川| 五莲县| 湟中县| 卓资县| 连江县| 驻马店市| 台中县| 固安县| 绥棱县|