日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

PL/SQL经典练习

發布時間:2023/12/3 数据库 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PL/SQL经典练习 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
/* =========================================================PL/SQL編程 ========================================================= */--先把scott里面的表弄到test表空間里面來 CREATE TABLE EMP ASSELECT * FROM SCOTT.EMP; CREATE TABLE DEPT ASSELECT * FROM SCOTT.DEPT; /* 上機1 */ --(1)計算King所交稅金DECLARE V_SHUIJIN NUMBER; --應交稅金V_SAL SCOTT.EMP.SAL%TYPE; --工資C_QIZHENDIAN CONSTANT NUMBER :=3500; BEGINSELECT SAL INTO V_SAL FROM SCOTT.EMP WHERE ENAME='KING';IF (V_SAL-C_QIZHENDIAN)<=1500 THENV_SHUIJIN:=(V_SAL-C_QIZHENDIAN)*0.03-0;ELSIF (V_SAL-C_QIZHENDIAN)>1500 AND (V_SAL-C_QIZHENDIAN)<=4500 THENV_SHUIJIN:=(V_SAL-C_QIZHENDIAN)*0.1-105;ELSIF (V_SAL-C_QIZHENDIAN)>4500 AND (V_SAL-C_QIZHENDIAN)<=9000 THENV_SHUIJIN:=(V_SAL-C_QIZHENDIAN)*0.2-555;ELSIF (V_SAL-C_QIZHENDIAN)>9000 AND (V_SAL-C_QIZHENDIAN)<=35000 THENV_SHUIJIN:=(V_SAL-C_QIZHENDIAN)*0.25-1005;ELSIF (V_SAL-C_QIZHENDIAN)>35000 AND (V_SAL-C_QIZHENDIAN)<=55000 THENV_SHUIJIN:=(V_SAL-C_QIZHENDIAN)*0.3-2755;ELSIF (V_SAL-C_QIZHENDIAN)>55000 AND (V_SAL-C_QIZHENDIAN)<=80000 THENV_SHUIJIN:=(V_SAL-C_QIZHENDIAN)*0.35-5505;ELSIF (V_SAL-C_QIZHENDIAN)>80000 THENV_SHUIJIN:=(V_SAL-C_QIZHENDIAN)*0.45-13505;END IF;DBMS_OUTPUT.PUT_LINE('KING所交的稅金是:'||V_SHUIJIN); END;--(2)根據員工scott入職的時間修改發放獎金列,大于等于6年的獎金為2000,小于6年的獎金是1500 DECLARE V_SCOTT_HIREDATE EMP.HIREDATE%TYPE; --SCOTT的入職時間V_COMM NUMBER; --獎金 BEGINSELECT HIREDATE INTO V_SCOTT_HIREDATE FROM EMP WHERE ENAME='SCOTT';IF (SYSDATE-V_SCOTT_HIREDATE)>=365*6 THENV_COMM:=2000;ELSEV_COMM:=1500;END IF;--開始修改UPDATE EMP SET COMM=V_COMM WHERE ENAME='SCOTT';IF SQL%ROWCOUNT>0 THENDBMS_OUTPUT.PUT_LINE('修改成功!');ELSEDBMS_OUTPUT.PUT_LINE('修改失敗!');END IF; END;--(3)查詢scott相應的工資級別并顯示所在部門名稱,薪水,和所在的級別 DECLARE V_SCOTT_SAL EMP.SAL%TYPE; --scott的工資V_JIBIE NUMBER; --級別V_DEPTNAME DEPT.DNAME%TYPE; --部門名稱 BEGINSELECT SAL,DNAME INTO V_SCOTT_SAL,V_DEPTNAME FROM EMP E JOIN DEPT DON E.DEPTNO=D.DEPTNOWHERE ENAME='SCOTT';IF V_SCOTT_SAL>700 AND V_SCOTT_SAL<=3200 THENV_JIBIE:=1; --第一級別ELSIF V_SCOTT_SAL>3200 AND V_SCOTT_SAL<=4400 THENV_JIBIE:=2; --第二級別ELSIF V_SCOTT_SAL>4400 AND V_SCOTT_SAL<=5000 THENV_JIBIE:=3; --第三級別ELSIF V_SCOTT_SAL>5000 AND V_SCOTT_SAL<=7000 THENV_JIBIE:=4; --第四級別ELSIF V_SCOTT_SAL>7000 AND V_SCOTT_SAL<=10000 THENV_JIBIE:=5; --第五級別END IF;DBMS_OUTPUT.PUT_LINE('SCOTT所在的部門是:'||V_DEPTNAME||',薪水是:'||V_SCOTT_SAL||',所在的級別是:第'||V_JIBIE||'級別'); END; --(4)位員工scott增加工資,每次增加100,直到增加到10000為止 DECLARE V_SCOTT_SAL EMP.SAL%TYPE; --SCOTT的工資 BEGINSELECT SAL INTO V_SCOTT_SAL FROM EMP WHERE ENAME='SCOTT';LOOP--增加工資V_SCOTT_SAL:=V_SCOTT_SAL+100;EXIT WHEN V_SCOTT_SAL>=10000;END LOOP; --修改scott的工資UPDATE EMP SET SAL=V_SCOTT_SAL WHERE ENAME='SCOTT';IF SQL%ROWCOUNT>0 THENDBMS_OUTPUT.PUT_LINE('增加成功!');ELSEDBMS_OUTPUT.PUT_LINE('增加失敗!');END IF; END; /* 上機2 預定義異常 公司通過emp表維護職員記錄,用以接收職員編號并檢索職員姓名, */ DECLARE V_ENAME VARCHAR2(4); BEGINSELECT ENAME INTO V_ENAME FROM EMP WHERE EMPNO=&EMPNO;DBMS_OUTPUT.PUT_LINE('已找到'||V_ENAME); EXCEPTIONWHEN NO_DATA_FOUND THENDBMS_OUTPUT.PUT_LINE('對不起,沒有該職員!');WHEN VALUE_ERROR THENDBMS_OUTPUT.PUT_LINE('職員名稱太長!');WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('出現其他的異常!'); END;/* 上機3自定義異常、 ||輸入員工編號,工資,部門編號, ||如果部門代碼是10,且工資低于10000,更新員工的工資是10000 ||如果部門代碼是10,工資高于10000,顯示消息“工資不低于10000” ||如果部門代碼不是10則不顯示 */ DECLARE V_EMPNO EMP.EMPNO%TYPE; --員工編號V_DEPTNO EMP.DEPTNO%TYPE; --部門編號V_SAL EMP.SAL%TYPE; --工資V_ENAME EMP.ENAME%TYPE; --姓名 V_V_EMPNO EMP.EMPNO%TYPE; --輸入員工編號V_V_DEPTNO EMP.DEPTNO%TYPE; --輸入部門編號V_V_SAL EMP.SAL%TYPE; --輸入工資E_ERROR_DEPTNO EXCEPTION; --自定義異常(部門編號不是10)E_ERROR_EMPNO EXCEPTION; --自定義異常(找不到該員工)V_COUNT NUMBER; --聲明一個記錄數 BEGIN--輸入員工編號V_EMPNO:=&V_V_EMPNO;--輸入工資V_SAL:=&V_VSAL;--輸入部門編號V_DEPTNO:=&V_V_DEPTNO;IF V_DEPTNO=10 THEN--在進行二次判斷(輸入員工編號)IF V_SAL<10000 THEN--判斷輸入的員工編號是否存在,不存在的話報異常,存在的話繼續SELECT COUNT(*) INTO V_COUNT FROM EMP WHERE EMPNO=V_DEPTNO;IF V_COUNT!=1 THENRAISE E_ERROR_EMPNO; --報異常ELSE--更新工資為1000UPDATE EMP SET SAL=10000 WHERE EMPNO=V_EMPNO;IF SQL%ROWCOUNT>0 THENDBMS_OUTPUT.PUT_LINE('更新成功!!!');ELSEDBMS_OUTPUT.PUT_LINE('更新失敗!!!');END IF;END IF; ELSIF V_SAL>10000 THENDBMS_OUTPUT.PUT_LINE('工資不低于10000!!');END IF;ELSERAISE E_ERROR_DEPTNO;END IF; EXCEPTION WHEN E_ERROR_DEPTNO THENDBMS_OUTPUT.PUT_LINE('部門代碼不是10!!');WHEN OTHERS THENDBMS_OUTPUT.PUT_LINE('出現其他異常,請自行解決!!!'); END; ------------------------------------------------------SELECT * FROM EMP; DECLARE V_NAME EMP.ENAME%TYPE;E_ERROR EXCEPTION;V_COUNT NUMBER; --記錄數 BEGINSELECT COUNT(*) INTO V_COUNT FROM EMP WHERE EMPNO=7901;IF (V_COUNT=1) THENDBMS_OUTPUT.PUT_LINE(V_NAME);ELSERAISE E_ERROR;END IF;EXCEPTION WHEN E_ERROR THENDBMS_OUTPUT.PUT_LINE('沒有記錄!');/*when no_data_found thenDBMS_OUTPUT.PUT_LINE('找不到!');*/END; ------------------------------------------------------------- DECLARE V_NAME VARCHAR2(10);E_ERROR EXCEPTION; BEGINIF V_NAME IS NULL THENRAISE E_ERROR;ELSE DBMS_OUTPUT.PUT_LINE(V_NAME);END IF;EXCEPTION WHEN E_ERROR THENDBMS_OUTPUT.PUT_LINE('沒有記錄!');END;/* //上機4使用游標 */--(1)計算公司應交稅金的總額 DECLARE V_SHUIJIN NUMBER; --應交稅金V_SAL SCOTT.EMP.SAL%TYPE; --工資V_SUM NUMBER(10):=0; --總稅金C_QIZHENDIAN CONSTANT NUMBER :=3500;CURSOR CURSOR_SAL ISSELECT SAL FROM EMP; --所有的員工的工資 BEGINOPEN CURSOR_SAL; LOOPFETCH CURSOR_SAL INTO V_SAL;--把所有的工資放在V_SAL里面EXIT WHEN CURSOR_SAL%NOTFOUND;IF (V_SAL-C_QIZHENDIAN)<=1500 THENV_SHUIJIN:=(V_SAL-C_QIZHENDIAN)*0.03-0;ELSIF (V_SAL-C_QIZHENDIAN)>1500 AND (V_SAL-C_QIZHENDIAN)<=4500 THENV_SHUIJIN:=(V_SAL-C_QIZHENDIAN)*0.1-105;ELSIF (V_SAL-C_QIZHENDIAN)>4500 AND (V_SAL-C_QIZHENDIAN)<=9000 THENV_SHUIJIN:=(V_SAL-C_QIZHENDIAN)*0.2-555;ELSIF (V_SAL-C_QIZHENDIAN)>9000 AND (V_SAL-C_QIZHENDIAN)<=35000 THENV_SHUIJIN:=(V_SAL-C_QIZHENDIAN)*0.25-1005;ELSIF (V_SAL-C_QIZHENDIAN)>35000 AND (V_SAL-C_QIZHENDIAN)<=55000 THENV_SHUIJIN:=(V_SAL-C_QIZHENDIAN)*0.3-2755;ELSIF (V_SAL-C_QIZHENDIAN)>55000 AND (V_SAL-C_QIZHENDIAN)<=80000 THENV_SHUIJIN:=(V_SAL-C_QIZHENDIAN)*0.35-5505;ELSIF (V_SAL-C_QIZHENDIAN)>80000 THENV_SHUIJIN:=(V_SAL-C_QIZHENDIAN)*0.45-13505;END IF;V_SUM:=V_SUM+V_SHUIJIN;END LOOP; CLOSE CURSOR_SAL; --關閉游標DBMS_OUTPUT.PUT_LINE(V_SUM); EXCEPTION WHEN OTHERS THENDBMS_OUTPUT.PUT_LINE('出現異常!'); END; --(2)根據員工入職時間修改所有員工發放獎金,大于6年的+2000,小于的1500+ DECLARE V_COMM EMP.COMM%TYPE; --獎金CURSOR CURSOR_EMP_COMM IS SELECT HIREDATE FROM EMP FOR UPDATE;BEGINFOR CUR1 IN CURSOR_EMP_COMM LOOPIF (SYSDATE-CUR1.HIREDATE)>=365*6 THENV_COMM:=2000;ELSEV_COMM:=1500;END IF; --開始修改UPDATE EMP SET COMM=V_COMM WHERE CURRENT OF CURSOR_EMP_COMM;IF SQL%ROWCOUNT>0 THENDBMS_OUTPUT.PUT_LINE('更新成功!!!');ELSEDBMS_OUTPUT.PUT_LINE('更新失敗!!!');END IF;END LOOP; EXCEPTION WHEN OTHERS THENDBMS_OUTPUT.PUT_LINE('出現異常!'); END; --(3)顯示員工姓名,所在部門名稱,薪水,所在級別 DECLARE C_DNAME CONSTANT VARCHAR2(20):='SALES'; --銷售部門V_JIBIE NUMBER; --級別CURSOR CURSOR_EMP IS SELECT ENAME,DNAME,SAL FROM EMP EJOIN DEPT D ON E.DEPTNO=D.DEPTNOWHERE DNAME=C_DNAME; BEGINFOR C1 IN CURSOR_EMP LOOPIF C1.SAL>700 AND C1.SAL<=3200 THENV_JIBIE:=1; --第一級別ELSIF C1.SAL>3200 AND C1.SAL<=4400 THENV_JIBIE:=2; --第二級別ELSIF C1.SAL>4400 AND C1.SAL<=5000 THENV_JIBIE:=3; --第三級別ELSIF C1.SAL>5000 AND C1.SAL<=7000 THENV_JIBIE:=4; --第四級別ELSIF C1.SAL>7000 AND C1.SAL<=10000 THENV_JIBIE:=5; --第五級別ELSEV_JIBIE:=0; --沒有級別END IF;DBMS_OUTPUT.put_line(C1.ENAME||'在'||C1.DNAME||'部門,'||'薪水是'||C1.SAL||'在第'||V_JIBIE||'級別');END LOOP; EXCEPTIONWHEN OTHERS THENDBMS_OUTPUT.PUT_LINE('出現異常!'); END;/* 上機5 存儲過程 */ --(1)根據輸入的員工編號,刪除相應的員工 CREATE OR REPLACE PROCEDURE DEL_EMPNAME (ENO EMP.EMPNO%TYPE, --輸入員工的編號ON_FLAG OUT NUMBER, --執行狀態,-1失敗,1成功 0異常ON_MSG OUT VARCHAR --提示信息) IS E_ERROR EXCEPTION; --異常信息 BEGINDELETE FROM EMP WHERE EMPNO=ENO;IF SQL%NOTFOUND THENRAISE E_ERROR;ELSEON_FLAG:=1; --執行成功ON_MSG:='刪除成功!';END IF; EXCEPTION WHEN E_ERROR THENON_FLAG:=0; --執行成功ON_MSG:='刪除失敗!';WHEN OTHERS THENON_FLAG:=0;ON_MSG:='出現異常!'; END; DROP PROCEDURE DEL_EMPNAME; --調用存儲過程 DECLARE V_EMPNO NUMBER;ENO NUMBER(5);ON_FLAG NUMBER(1);ON_MSG VARCHAR(20); BEGINENO:=&EMPNO; --輸入編號DEL_EMPNAME(ENO,ON_FLAG,ON_MSG);DBMS_OUTPUT.PUT_LINE(ON_FLAG);DBMS_OUTPUT.PUT_LINE(ON_MSG); END;--(2)創建輸出參數為薪水集合的存儲過程,調用并顯示所有員工的薪水CREATE OR REPLACE PROCEDURE get_sals(cur_salary OUT SYS_REFCURSOR,on_Flag OUT number, ? ? ? --執行狀態os_Msg OUT VARCHAR2 ? ? ? --提示信息 )? AS BEGINOPEN cur_salary FORSELECT empno,sal FROM employee;on_Flag:=1;os_Msg:='成功'; ? ? ?? EXCEPTIONWHEN OTHERS THENon_Flag:=-1;os_Msg:='其他錯誤,與管理員聯系。'; END;DECLAREv_empno ?employee.empno%type;v_sal employee.sal%type;emp_salary SYS_REFCURSOR;on_Flag number(1); ? ? --執行狀態os_Msg VARCHAR2(200); ? ? ? --提示信息 ? ? BEGINget_sals(emp_salary,on_Flag,os_Msg);IF on_flag=1 THENLOOPFETCH emp_salary INTO v_empno, v_sal;EXIT WHEN emp_salary%notfound;DBMS_OUTPUT.PUT_LINE(v_empno||'的薪水是' ||v_sal);END LOOP;ELSEdbms_output.put_line(os_Msg);END IF;IF emp_salary%ISOPEN THENCLOSE emp_salary;END IF; END;

總結

以上是生活随笔為你收集整理的PL/SQL经典练习的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。