PL/SQL经典练习
发布日期:2021-05-14 13:05:35 浏览次数:20 分类:精选文章

本文共 6410 字,大约阅读时间需要 21 分钟。

PL/SQL������������������

������������������������������

���������������

���������������������SCOTT������������������������������TEST������������

CREATE TABLE TEST.EMP AS SELECT * FROM SCOTT.EMP; CREATE TABLE TEST.DEPT AS SELECT * FROM SCOTT.DEPT;

King���������������������

������������������������������������������������������

DECLARE V_SHUIJIN NUMBER; V_SAL SCOTT.EMP.SAL%TYPE; C_QIZHENDIAN CONSTANT NUMBER := 3500; BEGIN SELECT SAL INTO V_SAL FROM SCOTT.EMP WHERE ENAME='KING'; IF (V_SAL - C_QIZHENDIAN) <= 1500 THEN V_SHUIJIN := (V_SAL - C_QIZHENDIAN) * 0.03 - 0; ELSIF (V_SAL - C_QIZHENDIAN) > 1500 AND (V_SAL - C_QIZHENDIAN) < 4500 THEN V_SHUIJIN := (V_SAL - C_QIZHENDIAN) * 0.1 - 105; ELSIF (V_SAL - C_QIZHENDIAN) > 4500 AND (V_SAL - C_QIZHENDIAN) < 9000 THEN V_SHUIJIN := (V_SAL - C_QIZHENDIAN) * 0.2 - 555; ELSIF (V_SAL - C_QIZHENDIAN) > 9000 AND (V_SAL - C_QIZHENDIAN) < 35000 THEN V_SHUIJIN := (V_SAL - C_QIZHENDIAN) * 0.25 - 1005; ELSIF (V_SAL - C_QIZHENDIAN) > 35000 AND (V_SAL - C_QIZHENDIAN) < 55000 THEN V_SHUIJIN := (V_SAL - C_QIZHENDIAN) * 0.3 - 2755; ELSIF (V_SAL - C_QIZHENDIAN) > 55000 AND (V_SAL - C_QIZHENDIAN) < 80000 THEN V_SHUIJIN := (V_SAL - C_QIZHENDIAN) * 0.35 - 5505; ELSIF (V_SAL - C_QIZHENDIAN) > 80000 THEN V_SHUIJIN := (V_SAL - C_QIZHENDIAN) * 0.45 - 13505; END IF; DBMS_OUTPUT.PUT_LINE('KING���������������������' || V_SHUIJIN); END;

���������������������������������

���������������������������������������

DECLARE V_SCOTT_HIREDATE EMP.HIREDATE%TYPE; V_COMM NUMBER; BEGIN SELECT HIREDATE INTO V_SCOTT_HIREDATE FROM EMP WHERE ENAME='SCOTT'; IF (SYSDATE - V_SCOTT_HIREDATE) >= 365 * 6 THEN V_COMM := 2000; ELSE V_COMM := 1500; END IF; UPDATE EMP SET COMM = V_COMM WHERE ENAME='SCOTT'; IF SQL%ROWCOUNT > 0 THEN DBMS_OUTPUT.PUT_LINE('���������������'); ELSE DBMS_OUTPUT.PUT_LINE('���������������'); END IF; END;

������������������

���������������������������������������������������������

DECLARE V_SCOTT_SAL EMP.SAL%TYPE; V_JIBIE NUMBER; V_DEPTNAME DEPT.DNAME%TYPE; BEGIN SELECT SAL, DNAME INTO V_SCOTT_SAL, V_DEPTNAME FROM EMP E JOIN DEPT D ON E.DEPTNO = D.DEPTNO WHERE ENAME='SCOTT'; IF V_SCOTT_SAL > 700 AND V_SCOTT_SAL <= 3200 THEN V_JIBIE := 1; ELSIF V_SCOTT_SAL > 3200 AND V_SCOTT_SAL <= 4400 THEN V_JIBIE := 2; ELSIF V_SCOTT_SAL > 4400 AND V_SCOTT_SAL <= 5000 THEN V_JIBIE := 3; ELSIF V_SCOTT_SAL > 5000 AND V_SCOTT_SAL <= 7000 THEN V_JIBIE := 4; ELSIF V_SCOTT_SAL > 7000 AND V_SCOTT_SAL <= 10000 THEN V_JIBIE := 5; END IF; DBMS_OUTPUT.PUT_LINE('SCOTT���������������������' || V_DEPTNAME || ',������������' || V_SCOTT_SAL || ',������������������������' || V_JIBIE || '������'); END;

������������������

���������������������������������������10000���

DECLARE V_SCOTT_SAL EMP.SAL%TYPE; BEGIN SELECT 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; UPDATE EMP SET SAL = V_SCOTT_SAL WHERE ENAME='SCOTT'; IF SQL%ROWCOUNT > 0 THEN DBMS_OUTPUT.PUT_LINE('���������������'); ELSE DBMS_OUTPUT.PUT_LINE('���������������'); END IF; END;

������������������

���������������������������������������

DECLARE V_ENAME VARCHAR2(4); E_ERROR EXCEPTION; BEGIN SELECT ENAME INTO V_ENAME FROM EMP WHERE EMPNO=&EMPNO; DBMS_OUTPUT.PUT_LINE('���������' || V_ENAME); EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('������������������������������'); WHEN VALUE_ERROR THEN DBMS_OUTPUT.PUT_LINE('���������������������'); WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('������������������������'); END;

������������������

������������������������������

CREATE OR REPLACE PROCEDURE DEL_EMPNAME( ENO EMP.EMPNO%TYPE, ON_FLAG OUT NUMBER, ON_MSG OUT VARCHAR2 ) IS E_ERROR EXCEPTION; BEGIN DELETE FROM EMP WHERE EMPNO = ENO; IF SQL%NOTFOUND THEN RAISE E_ERROR; ELSE ON_FLAG := 1; ON_MSG := '���������������'; END IF; EXCEPTION WHEN E_ERROR THEN ON_FLAG := 0; ON_MSG := '���������������'; WHEN OTHERS THEN ON_FLAG := 0; ON_MSG := '���������������'; END;
DECLARE V_EMPNO NUMBER; ENO NUMBER(5); ON_FLAG NUMBER(1); ON_MSG VARCHAR(20); BEGIN ENO := &EMPNO; DEL_EMPNAME(ENO, ON_FLAG, ON_MSG); DBMS_OUTPUT.PUT_LINE(ON_FLAG); DBMS_OUTPUT.PUT_LINE(ON_MSG); END;

������������������

���������������������������������������������

CREATE OR REPLACE PROCEDURE GET_SALS( cur_salary OUT SYS_REFCURSOR, ON_FLAG OUT NUMBER, ON_MSG OUT VARCHAR2 ) IS BEGIN OPEN cur_salary FOR SELECT empno, sal FROM employee; ON_FLAG := 1; ON_MSG := '������'; EXCEPTION WHEN OTHERS THEN ON_FLAG := -1; ON_MSG := '������������������������������������'; END; DECLARE v_empno EMP.EMPNO%TYPE; v_sal EMP.SAL%TYPE; emp_salary SYS_REFCURSOR; on_Flag NUMBER(1); os_Msg VARCHAR2(200); BEGIN GET_SALS(emp_salary, on_Flag, os_Msg); IF on_Flag = 1 THEN LOOP FETCH emp_salary INTO v_empno, v_sal; EXIT WHEN emp_salary%NOTFOUND; DBMS_OUTPUT.PUT_LINE(v_empno || '������������' || v_sal); END LOOP; ELSE DBMS_OUTPUT.PUT_LINE(os_Msg); END IF; IF emp_salary%ISOPEN THEN CLOSE emp_salary; END IF; END;
上一篇:常用数据库连接串与驱动总结
下一篇:PL/SQL编程基本概念

发表评论

最新留言

很好
[***.229.124.182]2025年04月26日 04时50分29秒