PL/SQL語言基礎
阿新 • • 發佈:2018-11-07
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;
/