oracle中函數和遊標的使用
--建立函數並且調用create function fun1(v_in_ename varchar2)return number isv_annual_sal number;begin select (sal+nvl(comm,0))*13 into v_annual_sal from emp where ename=v_in_ename; return v_annual_sal;end;/--直接調用函數var v_annual_sal number;call fun1('FORD') into:v_annual_sal;print v_annual_sal;--包--需求:編寫一個包,該包有一個過程,該過程可以接收使用者名稱和新的薪水--(將來用於通過使用者名稱去更新薪水)還有一個函數,該函數可以接收一個使用者名稱--(將來要實現得到該使用者的年薪是多少)create package mypackage1 is--聲明一個過程procedure pro1(v_in_ename varchar2,v_in_newsal number);function fun1(v_in_ename varchar2) return number;end;--編寫包體create package body mypackage1 is--具體實現過程procedure pro1(v_in_ename varchar2,v_in_newsal number) isbegin update emp set sal=v_in_newsal where ename=v_in_ename;end;function fun1(v_in_ename varchar2) return number is v_annual_sal number;begin select (sal+nvl(comm,0))*13 into v_annual_sal from emp where ename=v_in_ename; return v_annual_sal;end;end;/ --pl/sql詳細文法create or replace procedure pro1(v_in_empno number) is--定義變數v_tax_rate number :=0.03;v_sal number;v_tax number;v_ename varchar2(32);beginselect ename,sal into v_ename,v_sal from empwhere empno=v_in_empno;v_tax:=v_sal*v_tax_rate;dbms_output.put_line(v_ename||'工資是='||v_sal||'個人所得稅='||v_tax);end;--pl/sql中使用%type 來提高列的靈活性create or replace procedure pro1(v_in_empno number) is--定義變數v_tax_rate number :=0.03;v_sal emp.sal%type;v_tax number;v_ename emp.ename%type;beginselect ename,sal into v_ename,v_sal from empwhere empno=v_in_empno;v_tax:=v_sal*v_tax_rate;dbms_output.put_line(v_ename||'工資是='||v_sal||'個人所得稅='||v_tax);end;--【案例】編寫一個過程,該過程可以接收一個使用者編號,--並顯示該使用者的名字,薪水,工作崗位(注意:使用pl/sql記錄實現)create or replace procedure pro1(v_in_empno in number) is--定義記錄資料類型type zy_emp_record is record(v_ename emp.ename%type,v_sal emp.sal%type,v_job emp.job%type);--定義一個變數,類型是zy_emp_recordv_emp_record zy_emp_record;beginselect ename,sal,job into v_emp_recordfrom emp where empno=v_in_empno;dbms_output.put_line('使用者名稱:'||v_emp_record.v_ename||'薪水='||v_emp_record.v_sal);end;--遊標的使用create or replace procedure pro1(v_in_deptno number) is--先定義一個遊標變數類型type zy_emp_cursor is ref cursor;--定義一個遊標變數v_emp_cursor zy_emp_cursor;--定義2個變數v_ename emp.ename%type;v_sal emp.sal%type;begin--執行語句open v_emp_cursor for select ename,sal from emp where deptno=v_in_deptno;--取出遊標指向的每行資料,用迴圈語句loopfetch v_emp_cursor into v_ename,v_sal; --這句話執行後會引起v_emp_cursor向下走--判斷當前遊標是否到達最後exit when v_emp_cursor%notfound;--輸出dbms_output.put_line('使用者名稱='||v_ename||' 薪水='||v_sal);end loop;--關閉遊標close v_emp_cursor;end;--遊標的使用,在上面的基礎上添加工資create or replace procedure pro1(v_in_deptno number) is--先定義一個遊標變數類型type zy_emp_cursor is ref cursor;--定義一個遊標變數v_emp_cursor zy_emp_cursor;--定義2個變數v_ename emp.ename%type;v_sal emp.sal%type;v_empno emp.empno%type;begin--執行語句open v_emp_cursor for select ename,sal,empno from emp where deptno=v_in_deptno;--取出遊標指向的每行資料,用迴圈語句loopfetch v_emp_cursor into v_ename,v_sal,v_empno; --這句話執行後會引起v_emp_cursor向下走--判斷當前遊標是否到達最後exit when v_emp_cursor%notfound;--輸出dbms_output.put_line('使用者名稱='||v_ename||' 薪水='||v_sal);if v_sal <2000 then update emp set sal=sal+1000 where empno=v_empno;end if;end loop;--關閉遊標close v_emp_cursor;end;