日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

快速掌握Oracle數(shù)據(jù)庫游標(biāo)的使用方法

瀏覽:330日期:2023-11-19 12:15:31
顯式游標(biāo) 當(dāng)查詢返回結(jié)果超過一行時,就需要一個顯式游標(biāo),此時用戶不能使用select into語句。PL/SQL治理隱式游標(biāo),當(dāng)查詢開始時隱式游標(biāo)打開,查詢結(jié)束時隱式游標(biāo)自動關(guān)閉。顯式游標(biāo)在PL/SQL塊的聲明部分聲明,在執(zhí)行部分或異常處理部分打開,取出數(shù)據(jù),關(guān)閉。 使用游標(biāo) 這里要做一個聲明,我們所說的游標(biāo)通常是指顯式游標(biāo),因此從現(xiàn)在起沒有非凡指明的情況,我們所說的游標(biāo)都是指顯式游標(biāo)。要在程序中使用游標(biāo),必須首先聲明游標(biāo)。 聲明游標(biāo) 語法: CURSOR cursor_name IS select_statement; 在PL/SQL中游標(biāo)名是一個未聲明變量,不能給游標(biāo)名賦值或用于表達式中。 例: DELCARE CURSOR C_EMP IS SELECT empno,ename,salary FROM emp WHERE salary>2000 ORDER BY ename; ........ BEGIN 在游標(biāo)定義中SELECT語句中不一定非要表可以是視圖,也可以從多個表或視圖中選擇的列,甚至可以使用*來選擇所有的列 。打開游標(biāo) 使用游標(biāo)中的值之前應(yīng)該首先打開游標(biāo),打開游標(biāo)初始化查詢處理。打開游標(biāo)的語法是: OPEN cursor_name cursor_name是在聲明部分定義的游標(biāo)名。 例: OPEN C_EMP; 關(guān)閉游標(biāo)。 語法: CLOSE cursor_name 例: CLOSE C_EMP; 從游標(biāo)提取數(shù)據(jù)。從游標(biāo)得到一行數(shù)據(jù)使用FETCH命令。每一次提取數(shù)據(jù)后,游標(biāo)都指向結(jié)果集的下一行。語法如下: FETCH cursor_name INTO variable[,variable,...] 對于SELECT定義的游標(biāo)的每一列,F(xiàn)ETCH變量列表都應(yīng)該有一個變量與之相對應(yīng),變量的類型也要相同。 例: 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 這段代碼無疑是非常麻煩的,假如有多行返回結(jié)果,可以使用循環(huán)并用游標(biāo)屬性為結(jié)束循環(huán)的條件,以這種方式提取數(shù)據(jù),程序的可讀性和簡潔性都大為提高,下面我們使用循環(huán)重新寫上面的程序: 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,關(guān)于%ROWsTYPE的更多信息請參閱相關(guān)資料。 記錄變量用于從游標(biāo)中提取數(shù)據(jù)行,當(dāng)游標(biāo)選擇很多列的時候,那么使用記錄比為每列聲明一個變量要方便得多。 當(dāng)在表上使用%ROWTYPE并將從游標(biāo)中取出的值放入記錄中時,假如要選擇表中所有列,那么在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也可以用游標(biāo)名來定義,這樣的話就必須要首先聲明游標(biāo): 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; 帶參數(shù)的游標(biāo) 與存儲過程和函數(shù)相似,可以將參數(shù)傳遞給游標(biāo)并在查詢中使用。這對于處理在某種條件下打開游標(biāo)的情況非常有用。它的語法如下: CURSOR cursor_name[(parameter[,parameter],...)] IS select_statement; 定義參數(shù)的語法如下: Parameter_name [IN] data_type[{:=DEFAULT} value] 與存儲過程不同的是,游標(biāo)只能接受傳遞的值,而不能返回值。參數(shù)只定義數(shù)據(jù)類型,沒有大小。 另外可以給參數(shù)設(shè)定一個缺省值,當(dāng)沒有參數(shù)值傳遞給游標(biāo)時,就使用缺省值。游標(biāo)中定義的參數(shù)只是一個占位符,在別處引用該參數(shù)不一定可靠。 在打開游標(biāo)時給參數(shù)賦值,語法如下: OPEN cursor_name[value[,value]....]; 參數(shù)值可以是文字或變量。 例: 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; ; 游標(biāo)FOR循環(huán) 在大多數(shù)時候我們在設(shè)計程序的時候都遵循下面的步驟: 1、打開游標(biāo)。 2、開始循環(huán)。 3、從游標(biāo)中取值。 4、那一行被返回。 5、處理。 6、關(guān)閉循環(huán)。 7、關(guān)閉游標(biāo)。 可以簡單的把這一類代碼稱為游標(biāo)用于循環(huán)。但還有一種循環(huán)與這種類型不相同,這就是FOR循環(huán),用于FOR循環(huán)的游標(biāo)按照正常的聲明方式聲明,它的優(yōu)點在于不需要顯式的打開、關(guān)閉、取數(shù)據(jù),測試數(shù)據(jù)的存在、定義存放數(shù)據(jù)的變量等等。游標(biāo)FOR循環(huán)的語法如下: FOR record_name IN (corsor_name[(parameter[,parameter]...)] (query_difinition) LOOP statements END LOOP; 下面我們用for循環(huán)重寫上面的例子: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; 在游標(biāo)FOR循環(huán)中使用查詢 在游標(biāo)FOR循環(huán)中可以定義查詢,由于沒有顯式聲明所以游標(biāo)沒有名字,記錄名通過游標(biāo)查詢來定義。 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; 游標(biāo)中的子查詢 語法如下: CURSOR C1 IS SELECT * FROM emp WHERE deptno NOT IN (SELECT deptno FROM dept WHERE dname!='ACCOUNTING'); 可以看出與SQL中的子查詢沒有什么區(qū)別。 ; 游標(biāo)中的更新和刪除 在PL/SQL中依然可以使用UPDATE和DELETE語句更新或刪除數(shù)據(jù)行。顯式游標(biāo)只有在需要獲得多行數(shù)據(jù)的情況下使用。PL/SQL提供了僅僅使用游標(biāo)就可以執(zhí)行刪除或更新記錄的方法。 UPDATE或DELETE語句中的WHERE CURRENT OF子串專門處理要執(zhí)行UPDATE或DELETE操作的表中取出的最近的數(shù)據(jù)。要使用這個方法,在聲明游標(biāo)時必須使用FOR UPDATE子串,當(dāng)對話使用FOR UPDATE子串打開一個游標(biāo)時,所有返回集中的數(shù)據(jù)行都將處于行級(ROW-LEVEL)獨占式鎖定,其他對象只能查詢這些數(shù)據(jù)行,不能進行UPDATE、DELETE或SELECT...FOR UPDATE操作。 語法: FOR UPDATE [OF [schema.]table.column[,[schema.]table.column].. [nowait] 在多表查詢中,使用OF子句來鎖定特定的表,假如忽略了OF子句,那么所有表中選擇的數(shù)據(jù)行都將被鎖定。假如這些數(shù)據(jù)行已經(jīng)被其他會話鎖定,那么正常情況下Oracle將等待,直到數(shù)據(jù)行解鎖。 在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
標(biāo)簽: Oracle 數(shù)據(jù)庫
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲ab电影| 日本在线精品| 亚洲少妇一区| 视频在线观看一区| 无码日韩精品一区二区免费| 亚洲精品无吗| 日韩精品一区二区三区中文字幕| 国产高清日韩| 国产一区国产二区国产三区| 日韩高清中文字幕一区二区| 亚洲精品一区二区在线看| 爽好久久久欧美精品| 日本不卡高清| 国产精品亚洲综合久久| 亚洲国产福利| 午夜久久一区| 97久久中文字幕| a天堂资源在线| 亚洲免费网址| 国产丝袜一区| 欧美日韩免费看片| 蜜臀va亚洲va欧美va天堂| 日本午夜精品视频在线观看| 成人av三级| 亚洲开心激情| 国产v日韩v欧美v| 亚洲丝袜美腿一区| 在线人成日本视频| 久久最新视频| 久久精品理论片| 99riav1国产精品视频| 国产麻豆一区| 欧美福利专区| 久久久久伊人| 中文字幕视频精品一区二区三区| 国产成人久久| 蜜桃传媒麻豆第一区在线观看| 国产精品免费99久久久| 99精品国产一区二区三区| 日韩精品视频在线看| 香蕉视频亚洲一级| 国产精品夜夜夜| 在线综合视频| 麻豆91精品视频| 亚洲自啪免费| 欧美aa在线观看| 国产精品亲子伦av一区二区三区| 欧美91视频| 红杏一区二区三区| 日韩综合小视频| 99视频精品全国免费| 欧美日韩夜夜| 天使萌一区二区三区免费观看| 精品一区二区男人吃奶| 久久午夜精品一区二区| 免费污视频在线一区| 国产美女久久| 亚洲区欧美区| 99成人在线视频| 久久亚洲黄色| 日韩在线成人| 日韩视频久久| 久久精品亚洲人成影院| 老司机精品在线| 国产探花一区二区| 天堂久久av| 丝袜亚洲精品中文字幕一区| 国产99久久| 免费视频一区二区三区在线观看 | 欧美伊人影院| 亚洲综合精品| 999国产精品999久久久久久| а√天堂8资源在线| 国产精品日本一区二区不卡视频| 男人操女人的视频在线观看欧美| 久久天堂精品| 日韩欧美一区免费| 精品国产99| 麻豆久久一区| 国产精品成人3p一区二区三区| 日本免费新一区视频| 亚洲精品视频一二三区| 久久福利影视| 中文日韩在线| 五月婷婷六月综合| 免费黄色成人| 欧美日韩国产高清电影| 99精品视频在线| 999国产精品视频| 久久九九国产| 亚洲国产成人精品女人| 国产伊人精品| 亚洲精品123区| 首页欧美精品中文字幕| 综合激情网...| 亚洲精品乱码久久久久久蜜桃麻豆| 在线午夜精品| 亚洲精品福利| 国产探花在线精品| 国产精品网址| 久久精品女人| 亚洲伊人av| 亚洲电影在线| 亚洲欧美日韩国产| 天堂精品久久久久| 国产精品一区二区精品| 老牛国内精品亚洲成av人片| 电影91久久久| 久久国产中文字幕| 亚洲在线电影| 五月亚洲婷婷 | 老鸭窝亚洲一区二区三区| 精品1区2区3区4区| 亚久久调教视频| 国产精品v日韩精品v欧美精品网站| 国产精品片aa在线观看| 岛国av在线网站| 激情五月综合| 日韩精品第二页| 国产欧美日韩精品高清二区综合区 | 国产中文字幕一区二区三区| 麻豆国产在线| 国产一区亚洲| 午夜天堂精品久久久久| 国产精品男女| 成人精品中文字幕| 性欧美长视频| 日本不卡高清| 欧洲av不卡| 久久国产99| 日韩欧美激情| 97se综合| 日本伊人午夜精品| 天堂√8在线中文| 亚洲一区成人| 久久激情五月婷婷| 日韩欧美精品一区| 在线国产精品一区| 久久精品毛片| 伊人久久成人| 国产精品亚洲二区| 99热精品久久| 亚洲久久视频| 国产自产自拍视频在线观看| 国产精品三上| 激情不卡一区二区三区视频在线| 婷婷六月综合| 国产精品午夜av| 欧美/亚洲一区| 欧美日韩va| 日韩久久精品| 日韩超碰人人爽人人做人人添| 国产精东传媒成人av电影| 欧美~级网站不卡| 国产精品久久久久av蜜臀| 成人日韩在线| 国产日本亚洲| 国产欧美日韩影院| aⅴ色国产欧美| 麻豆中文一区二区| 视频一区欧美日韩| 高清一区二区三区av| 久久高清国产| 日韩av首页| 精品一区二区三区视频在线播放| 国产一区白浆| 免费福利视频一区二区三区| 色狠狠一区二区三区| 欧美肉体xxxx裸体137大胆| 日本aⅴ亚洲精品中文乱码| 国产99亚洲| 国产一区二区视频在线看| 国产亚洲在线观看| 首页国产精品| 日韩中文字幕| 日韩亚洲在线| 日本综合字幕| 美女国产一区二区三区| 一区二区国产在线| 国产精品毛片在线| 亚洲二区视频| 久久精品在线| 日韩成人a**站| 国产欧美69| 日韩中出av| 亚洲伊人影院| 亚州av日韩av| 黄色免费成人| 午夜av一区| 亚洲v在线看| 日韩国产专区| 97精品国产一区二区三区| 国产精品久久久久毛片大屁完整版| 亚洲精品第一| 亚洲一级大片| 亚洲视频电影在线| 视频一区二区三区在线| 天使萌一区二区三区免费观看| 99在线精品免费视频九九视| 一区免费视频|