成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

快速掌握Oracle數據庫游標的使用方法

瀏覽:295日期:2023-11-19 12:15:31
顯式游標 當查詢返回結果超過一行時,就需要一個顯式游標,此時用戶不能使用select into語句。PL/SQL治理隱式游標,當查詢開始時隱式游標打開,查詢結束時隱式游標自動關閉。顯式游標在PL/SQL塊的聲明部分聲明,在執行部分或異常處理部分打開,取出數據,關閉。 使用游標 這里要做一個聲明,我們所說的游標通常是指顯式游標,因此從現在起沒有非凡指明的情況,我們所說的游標都是指顯式游標。要在程序中使用游標,必須首先聲明游標。 聲明游標 語法: CURSOR cursor_name IS select_statement; 在PL/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; 從游標提取數據。從游標得到一行數據使用FETCH命令。每一次提取數據后,游標都指向結果集的下一行。語法如下: FETCH cursor_name INTO variable[,variable,...] 對于SELECT定義的游標的每一列,FETCH變量列表都應該有一個變量與之相對應,變量的類型也要相同。 例: SET SERVERIUTPUT ON DECLARE v_ename EMP.ENAME%TYPE; v_salary EMP.SALARY%TYPE; CURSOR c_emp IS SELECT ename,salary FROM emp; BEGIN OPEN c_emp; FETCH c_emp INTO v_ename,v_salary; DBMS_OUTPUT.PUT_LINE('Salary of Employee' v_ename 'is' v_salary); FETCH c_emp INTO v_ename,v_salary; DBMS_OUTPUT.PUT_LINE('Salary of Employee' v_ename 'is' v_salary); FETCH c_emp INTO v_ename,v_salary; DBMS_OUTPUT.PUT_LINE('Salary of Employee' v_ename 'is' v_salary); CLOSE c_emp; END 這段代碼無疑是非常麻煩的,假如有多行返回結果,可以使用循環并用游標屬性為結束循環的條件,以這種方式提取數據,程序的可讀性和簡潔性都大為提高,下面我們使用循環重新寫上面的程序: SET SERVERIUTPUT ON DECLARE v_ename EMP.ENAME%TYPE; v_salary EMP.SALARY%TYPE; CURSOR c_emp IS SELECT ename,salary FROM emp; BEGIN OPEN c_emp; LOOP FETCH c_emp INTO v_ename,v_salary; EXIT WHEN c_emp%NOTFOUND; DBMS_OUTPUT.PUT_LINE('Salary of Employee' v_ename 'is' v_salary); END ; 記錄變量 定義一個記錄變量使用TYPE命令和%ROWTYPE,關于%ROWsTYPE的更多信息請參閱相關資料。 記錄變量用于從游標中提取數據行,當游標選擇很多列的時候,那么使用記錄比為每列聲明一個變量要方便得多。 當在表上使用%ROWTYPE并將從游標中取出的值放入記錄中時,假如要選擇表中所有列,那么在SELECT子句中使用*比將所有列名列出來要得多。 例: SET SERVERIUTPUT ON DECLARE R_emp EMP%ROWTYPE; CURSOR c_emp IS SELECT * FROM emp; BEGIN OPEN c_emp; LOOP FETCH c_emp INTO r_emp; EXIT WHEN c_emp%NOTFOUND; DBMS_OUT.PUT.PUT_LINE('Salary of Employee'r_emp.ename'is' r_emp.salary); END LOOP; CLOSE c_emp; END; %ROWTYPE也可以用游標名來定義,這樣的話就必須要首先聲明游標: SET SERVERIUTPUT ON DECLARE CURSOR c_emp IS SELECT ename,salary FROM emp; R_emp c_emp%ROWTYPE; BEGIN OPEN c_emp; LOOP FETCH c_emp INTO r_emp; EXIT WHEN c_emp%NOTFOUND; DBMS_OUT.PUT.PUT_LINE('Salary of Employee'r_emp.ename'is' r_emp.salary); END LOOP; CLOSE c_emp; END; 帶參數的游標 與存儲過程和函數相似,可以將參數傳遞給游標并在查詢中使用。這對于處理在某種條件下打開游標的情況非常有用。它的語法如下: CURSOR cursor_name[(parameter[,parameter],...)] IS select_statement; 定義參數的語法如下: Parameter_name [IN] data_type[{:=DEFAULT} value] 與存儲過程不同的是,游標只能接受傳遞的值,而不能返回值。參數只定義數據類型,沒有大小。 另外可以給參數設定一個缺省值,當沒有參數值傳遞給游標時,就使用缺省值。游標中定義的參數只是一個占位符,在別處引用該參數不一定可靠。 在打開游標時給參數賦值,語法如下: OPEN cursor_name[value[,value]....]; 參數值可以是文字或變量。 例: DECALRE CURSOR c_dept IS SELECT * FROM dept ORDER BY deptno; CURSOR c_emp (p_dept VARACHAR2) IS SELECT ename,salary FROM emp WHERE deptno=p_dept ORDER BY ename r_dept DEPT%ROWTYPE; v_ename EMP.ENAME%TYPE; v_salary EMP.SALARY%TYPE; v_tot_salary EMP.SALARY%TYPE; BEGIN OPEN c_dept; LOOP FETCH c_dept INTO r_dept; EXIT WHEN c_dept%NOTFOUND; DBMS_OUTPUT.PUT_LINE('Department:' r_dept.deptno'-'r_dept.dname); v_tot_salary:=0; OPEN c_emp(r_dept.deptno); LOOP FETCH c_emp INTO v_ename,v_salary; EXIT WHEN c_emp%NOTFOUND; DBMS_OUTPUT.PUT_LINE('Name:' v_ename' salary:'v_salary); v_tot_salary:=v_tot_salary+v_salary; END LOOP; CLOSE c_emp; DBMS_OUTPUT.PUT_LINE('Toltal Salary for dept:' v_tot_salary); END LOOP; CLOSE c_dept; END; ; 游標FOR循環 在大多數時候我們在設計程序的時候都遵循下面的步驟: 1、打開游標。 2、開始循環。 3、從游標中取值。 4、那一行被返回。 5、處理。 6、關閉循環。 7、關閉游標。 可以簡單的把這一類代碼稱為游標用于循環。但還有一種循環與這種類型不相同,這就是FOR循環,用于FOR循環的游標按照正常的聲明方式聲明,它的優點在于不需要顯式的打開、關閉、取數據,測試數據的存在、定義存放數據的變量等等。游標FOR循環的語法如下: FOR record_name IN (corsor_name[(parameter[,parameter]...)] (query_difinition) LOOP statements END LOOP; 下面我們用for循環重寫上面的例子:DECALRE CURSOR c_dept IS SELECT deptno,dname FROM dept ORDER BY deptno; CURSOR c_emp (p_dept VARACHAR2) IS SELECT ename,salary FROM emp WHERE deptno=p_dept ORDER BY ename v_tot_salary EMP.SALARY%TYPE; BEGIN FOR r_dept IN c_dept LOOP DBMS_OUTPUT.PUT_LINE('Department:' r_dept.deptno'-'r_dept.dname); v_tot_salary:=0; FOR r_emp IN c_emp(r_dept.deptno) LOOP DBMS_OUTPUT.PUT_LINE('Name:' v_ename 'salary:' v_salary); v_tot_salary:=v_tot_salary+v_salary; END LOOP; DBMS_OUTPUT.PUT_LINE('Toltal Salary for dept:' v_tot_salary); END LOOP; END; 在游標FOR循環中使用查詢 在游標FOR循環中可以定義查詢,由于沒有顯式聲明所以游標沒有名字,記錄名通過游標查詢來定義。 DECALRE v_tot_salary EMP.SALARY%TYPE; BEGIN FOR r_dept IN (SELECT deptno,dname FROM dept ORDER BY deptno) LOOP DBMS_OUTPUT.PUT_LINE('Department:' r_dept.deptno'-'r_dept.dname); v_tot_salary:=0; FOR r_emp IN (SELECT ename,salary  FROM emp  WHERE deptno=p_dept  ORDER BY ename) LOOP DBMS_OUTPUT.PUT_LINE('Name:' v_ename' salary:'v_salary); v_tot_salary:=v_tot_salary+v_salary; END LOOP; DBMS_OUTPUT.PUT_LINE('Toltal Salary for dept:' v_tot_salary); END LOOP; END; 游標中的子查詢 語法如下: CURSOR C1 IS SELECT * FROM emp WHERE deptno NOT IN (SELECT deptno FROM dept WHERE dname!='ACCOUNTING'); 可以看出與SQL中的子查詢沒有什么區別。 ; 游標中的更新和刪除 在PL/SQL中依然可以使用UPDATE和DELETE語句更新或刪除數據行。顯式游標只有在需要獲得多行數據的情況下使用。PL/SQL提供了僅僅使用游標就可以執行刪除或更新記錄的方法。 UPDATE或DELETE語句中的WHERE CURRENT OF子串專門處理要執行UPDATE或DELETE操作的表中取出的最近的數據。要使用這個方法,在聲明游標時必須使用FOR UPDATE子串,當對話使用FOR UPDATE子串打開一個游標時,所有返回集中的數據行都將處于行級(ROW-LEVEL)獨占式鎖定,其他對象只能查詢這些數據行,不能進行UPDATE、DELETE或SELECT...FOR UPDATE操作。 語法: FOR UPDATE [OF [schema.]table.column[,[schema.]table.column].. [nowait] 在多表查詢中,使用OF子句來鎖定特定的表,假如忽略了OF子句,那么所有表中選擇的數據行都將被鎖定。假如這些數據行已經被其他會話鎖定,那么正常情況下Oracle將等待,直到數據行解鎖。 在UPDATE和DELETE中使用WHERE CURRENT OF子串的語法如下: WHERE{CURRENT OF cursor_namesearch_condition} 例: DELCARE CURSOR c1 IS SELECT empno,salary FROM emp WHERE comm IS NULL FOR UPDATE OF comm; v_comm NUMBER(10,2); BEGIN FOR r1 IN c1 LOOP IF r1.salary<500 THEN v_comm:=r1.salary*0.25; ELSEIF r1.salary<1000 THEN v_comm:=r1.salary*0.20; ELSEIF r1.salary<3000 THEN v_comm:=r1.salary*0.15; ELSE v_comm:=r1.salary*0.12; END IF; UPDATE emp; SET comm=v_comm WHERE CURRENT OF c1l; END LOOP; END
標簽: Oracle 數據庫
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
亚洲美女屁股眼交| 国产不卡高清在线观看视频| 国内精品写真在线观看| 香蕉国产精品偷在线观看不卡| 国产精品久久久久一区| 99re热这里只有精品视频| 精品欧美一区二区在线观看| 国产成人在线电影| 欧美一区二区在线免费播放| 久久电影网电视剧免费观看| 亚洲在线观看| 亚洲高清中文字幕| 免费久久久一本精品久久区| 亚洲夂夂婷婷色拍ww47| 一区二区三区四区五区视频 | 亚洲一区二区三区中文字幕| 不卡视频免费播放| 久久久久青草大香线综合精品| 91在线视频官网| 久久久久久综合| 色综合久久中文综合久久97| 国产女人水真多18毛片18精品视频| 欧美人成在线| 国产精品天美传媒| 亚洲成人自拍视频| 亚洲一区电影777| 在线观看日韩国产| 国产高清在线观看免费不卡| 久久综合精品国产一区二区三区 | 亚洲一区二区三区四区五区黄 | 久久亚洲精品伦理| 丝袜国产日韩另类美女| 日本精品视频一区二区| 精品一区二区三区在线播放视频 | 亚洲成人一区在线| 久久精品一本| 另类人妖一区二区av| 337p亚洲精品色噜噜噜| av在线一区二区| 国产精品国产三级国产有无不卡 | 97se亚洲国产综合在线| 国产午夜精品久久久久久免费视 | 91麻豆免费看片| 中文欧美字幕免费| 亚洲人人精品| 日日噜噜夜夜狠狠视频欧美人 | 婷婷久久综合九色综合绿巨人| 在线免费一区三区| 国产一区二区三区香蕉| 久久天堂av综合合色蜜桃网| 国产一区清纯| 午夜欧美2019年伦理| 欧美色视频在线观看| 国产剧情一区在线| 中文字幕av免费专区久久| 国产精品推荐精品| 麻豆中文一区二区| 精品久久久久一区二区国产| 亚洲电影自拍| 免费观看在线色综合| 欧美成人综合网站| 在线播放不卡| 喷水一区二区三区| 欧美大片在线观看| 亚洲三级网站| 国内精品不卡在线| 欧美激情在线观看视频免费| 亚洲在线观看| 国产在线一区二区| 国产精品国产三级国产| 欧亚洲嫩模精品一区三区| www.欧美.com| 亚洲制服丝袜av| 欧美军同video69gay| 午夜精品免费| 蜜臀久久久99精品久久久久久| 2021久久国产精品不只是精品| 日韩视频中文| 大陆成人av片| 亚洲国产成人tv| 欧美videofree性高清杂交| 一本一道久久综合狠狠老精东影业 | 亚洲精品水蜜桃| 欧美日韩不卡视频| 成人免费av在线| 一区二区三区四区不卡视频| 69堂精品视频| 黑人一区二区| 国产一区二区三区免费播放 | 国产伦精品一区二区三区在线观看| 国产亚洲欧美一级| 午夜一级在线看亚洲| 国产在线看一区| 日韩美女啊v在线免费观看| 欧洲一区在线电影| 国产精品swag| 国精产品一区一区三区mba视频 | 一区二区视频在线观看| 精品一区二区三区久久| 综合色中文字幕| 7777精品伊人久久久大香线蕉 | 日韩欧美电影在线| 国产欧美韩日| av男人天堂一区| 午夜av区久久| 国产精品拍天天在线| 欧美乱妇20p| 免费亚洲一区二区| 欧美a级片网站| 麻豆精品在线观看| 亚洲免费在线电影| 久久综合色播五月| 欧美午夜精品理论片a级按摩| 影音先锋亚洲电影| 不卡av免费在线观看| 日韩精品每日更新| 18欧美亚洲精品| 日韩一区二区三区在线观看| 久久精品人人做人人爽电影蜜月| 欧美在线精品一区| 国产精品88av| 日韩电影免费在线| 亚洲裸体xxx| 国产区在线观看成人精品| 欧美一级午夜免费电影| 久久伊人亚洲| 亚洲国产美女| 欧美成人日本| 成人免费看视频| 国产另类ts人妖一区二区| 亚洲免费在线视频一区 二区| 久久精品一区四区| 欧美日韩成人综合天天影院 | 一区二区三区日韩欧美| 国产亚洲精品免费| 91精品国产综合久久久久久| 久久人人精品| 一区二区日韩免费看| 欧美国产综合| 成人精品电影在线观看| 国内成人免费视频| 日韩高清欧美激情| 一区二区三区四区激情| 国产精品色哟哟网站| 欧美精品一区二区精品网| 欧美精品日日鲁夜夜添| 日本道免费精品一区二区三区| 香蕉精品999视频一区二区 | 日韩欧美一区二区在线视频| 精品视频在线看| 色丁香久综合在线久综合在线观看| 亚洲精品社区| 好吊一区二区三区| 欧美大片专区| 99久久免费视频.com| 成人激情综合网站| 成人午夜在线免费| 国产麻豆91精品| 国产一区二区不卡| 国内精品国产成人国产三级粉色| 久久99精品网久久| 国精产品一区一区三区mba视频 | 99re热精品| 国产精品s色| 韩日精品在线| 亚洲高清不卡| 影院欧美亚洲| 国产精品初高中精品久久| 色综合网站在线| 欧美激情1区2区| 午夜精品视频| 亚洲午夜视频| 亚洲美女一区| 国产精品久久久久毛片大屁完整版| 国产精品手机在线| 久久av一区| 狂野欧美性猛交xxxx巴西| 亚洲区第一页| 国产精品久久久一区二区| 久久成人免费| 在线观看一区二区视频| 欧美午夜电影在线播放| 欧美日韩在线播放三区四区| 欧美日产国产精品| 日韩一级完整毛片| 久久婷婷综合激情| 国产精品美女一区二区| 一区二区三区中文在线观看| 亚洲高清三级视频| 天天操天天色综合| 精品无人区卡一卡二卡三乱码免费卡| 久国产精品韩国三级视频| 国产麻豆精品在线观看| 成人免费福利片| 99久久99久久精品免费观看| 欧美日韩爆操| 99国内精品| 老**午夜毛片一区二区三区| 欧美日韩一区小说| 在线播放/欧美激情|