Oracle存储过程及函数的练习题
生活随笔
收集整理的這篇文章主要介紹了
Oracle存储过程及函数的练习题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
--存儲過程、函數練習題--(1)創建一個存儲過程,以員工號為參數,輸出該員工的工資
create or replace procedure p_sxt1(v_empno in emp.empno%type, v_sal out emp.sal%type) is
beginselect sal into v_sal from emp where empno = v_empno;
end;
--(1)執行
declarev_empno emp.empno%type := 7369;v_sal emp.sal%type;
beginp_sxt1(v_empno,v_sal);dbms_output.put_line(v_empno || ' 員工的工資為:' || v_sal);
end;--(2)創建一個存儲過程,以員工號為參數,修改該員工的工資。若該員工屬于10號部門,
--則工資增加150;若屬于20號部門,則工資增加200;若屬于30號部門,則工資增加250;
--若屬于其他部門,則增加300。
create or replace procedure p_sxt2(v_empno in emp.empno%type) isv_deptno emp.deptno%type;v_sal emp.sal%type;
beginselect deptno into v_deptno from emp where empno = v_empno;select sal into v_sal from emp where empno = v_empno;dbms_output.put_line(v_empno || ' 的部門是 ' || v_deptno || ' 修改前的工資是 ' || v_sal);case v_deptnowhen 10 thenupdate emp set sal = sal + 150 where empno = v_empno;when 20 thenupdate emp set sal = sal + 200 where empno = v_empno;when 30 thenupdate emp set sal = sal + 250 where empno = v_empno;elseupdate emp set sal = sal + 300 where empno = v_empno;end case;select sal into v_sal from emp where empno = v_empno;dbms_output.put_line(v_empno || ' 的部門是 ' || v_deptno || ' 修改后的工資是 ' || v_sal);commit;
end;
--(2)執行
beginp_sxt2(7369);
end;--(3)創建一個存儲過程,以員工號為參數,返回該員工的工作年限(以參數形式返回)。
create or replace procedure p_sxt3(v_empno in emp.empno%type, v_year out number) is
beginselect round((sysdate - hiredate)/365,1) into v_year from emp where empno = v_empno;
end;
--(3)執行
declarev_empno emp.empno%type := 7369;v_year number;
beginp_sxt3(v_empno,v_year);dbms_output.put_line(v_empno || ' 工作年限為 ' || v_year || '年');
end;--(4)創建一個存儲過程,以部門號為參數,輸出入職日期最早的10個員工信息。
create or replace procedure p_sxt4(v_deptno emp.deptno%type) iscursor c_emp is select * from emp where deptno = v_deptno order by hiredate;v_times number := 0;
beginfor v_emp in c_emp loopv_times := v_times + 1;dbms_output.put_line(v_emp.empno || '**' || v_emp.ename || '**' || to_char(v_emp.hiredate,'yyyy-mm-dd'));if v_times = 10 thenexit;end if;end loop;
end;
--(4)執行
beginp_sxt4(20);
end;--(5)創建一個函數,以員工號為參數,返回該員工的工資。
create or replace function f_sxt5(v_empno emp.empno%type) return emp.sal%type isvr_sal emp.sal%type;
beginselect sal into vr_sal from emp where empno = v_empno;return vr_sal;
end;
--(5)執行
select f_sxt5(7369)||'元' 工資 from dual;--(6)創建一個函數,以部門號為參數,返回該部門的平均工資。
create or replace function f_sxt6(v_deptno emp.deptno%type) return emp.sal%type isvr_sal emp.sal%type;
beginselect avg(sal) into vr_sal from emp where deptno = v_deptno;return vr_sal;
end;
--(6)執行
select f_sxt6(20) 部門平均工資 from dual;--(7)創建一個函數,以員工號為參數,返回該員工所在的部門的平均工資。
create or replace function f_sxt7(v_empno emp.empno%type) return emp.sal%type isvr_sal emp.sal%type;
beginselect avg(sal) into vr_sal from emp where deptno = (select deptno from emp where empno = v_empno);return vr_sal;
end;
--(7)執行
select f_sxt7(7369) from dual;--(8)創建一個存儲過程,以員工號和部門號作為參數,修改員工所在的部門為所輸入的部門號。
--如果修改成功,則顯示“員工由……號部門調入調入……號部門”;如果不存在該員工,則顯示
--“員工號不存在,請輸入正確的員工號。”;如果不存在該部門,則顯示
--“該部門不存在,請輸入正確的部門號。”。
create or replace procedure p_sxt14(v_empno in emp.empno%type, v_deptno in emp.deptno%type) isvt_empno number := 0;vt_deptno number := 0;vm_deptno emp.deptno%type;
beginselect count(*) into vt_empno from emp where empno = v_empno;select deptno into vm_deptno from emp where empno = v_empno;select count(distinct deptno) into vt_deptno from emp where deptno = v_deptno;if vt_empno = 0 thendbms_output.put_line('員工號不存在,請輸入正確的員工號。');end if;if vt_deptno = 0 thendbms_output.put_line('該部門不存在,請輸入正確的部門號。');end if;if vt_empno = 1 and vt_deptno = 1 thendbms_output.put_line('員工由 ' || vm_deptno || ' 號部門調入調入 ' || v_deptno || ' 號部門');update emp set deptno = v_deptno where empno = v_empno;commit;end if;
end;
--(8)執行
beginp_sxt14(7369,30);
end;--(9)創建一個存儲過程,以一個整數為參數,輸入工資最高的前幾個(參數值)員工的信息。
create or replace procedure p_sxt15(v_number in number) iscursor c_emp is select * from emp order by sal desc;v_n number := 0;
beginfor v_emp in c_emp loopv_n := v_n + 1;dbms_output.put_line(v_n || ' - ' || v_emp.ename || ' - ' || v_emp.sal);if v_n = v_number thenexit;end if;end loop;
end;
--(9)執行
beginp_sxt15(5);
end;--(10)創建一個存儲過程,以兩個整數為參數,輸出工資排序在兩個參數之間的員工信息。
create or replace procedure p_sxt16(v_up in number,v_down in number) iscursor c_emp is select * from emp order by sal desc;v_n number := 0;
beginfor v_emp in c_emp loopv_n := v_n + 1;if v_n >= v_up and v_n <= v_down thendbms_output.put_line(v_n || ' - ' || v_emp.ename || ' - ' || v_emp.sal);end if;end loop;
end;
--(10)執行
beginp_sxt16(2,3);
end;
總結
以上是生活随笔為你收集整理的Oracle存储过程及函数的练习题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: nodejs字符与字节之间的转换
- 下一篇: Golang类型转换