【Oracle強化】④第四章 編寫遊標

1.使用遊標獲取部門表(dept)中的部門號deptno,部門名,傳遞部門號到遊標中,獲取在此部門中工作的員工姓名,工作,參加工作時間,工資。
如 部門號   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;


發佈了56 篇原創文章 · 獲贊 3 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章