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為smith@sau.edu.cn,入職日期為“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,'smith@sau.edu.cn','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;
/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM