plsql(轻量版)_游标的使用2
生活随笔
收集整理的這篇文章主要介紹了
plsql(轻量版)_游标的使用2
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
游標你們記得,它是處理多行數據的,有點類似于集合里面的迭代器一樣,一條條給你遍歷打印一下,這個也是給他取出一條條的數據,就要使用到游標14. 利用游標, 調整公司中員工的工資: 工資范圍 調整基數0 - 5000 5%5000 - 10000 3%10000 - 15000 2%15000 - 1%declare--定義游標cursor emp_sal_cursor is select salary, employee_id from employees;--定義基數變量temp number(4, 2);--定義存放游標值的變量v_sal employees.salary%type;v_id employees.employee_id%type;
begin--打開游標open emp_sal_cursor;--提取游標fetch emp_sal_cursor into v_sal, v_id;--處理游標的循環操作while emp_sal_cursor%found loop--判斷員工的工資, 執行 update 操作--dbms_output.put_line(v_id || ': ' || v_sal);if v_sal <= 5000 thentemp := 0.05;elsif v_sal<= 10000 thentemp := 0.03; elsif v_sal <= 15000 thentemp := 0.02;elsetemp := 0.01;end if;--dbms_output.put_line(v_id || ': ' || v_sal || ', ' || temp);update employees set salary = salary * (1 + temp) where employee_id = v_id; fetch emp_sal_cursor into v_sal, v_id;end loop;--關閉游標close emp_sal_cursor;
end;使用SQL中的 decode 函數update employees set salary = salary * (1 + (decode(trunc(salary/5000), 0, 0.05,1, 0.03,2, 0.02,0.01)))利用游標,調整公司中員工的工資,工資的范圍,還有調整所有員工的工資,有多條數據了,所以要用游標,除了游標之外,是不是還要定義其他的變量,比如我們的SQL寫的比較熟了,假設他要調整公司的工資的話,就這樣寫,update,employees,然后set一個salary,等于salary加上一個工資范圍,那得乘以一個,1加上一個百分比,百分之幾我們用一個變量來表示,這個變量怎么得到的,你后邊加上一個什么什么東西,然后where跟他對應的是哪一個人,百分之三,0.03,然后where,對于102這個人來講,這個人是加0.03,換個人是0.05,所以這是一個變量,這也應該是一個變量,這個變量,隨著這個變量的人的不同,然后這個salary,因為你要想得到這個0.03,這個你要是想不到的話,你可以去寫,你發現這個變量如果不夠用了,你就再來聲明唄,就可以,declare聲明,先是多個員工,多個員工可以使用到游標,游標emp_sal_cursor,前面加上一個cursor,is select,我這要獲取哪些信息,這個你要是沒想到的話你可以先寫,不夠的話再來補,salary from employees,這是聲明一個游標,然后呢每個人,獲取哪些信息,這個你要是沒想到的話你就先寫,不夠的話再來補,工資按照標準來調,我用一個變量來記錄一下,每個人調整的幅度是多少,number類型的,也是兩個小數,另外呢,我查詢出來的employee_id,salary,我得用兩個變量來存,v_empid,employees的employee_id,同時還有一個salary,這是我們聲明的幾個變量,然后這個變量是調整的基數,用于記錄調整基數,你把查詢的放到這里邊,這是declare,然后begin,要做的,關于游標,open,打開游標,獲取游標,fetch,into,放到兩個變量里,v_empid,這里先寫的id,后寫的salary,fetch,into他,while,found有數據,然后進行一個循環,執行一個循環,如果,如果什么啊,v_sal是小于,不包括5000,then,v_temp冒號等于,0.05,elsif,那就是這個,小于1萬,v_temp等于0.03,else,最后一個,v_temp,0.01,這個完了以后,end if,結束這條件判斷,我通過這個條件判斷,記錄一下v_temp的值是多少,下一步,沒執行一次他,需要更新一個人,那我們這個時候就要寫一個SQL語句,update employees,然后呢,set salary等于,salary*(1+v_temp),然后where employee_id等于v_empid,這個是成對出現的,調整的是這個人的工資,這就是被他更新了一條,更新完了一條以后,別忘了這個while循環,還得再fetch一下,fetch完了以后,end loop,然后end結束,close,當然沒啥效果,先rollback一下,我打印一下這個v_sal,調整完以后,這個v_sal是變量的,你想打印salary的,還得重新給他賦一個值,否則我們看不到新的值,就是舊的employee_id和salary,這是舊的,update employeesselect * from employees;
rollback就回滾了
這個我們寫的也沒有問題,如果我就不用PL/SQL語言去update,用SQL能不能實現,也能,SQL也能實現,update這個表里邊的,工資改成什么,要看這個人的工資是多少了,我們這里也是一個條件語句,定義了decode,這個是我們之前就能寫的,把這個salary除以5000一比,然后trunc一下得到一個值,看這個值是0的話,存到0.05,1的是1萬,存到0.03,然后salary加上1的值,這是使用的是SQL,用游標for完成剛才的1415. 利用游標 for 循環完成 14. declare--定義游標cursor emp_sal_cursor is select salary, employee_id id from employees;--定義基數變量temp number(4, 2);
begin--處理游標的循環操作for c in emp_sal_cursor loop--判斷員工的工資, 執行 update 操作--dbms_output.put_line(v_id || ': ' || v_sal);if c.salary <= 5000 thentemp := 0.05;elsif c.salary <= 10000 thentemp := 0.03; elsif c.salary <= 15000 thentemp := 0.02;elsetemp := 0.01;end if;--dbms_output.put_line(v_id || ': ' || v_sal || ', ' || temp);update employees set salary = salary * (1 + temp) where employee_id = c.id;end loop;
end;游標for的區別就是,打開關閉,自動的去fetch,他自己就可以完成了,大家看,for,取一個變量叫c,然后in,loop,c現在直接指向的是employees的salary,實際上這兩個變量也用不著了,如果c.salary,它是小于5000的,然后then,就這樣處理,elsif,c.salary,end if結束他,update他,然后salary等于他,這個得改一下,c.employee_id,就這樣寫,然后update完了以后,end loopdeclarecursor emp_sal_cursor is select employee_id,salary from employees;v_temp number(4,2);beginfor c in emp_sal_cursor loopif c.salary < 5000 then v_temp := 0.05;elsif c.salary < 10000 then v_temp := 0.03;elsif c.salary < 15000 then v_temp := 0.02;else v_temp := 0.01;end if;update employeesset salary = salar * (1+ v_temp)where employee_id = c.employee_id;end loop;end;
顯然使用for循環來處理要簡單一些,帶參數的游標16*. 帶參數的游標declare--定義游標cursor emp_sal_cursor(dept_id number, sal number) is select salary + 1000 sal, employee_id id from employees where department_id = dept_id and salary > sal;--定義基數變量temp number(4, 2);
begin--處理游標的循環操作for c in emp_sal_cursor(sal => 4000, dept_id => 80) loop--判斷員工的工資, 執行 update 操作--dbms_output.put_line(c.id || ': ' || c.sal);if c.sal <= 5000 thentemp := 0.05;elsif c.sal <= 10000 thentemp := 0.03; elsif c.sal <= 15000 thentemp := 0.02;elsetemp := 0.01;end if;dbms_output.put_line(c.sal || ': ' || c.id || ', ' || temp);--update employees set salary = salary * (1 + temp) where employee_id = c.id;end loop;
end;這個了解一下,什么叫代參數的游標,我們不是聲明一個游標嗎,這個游標的名字,我直接is select,這里我寫了兩個變量,這個變量是記錄dept的id,那就是部門id,比較類似于局部變量,salary也是一個number類型的,然后我在這個select語句當中,使用了這兩個變量,當你真正在調用這個cursor的時候,我只能用兩個變量的值,要不是這樣我們就寫到這兒了,比如說啊,select salary加上1千,employee_id,from他,department_id等于我這個變量,然后salary還要大于多少,你要是不在這寫的話,直接放到這就相當于寫死了,這個就是動態的,當你調用的時候,這個就是我們說的賦值符號,表示給他賦值,salary,這個是80號部門的,再下面的調用是一樣的,沒啥區別,只是select語句寫成變量了
17. 隱式游標: 更新指定員工 salary(漲工資 10),如果該員工沒有找到,則打印”查無此人” 信息beginupdate employees set salary = salary + 10 where employee_id = 1005;if sql%notfound thendbms_output.put_line('查無此人!');end if;
end;有個叫隱式游標,有顯示游標,還有叫隱式游標,這個你也了解一下,隱式游標肯定不需要你顯示的cursor定義一下,直接相當于就可以用,這個怎么來理解,如果員工沒找到,打印沒此人,直接begin,更新update,employees,set salary等于salary加上10,指定員工的employee_id等于101,然后我再加上這個,如果這個員工沒找著,判斷是一個SQL語句,如果SQL語句定義的記錄沒有找著,notfound,有found也有notfound,如果沒找著,就then,打印查無此人,然后end if,結束,這里面實際上用到這個了,執行成了,說明有這個人beginupdate employeesset salary = salary + 10where employee_id = 101;if sql%notfound then dbms_output.put_line('查無此人');end if;end;
beginupdate employeesset salary = salary + 10where employee_id = 1001;if sql%notfound then dbms_output.put_line('查無此人');end if;end;
通過它來理解一下,它是叫隱式游標,他沒有顯示的定義,但是這個是個SQL語句,我通過判斷SQL語句,是否存在這個值,返回這個結果,有一條數據,判斷是否執行這個語句,這個叫隱式游標,那么游標講到這就完了,你們知道我們用游標來做什么,如果你要處理多行數據的話,增刪改查,如果涉及到多行數據,多條數據,我們就給他定義成游標,的形式
?
總結
以上是生活随笔為你收集整理的plsql(轻量版)_游标的使用2的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: plsql(轻量版)_游标的使用1
- 下一篇: plsql(轻量版)_异常处理机制