ΕΠΛ 342 Βάσεις εδοµένων Εργαστήριο 6 ο PL/SQL Ιωάννα Συρίµη syrimi@ucy.ac.cy
PL/SQL Procedural Language/SQL Επέκταση της SQL µε χαρακτηριστικά γλωσσών προγραµµατισµού Επιτρέπει την χρήση προτάσεων SQL (DML & Query Statements) σε διαδικαστικά κοµµάτια κώδικα (procedural code units) ΕΠΛ342-Βάσεις εδοµένων 2
Μονάδες Κώδικα PL/SQL οµή µονάδας κώδικα PL/SQL DECLARE Optional Variables, Constants, Cursors, User Defined Exceptions Mandatory SQL Statements PL/SQL control Statements EXCEPTION Optional Actions to perform when errors occur END; Mandatory ΕΠΛ342-Βάσεις εδοµένων 3
Μονάδες Κώδικα PL/SQL Anonymous Blocks Stored Procedures & Functions Application Procedures & Functions Stored Packages Database Triggers Application Triggers ΕΠΛ342-Βάσεις εδοµένων 4
Μονάδες Κώδικα PL/SQL PROCEDURE name IS Declarations Statements EXCEPTION Exception Handlers END; FUNCTION name RETURN datatype IS Declarations Statements RETURN value; EXCEPTION Exception Handlers END; ΕΠΛ342-Βάσεις εδοµένων 5
Έλεγχος Ροής Εκτέλεσης IF-THEN-ELSE IF A> B THEN RETURN(1); ELSIF A>C THEN RETURN(2); ELSE RETURN (3); END IF; ΕΠΛ342-Βάσεις εδοµένων 6
Έλεγχος Ροής Εκτέλεσης Basic Loop LOOP x:= x+ 1; EXIT WHEN x > 10; END LOOP; WHILE Loop WHILE x <= 10 LOOP x:= x+ 1; END LOOP; FOR Loop FOR i IN 1.. 10 LOOP x := x i; END LOOP; ΕΠΛ342-Βάσεις εδοµένων 7
ιαδικασία CREATE OR REPLACE PROCEDURE Add_Dept (p_dept IN number, p_dname IN varchar2, p_loc IN varcahr2) IS INSERT INTO DEPT (deptno, dname, loc) VALUES (p_dept, p_dname, p_loc); END Add_Dept; CREATE OR REPLACE PROCEDURE Add_Dept (p_dept IN number, p_dname IN varchar2, p_loc IN varchar2 default NEW YORK ) IS CREATE OR REPLACE PROCEDURE Add_Dept (p_dept IN DEPT.DEPTNO%TYPE, p_dname IN DEPT.DNAME%TYPE, p_loc IN DEPT.LOC%TYPE default NEW YORK ) IS ΕΠΛ342-Βάσεις εδοµένων 8
ιαδικασία CREATE OR REPLACE PROCEDURE Add_Dept (p_dname IN varchar2, p_loc IN varchar2) IS INSERT INTO DEPT (deptno, dname, loc) VALUES (dept_seq.nextval, p_dname,p_loc); END Add_Dept; Sequence dept_seq: Αυτόµατος Αριθµητής CREATE SEQUENCE dept_seq start with 1 increment by 1 SELECT dept_seq.nextval FROM dual SELECT dept_seq.currval FROM dual ΕΠΛ342-Βάσεις εδοµένων 9
ιαδικασία CREATE OR REPLACE PROCEDURE Add_Dept ( p_dept OUT number, p_dname varchar2, p_loc varchar2) IS SELECT dept_seq.nextval into p_dept FROM dual; INSERT INTO DEPT (deptno, dname, loc) VALUES (dept_seq.nextval, p_dname,p_loc); END Add_Dept; IN OUT : Τιµή εισόδου για τη διαδικασία - Σταθερά : Τιµή εξόδου για τη διαδικασία Μεταβλητή χωρίς αρχική τιµή IN OUT : Τιµή εισόδου και εξόδου για τη διαδικασία Μεταβλητή µε αρχική τιµή ΕΠΛ342-Βάσεις εδοµένων 10
Λειτουργία CREATE OR REPLACE FUNCTION get_no_employees (p_dept dept.deptno%type) RETURN number is v_res number; SELECT count(*) into v_res FROM Emp WHERE deptno = p_dept; return v_res; END get_no_employees; ΕΠΛ342-Βάσεις εδοµένων 11
Ανάκτηση εδοµένων CREATE OR REPLACE PROCEDURE Show_Employees (p_dept dept.deptno%type, p_empno OUT emp.empno%type, p_ename OUT emp.ename%type) IS SELECT empno, ename INTO p_empno, p_ename FROM emp WHERE deptno = p_dept; END Show_Employees; Θα δουλέψει µόνο αν στο τµήµα εργάζεται 1 υπάλληλος ΕΠΛ342-Βάσεις εδοµένων 12
Ανάκτηση εδοµένων CREATE OR REPLACE PROCEDURE Show_Employees (p_dept dept.deptno%type, p_empno OUT emp.empno%type, p_ename OUT emp.ename%type) IS SELECT empno, ename INTO p_empno, p_ename FROM emp WHERE deptno = p_dept; EXCEPTION when NO_DATA_FOUND then p_empno:= -1; d_ename := null; when TOO_MANY_ROWS then SELECT MIN(empno) INTO p_empno FROM emp WHERE deptno = p_dept; SELECT ename INTO p_ename FROM emp WHERE empno = p_empno; when OTHERS then null; END Show_Employees; ΕΠΛ342-Βάσεις εδοµένων 13
Ανάκτηση εδοµένων - Cursor CREATE OR REPLACE PROCEDURE Show_Employees (p_dept dept.deptno%type) IS v_empno OUT emp.empno%type; v_ename OUT emp.ename%type; CURSOR c_emp is SELECT empno, ename FROM emp WHERE deptno = p_dept; DBMS_OUTPUT.ENABLE(2000); DBMS_OUTPUT.PUT_LINE( Department: p_deptno); DBMS_OUTPUT.PUT_LINE( ------------------------------------------- ); OPEN c_emp; LOOP FETCH c_emp INTO v_empno, v_ename; EXIT WHEN c_emp%notfound; DBMS_OUTPUT.PUT_LINE ( Employee No: v_empno Employee Name: v_ename); END LOOP; CLOSE c_emp; EXCEPTION when OTHERS then null; END Show_Employees; ΕΠΛ342-Βάσεις εδοµένων 14
Ανάκτηση εδοµένων - Cursor CREATE OR REPLACE PROCEDURE Show_Employees (p_dept dept.deptno%type) IS CURSOR c_emp is SELECT empno, ename FROM emp WHERE deptno = p_dept; v_rec c_emp%rowtype; DBMS_OUTPUT.ENABLE(2000); DBMS_OUTPUT.PUT_LINE( Department: p_deptno); DBMS_OUTPUT.PUT_LINE( ------------------------------------------- ); OPEN c_emp; LOOP FETCH c_emp INTO v_rec; EXIT WHEN c_emp%notfound; DBMS_OUTPUT.PUT_LINE ( Employee No: v_rec. empno Employee Name: v_rec. ename); END LOOP; CLOSE c_emp; EXCEPTION when OTHERS then null; END Show_Employees; ΕΠΛ342-Βάσεις εδοµένων 15
Ανάκτηση εδοµένων - Cursor DECLARE OPEN FETCH No EMPTY? Yes CLOSE ΕΠΛ342-Βάσεις εδοµένων 16