1. 程式人生 > >PL/SQL語言基礎

PL/SQL語言基礎

PL/SQL語言基礎

進行PL/SQL程式設計前,要開啟輸出set serveroutput on

1、建立一個匿名PL/SQL塊,將下列字元輸出到螢幕:“My PL/SQL Block Works”. 宣告一個暫存員工號的變數v_empno,編寫一個匿名塊,查詢smith員工的工號並輸出顯示。

2、編寫一個PL/SQL塊,輸出所有員工的姓名、員工號、工資和部門號。

3、編寫一個PL/SQL塊,輸出所有比本部門平均工資高的員工資訊。

4、編寫一個PL/SQL塊,輸出所有員工及其部門領導的姓名、員工號及部門號。

5、查詢名為“Smith”的員工資訊,並輸出其員工號、姓名、工資、部門號。如果該員工不存在,則插入一條新記錄,員工號為2010,員工名為“Smith”,工資為7500元,EMAIL為
[email protected]
,入職日期為“2018年10月10日”,職位編號為AD_VP,部門號為50。如果存在多個名為“Smith”的員工,則輸出所有名為“Smith”的員工號、姓名、工資、入職日期、部門號、email。

6、編寫一個PL/SQL塊,根據員工職位不同更新員工的工資。職位為AD_PRES、AD_VP、AD_ASST的員工工資增加1000元,職位為FI_MG,FI_ACCOUNT的員工工資增加800元,職位為AC_MGR,AC_ACCOUNT的員工工資增加700元,職位為SA_MAN,SA_REP的員工工資增加600元,職位為PU_MAN,PU_CLERK的員工工資增加500元,職位為ST_MAN,ST_CLERK,SH_CLERK的員工工資增加400元,職位為IT_PROG,MK_MAN,MK_REP的員工工資增加300元,其他職位的員工工資增加200元。

7、編寫一個PL/SQL塊,修改員工號為201的員工工資為8000元,保證修改後的工資在職位允許的工資範圍之內,否則取消操作,並說明原因。

參考程式碼

DECLARE
    CURSOR c_emp IS SELECT * FROM employees
            where last_name='Smith';
    v_empno c_emp%ROWTYPE;
BEGIN
    OPEN c_emp;
    DBMS_OUTPUT.PUT_LINE('My PL/SQL Block Works');
    LOOP
    FETCH c_emp INTO v_empno;
    EXIT WHEN c_emp%NOTFOUND;
    DBMS_OUTPUT.PUT_LINE('the ID of simth is '||v_empno.employee_id);
    END LOOP;
    CLOSE c_emp;
END;
/

DECLARE
    CURSOR c_emp IS SELECT * FROM employees;            
    v_empno c_emp%ROWTYPE;
BEGIN
    OPEN c_emp;
    LOOP
    FETCH c_emp INTO v_empno;
    EXIT WHEN c_emp%NOTFOUND;
    DBMS_OUTPUT.PUT_LINE(v_empno.first_name||' '||v_empno.last_name||' ID:'||v_empno.employee_id
||' salary:'||v_empno.salary );
    END LOOP;
    CLOSE c_emp;
END;
/

DECLARE
    CURSOR c_emp IS SELECT * FROM employees where salary>(select AVG(salary) FROM employees);   
    v_empno c_emp%ROWTYPE;
BEGIN
    OPEN c_emp;
    LOOP
    FETCH c_emp INTO v_empno;
    EXIT WHEN c_emp%NOTFOUND;
    DBMS_OUTPUT.PUT_LINE(v_empno.first_name||' '||v_empno.last_name||' ID:'||v_empno.employee_id
||' salary:'||v_empno.salary );
    END LOOP;
    CLOSE c_emp;
END;
/
   
    
DECLARE
    CURSOR c_emp IS SELECT a.first_name,a.last_name,
             a.employee_id,a.department_id,
             b.first_name mfirst_name,b.last_name mlast_name
             FROM employees a inner join employees b 
             on a.employee_id=b.manager_id;
    v_emp c_emp%ROWTYPE;
BEGIN
    FOR v_emp IN c_emp LOOP
    DBMS_OUTPUT.PUT_LINE(v_emp.first_name||' '||
    v_emp.last_name||' '||v_emp.employee_id||' '||
    v_emp.mfirst_name||' '||v_emp.mlast_name||' '||
    v_emp.department_id);
    END LOOP;
END;
/

DECLARE
    v_emp employees%ROWTYPE;
BEGIN
    SELECT * INTO v_emp FROM employees WHERE last_name='Smith';
    DBMS_OUTPUT.PUT_LINE(v_emp.employee_id||' '||v_emp.first_name||' '||
    v_emp.last_name||' '||v_emp.salary||' '||v_emp.department_id);
    EXCEPTION
    WHEN no_data_found THEN
    INSERT INTO employees(employee_id,last_name,salary,
        email,hire_date,job_id,department_id) VALUES
        (2010,'Smith',7500,'
[email protected]
','10-10月 -2018','AD_VP',50); WHEN too_many_rows THEN FOR v_emp IN (SELECT * FROM employees WHERE last_name='Smith')LOOP DBMS_OUTPUT.PUT_LINE(v_emp.employee_id||' '||v_emp.first_name||' '|| v_emp.last_name||' '||v_emp.salary||' '||v_emp.department_id); END LOOP; END; / DECLARE v_sal employees.salary%TYPE; BEGIN FOR v_emp IN (SELECT * FROM employees) LOOP IF v_emp.job_id='AD_PRES' OR v_emp.job_id='AD_VP' OR v_emp.job_id='AD_ASST' THEN v_sal:=1000; ELSIF v_emp.job_id='AD_MGR' OR v_emp.job_id='AD_ACCOUNT' THEN v_sal:=800; ELSIF v_emp.job_id='SA_MAN' OR v_emp.job_id='SA_REP' THEN v_sal:=600; ELSIF v_emp.job_id='PU_MAN' OR v_emp.job_id='PU_CLERK' THEN v_sal:=500; ELSIF v_emp.job_id='ST_MAN' OR v_emp.job_id='ST_CLERK' OR v_emp.job_id='SH_CLERK' THEN v_sal:=400; ELSIF v_emp.job_id='IT_PROG' OR v_emp.job_id='MK_MAN' OR v_emp.job_id='MK_REP' THEN v_sal:=300; ELSE v_sal:=200; END IF; UPDATE employees SET salary=v_emp.salary+v_sal WHERE employee_id=v_emp.employee_id; END LOOP; END; / DECLARE v_salmin employees.salary%TYPE; v_salmax employees.salary%TYPE; v_sal employees.salary%TYPE; e_highlimit EXCEPTION; e_lowlimit EXCEPTION; BEGIN SELECT MAX(salary) INTO v_salmax FROM employees; SELECT MIN(salary) INTO v_salmin FROM employees; SELECT salary INTO v_sal FROM employees WHERE employee_id=201 ; UPDATE employees SET salary=8000 WHERE employee_id=201; IF v_sal>v_salmax THEN RAISE e_highlimit; ELSIF v_sal<v_salmin THEN RAISE e_lowlimit; END IF; EXCEPTION WHEN e_highlimit THEN DBMS_OUTPUT.PUT_LINE('The salary is too large'); WHEN e_lowlimit THEN DBMS_OUTPUT.PUT_LINE('The salary is too little'); WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('There is some wrong in selecting!'); END; /