如 部門號 10 部門名ACCOUNTING
張三 SALES 1999.1.1 3000
....
2.遊標處理中使用for update和where current of
在表中修改字段starts的值,sal字段中每一個1000,一個‘*’,如sal爲3500,四捨五入,starts打印4個'*'
建表語句如下:
CREATE TABLE copy_emp as select * from emp;
alter table copy_emp add starts varchar(20);
3.定義遊標,查詢emp表,如果工資大於2000,並且參加工作時間在82年之前,在屏幕上顯示員工的名字,工資和參加工作時間
4.定義代表部門號的兩個變量,屏幕上輸出這兩個部門的所有員工姓名與工資(這兩個變量作爲遊標的參數)
5.在一個塊中分別顯示薪水低於2000,在2000與4000之間,以
及大於4000的僱員名.(請使用遊標參數)
6.彙總每個部門每個職位員工的最高及平均工資,包括顯示部門名稱
和職位名稱,將數據存儲到Test表中。要求使用遊標
1.
DECLARE
CURSOR emp_dept_cursor IS
SELECT d.deptno,d.dname,e.ename,e.job,e.hiredate,e.sal FROM dept d,emp e WHERE d.deptno=e.deptno;
v_deptno dept.deptno%TYPE;
v_dname dept.dname%TYPE;
v_ename emp.ename%TYPE;
v_job emp.job%TYPE;
v_hiredate emp.hiredate%TYPE;
v_sal emp.sal%TYPE;
BEGIN
IF NOT emp_dept_cursor%ISOPEN THEN
OPEN emp_dept_cursor;
END IF;
LOOP
FETCH emp_dept_cursor INTO v_deptno,v_dname,v_ename,v_job,v_hiredate,v_sal;
EXIT WHEN emp_dept_cursor%NOTFOUND;
dbms_output.put_line('部門號:'||v_deptno);
dbms_output.put_line('部門名稱:'||v_dname);
dbms_output.put_line(v_ename);
dbms_output.put_line(v_job);
dbms_output.put_line(to_char(v_hiredate,'yyyy-mm-dd'));
dbms_output.put_line(v_sal);
dbms_output.put_line('==================');
END LOOP;
CLOSE emp_dept_cursor;
END;
2.
CREATE TABLE copy_emp as select * from emp;
alter table copy_emp add starts varchar(20);
DECLARE
CURSOR sal_emp IS
SELECT sal FROM copy_emp FOR UPDATE NOWAIT;
v_sal copy_emp.sal%TYPE;
BEGIN
IF NOT sal_emp%ISOPEN THEN
OPEN sal_emp;
END IF;
LOOP
FETCH sal_emp INTO v_sal;
EXIT WHEN sal_emp%NOTFOUND;
dbms_output.put_line(ROUND(v_sal/1000));
UPDATE copy_emp SET starts=LPAD(' ',ROUND(v_sal/1000)+1,'*') WHERE CURRENT OF sal_emp;
END LOOP;
END;
3.
DECLARE
CURSOR emp_cursor IS
SELECT ename,sal,hiredate FROM emp;
v_ename emp.ename%TYPE;
v_sal emp.sal%TYPE;
v_hiredate emp.hiredate%TYPE;
BEGIN
OPEN emp_cursor;
LOOP
FETCH emp_cursor INTO v_ename,v_sal,v_hiredate;
EXIT WHEN emp_cursor%NOTFOUND;
IF v_sal>2000 AND EXTRACT(YEAR FROM v_hiredate)<1982 THEN
dbms_output.put_line('員工姓名:'||v_ename);
dbms_output.put_line('員工薪資:'||v_sal);
dbms_output.put_line('入職時間:'||to_char(v_hiredate,'yyyy.mm.dd'));
dbms_output.put_line('===========================');
END IF;
END LOOP;
END;
4.
DECLARE
CURSOR emp_cursor(v_deptno1 NUMBER DEFAULT 30,v_deptno2 NUMBER DEFAULT 30) IS
SELECT ename,sal FROM emp WHERE deptno=v_deptno1 OR deptno=v_deptno2;
v_ename emp.ename%TYPE;
v_sal emp.sal%TYPE;
BEGIN
OPEN emp_cursor(v_deptno1=>&deptno1,v_deptno2=>&deptno2);
LOOP
FETCH emp_cursor INTO v_ename,v_sal;
EXIT WHEN emp_cursor%NOTFOUND;
dbms_output.put_line('員工姓名:'||v_ename);
dbms_output.put_line('員工工資:'||v_sal);
dbms_output.put_line('==================');
END LOOP;
CLOSE emp_cursor;
END;
5.
DECLARE
CURSOR emp_cursor(i_sal NUMBER,a_sal NUMBER) IS
SELECT ename FROM emp WHERE sal BETWEEN i_sal AND a_sal;
v_ename emp.ename%TYPE;
BEGIN
dbms_output.put_line('薪水低於2000的是:');
FOR emp_record IN emp_cursor(0,2000) LOOP
dbms_output.put_line('員工姓名:'||emp_record.ename);
END LOOP;
dbms_output.put_line('薪水在2000與4000之間的是:');
FOR emp_record IN emp_cursor(2000,4000) LOOP
dbms_output.put_line('員工姓名:'||emp_record.ename);
END LOOP;
dbms_output.put_line('薪水高於4000的是:');
FOR emp_record IN emp_cursor(4000,20000000) LOOP
dbms_output.put_line('員工姓名:'||emp_record.ename);
END LOOP;
END;
6.
CREATE VIEW vw_sal_dept AS
SELECT max(s.sal) max_sal,AVG(s.sal) avg_sal,s.deptno FROM(SELECT e.sal,e.job,d.deptno FROM emp e,dept d WHERE e.deptno=d.deptno) s GROUP BY s.deptno;
CREATE VIEW vw_sal_job_dept AS
SELECT v.max_sal,v.avg_sal,d.dname,e.job FROM vw_sal_dept v,emp e,dept d WHERE v.max_sal=e.sal AND v.deptno=d.deptno AND e.deptno=d.deptno;
DECLARE
CURSOR emp_dept_cursor IS
SELECT v.max_sal,v.avg_sal,v.job,v.dname FROM vw_sal_job_dept v;
v_max vw_sal_job_dept.max_sal%TYPE;
v_avg vw_sal_job_dept.avg_sal%TYPE;
v_job vw_sal_job_dept.job%TYPE;
v_dname vw_sal_job_dept.dname%TYPE;
BEGIN
OPEN emp_dept_cursor;
LOOP
FETCH emp_dept_cursor INTO v_max,v_avg,v_job,v_dname;
EXIT WHEN emp_dept_cursor%NOTFOUND;
INSERT INTO TEST VALUES(v_max,v_avg,v_job,v_dname);
END LOOP;
END;