1 / 39

PL/SQL

PL/SQL. Βασική Δομή. DECLARE /* Μεταβλητές, τύποι και τοπικά υποπρογράμματα. */ BEGIN /* Διαδικασίες και οι εντολές PL/SQL , άλλα blocks */ /* Είναι το μόνο τμήμα που απαιτείται. */ EXCEPTION /* Εντολές χειρισμού λαθών. */ END ;. Βασική Δομή (2).

marlin
Download Presentation

PL/SQL

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. PL/SQL

  2. Βασική Δομή DECLARE /* Μεταβλητές, τύποι και τοπικά υποπρογράμματα.*/ BEGIN /* Διαδικασίες και οι εντολές PL/SQL, άλλα blocks */ /* Είναι το μόνο τμήμα που απαιτείται. */ EXCEPTION /* Εντολές χειρισμού λαθών. */ END;

  3. Βασική Δομή (2) • Για να εκτελέσουμε ένα πρόγραμμα PL/SQL γράφουμε μετά τον κώδικα: • Μια γραμμή που περιέχει μόνο μία τελεία(“.”). • Μια γραμμή με την λέξη run; • Η εκτέλεση γίνεται: • Γράφοντας τις εντολές στην γραμμή εντολών της sqlplus. • Γράφοντας τον κώδικα σε ένα αρχείο και καλώντας το από την sqlplus (@codefile.sql).

  4. Μεταβλητές και τύποι • Τύποι μεταβλητών: • Τύπος της sqlplus για προσδιορισμό των στηλών ενός πίνακα. • Ίδιος με τον τύπο μίας στήλης ενός πίνακα. • NUMBER (ακέραιοι ή πραγματικοί αριθμοί). • BOOLEAN. • Εγγραφή με πολλά πεδία (record). • Η αρχική τιμή μεταβλητών είναι NULL. • Οι μεταβλητές δεν πρέπει να έχουν ίδιο όνομα με στήλες πινάκων. • Στις μεταβλητές ανατίθεται τιμή με τον τελεστή “:=“.

  5. Μεταβλητές και τύποι (παραδείγματα) DECLARE amount NUMBER(7,3); price NUMBER; myBeer varchar(30); purchaseDate DATE; yourBeer Beers.name%TYPE; isGood BOOLEAN; beerTuple Beers%ROWTYPE;

  6. Μεταβλητές και τύποι (παραδείγματα) (2) DECLARE price NUMBER := 3; myBeer varchar(30); BEGIN price := price + 2; myBeer := ‘Some ‘ || ‘Beer’; END; . run;

  7. Εντολές SQL στην PL/SQL • Εντολές SQL που επιτρέπονται: • SELECT • INSERT • UPDATE • DELETE • Εντολές SQL που δεν επιτρέπονται: • CREATE • DROP • ALTER

  8. Εντολές SQL στην PL/SQL (παράδειγμα) • Αρχικός πίνακας T: col1 col2 ------------------ 1 3 2 4 • PL/SQL κώδικας: DECLARE a T.col1%TYPE; b T. col2%TYPE; BEGIN SELECT col1, col2 INTO a,b FROM T WHERE col1 > 1; INSERTINTO T VALUES(b, a); END; . run;

  9. Εντολές SQL στην PL/SQL (παράδειγμα συνέχεια) • Πίνακας T μετά την εκτέλεση του PL/SQL κώδικα: col1 col2 -------------- 1 3 2 4 4 2

  10. Εντολές SQL στην PL/SQL (2) • Η PL/SQL μας επιτρέπει να εκτιμήσουμε τι συνέβη με την εκτέλεση μιας SQL εντολής: • SQL%ROWCOUNT: ο αριθμός των γραμμών που επεξεργάστηκε η εντολή. • SQL%FOUND: TRUE αν επεξεργάστηκε τουλάχιστον μία γραμμή. • SQL%NOTFOUND: TRUE αν δεν επεξεργάστηκε καμία γραμμή.

  11. Εντολές SQL στην PL/SQL (παράδειγμα 2) DECLARE rowsDeleted NUMBER; BEGIN DELETE FROM dept WHERE deptno = 50; rowsDeleted := SQL%ROWCOUNT; INSERT INTO delHistory VALUES(‘DEPT’, rowsDeleted, SYSDATE); END; . run;

  12. Χειρισμός λαθών • Σύνταξη: EXCEPTION WHEN exception-identifier THEN actions; • Αναγνωριστικά λαθών στην PL/SQL: • DUP_VAL_ON_INDEX • INVALID_CURSOR • INVALID_NUMBER • LOGIN_DENIED • NO_DATA_FOUND

  13. Χειρισμός λαθών (2) • NOT_LOGGED_ON • PROGRAM_ERROR • STORAGE_ERROR • TIMEOUT_ON_RESOURCE • TOO_MANY_ROWS • VALUE_ERROR • ZERO_DIVIDE • CURSOR_ALREADY_OPEN • TRANSACTION_BACKED_OUT

  14. Χειρισμός λαθών (παράδειγμα) DECLARE v_ename emp.ename%TYPE; v_job emp.job%TYPE; BEGIN SELECT ename, job INTO v_ename, v_job FROM emp WHERE hire_date BETWEEN‘01-JAN-04’ AND ‘31-DEC-04’; ..... EXCEPTION WHEN NO_DATA_FOUND THEN INSERT INTO err_tab VALUES(‘nobody in 04’); WHEN TOO_MANY_ROWS THEN INSERT INTO err_tab VALUES(‘More than one person in 04’); END; . run;

  15. Έλεγχος ροής • Η εντολή IF • Σύνταξη: IF <condition> THEN <statement-list> ELSE <statement-list> END IF; ή IF <condition1> THEN <statement-list> ELSIF <condition_2> THEN <statement-list> ............ ELSIF <condition_n> THEN <statement-list> ELSE <statement-list> END IF;

  16. Η εντολή IF (παράδειγμα) DECLARE a NUMBER; b NUMBER; BEGIN SELECT e,f INTO a, b FROM T WHERE e > 1; IF b=1 THEN INSERT INTO T VALUES(b, a); ELSE INSERT INTO T VALUES(b+10, a+10); END IF; END; . run;

  17. Έλεγχος ροής (2) • Η εντολή LOOP • Σύνταξη: LOOP <loop-body> /* λίστα από PL/SQL */ /* εντολές */ END LOOP; • Τουλάχιστον μία από τις εντολές στο loop-body πρέπει να είναι της μορφής: EXIT WHEN <condition>;

  18. Η εντολή LOOP (παράδειγμα) DECLARE i NUMBER := 1; BEGIN LOOP INSERT INTO T VALUES(i, i); i := i + 1; EXIT WHEN i > 100; END LOOP; END; . run;

  19. Έλεγχος ροής (3) • Η εντολή WHILE • Σύνταξη: WHILE <condition> LOOP <loop-body> END LOOP;

  20. Η εντολή WHILE (παράδειγμα) DECLARE i NUMBER := 1; BEGIN WHILE i <= 100 LOOP INSERT INTO T VALUES(i, i); i := i + 1; END LOOP; END; . run;

  21. Έλεγχος ροής(4) • Η εντολή FOR • Σύνταξη: FOR <var> IN <start>..<finish> LOOP <lop-body> END LOOP; • Η μεταβλητή var είναι οποιαδήποτε μεταβλητή, είναι τοπική το σώμα του βρόγχου και δεν χρειάζεται να δηλωθεί. • Τα <start> και <finish> είναι σταθερές.

  22. Η εντολή FOR (παράδειγμα) DECLARE i NUMBER; BEGIN FOR i IN 1..100 LOOP INSERT INTO T VALUES(i, i); END LOOP; END; . run;

  23. Κέρσορες (Cursors) • Μεταβλητή όπου αποθηκεύουμε ν-άδες κάποιας σχέσης (πίνακας ή αποτέλεσμα ερώτησης). • Μπορούμε να διαβάσουμε σειριακά και να επεξεργαστούμε τις τιμές κάθε στοιχείου.

  24. Κέρσορες (Cursors) (2) • Οι κέρσορες ελέγχονται μέσω τεσσάρων διαφορετικών τύπων actions: • DECLARE: δηλώνει των κέρσορα και την ερώτηση SQL που θα εκτελεστεί. • OPEN: εκτελεί την ερώτηση SQL και «γεμίζει» τις γραμμές του κέρσορα. • FETCH: φορτώνει τιμές τις τρέχουσας γραμμής του κέρσορα σε μεταβλητές και μετακινεί τον δείκτη του κέρσορα στην επόμενη γραμμή. • CLOSE: κλείνει τον κέρσορα (ελευθερώνει τη μνήμη).

  25. Κέρσορες (Cursors)(3) • Δήλωση του κέρσορα – σύνταξη: CURSOR identifier IS query-expression; • identifier είναι το όνομα του κέρσορα. • query-expression είναι μια SELECT εντολή της SQL. • Άνοιγμα κέρσορα – σύνταξη: OPEN cursor-identifier; • Κλείσιμο κέρσορα – σύνταξη: CLOSE cursor-identifier; • FETCH – σύνταξη: FETCH cursor-identifier INTO var, var, ……

  26. Παίρνοντας πληροφορίες για τους κέρσορες • Τιμές ελέγχου: • FOUND: TRUE αν η τελευταία εντολή FETCH βρήκε μία γραμμή στον κέρσορα. • NOTFOUND: το αντίθετο του FOUND. • ROWCOUNT: επιστρέφει τον αριθμό των γραμμών (records) του κέρσορα. • ISOPEN: TRUE αν ο κέρσορας είναι ανοικτός (έχει εκτελεστεί η εντολή OPEN).

  27. Κέρσορες (παράδειγμα) DECLARE a T.e%TYPE; b T.f%TYPE; CURSOR Tcursor IS SELECT e, f FROM T WHERE e < f FOR UPDATE; /*FOR UPDATE OF table*/ BEGIN OPEN Tcursor; LOOP FETCH Tcursor INTO a, b; EXIT WHEN Tcursor%NOTFOUND; DELETE FROM T WHERE CURRENT OF Tcursor; INSERT INTO T VALUES(b , a); END LOOP; CLOSE Tcursor; END; . Run;

  28. Διαδικασίες (procedures) • Οι διαδικασίες είναι παρόμοιες με αυτές σε άλλες γλώσσες προγραμματισμού. • Παράδειγμα: • SQL κομμάτι CREATE TABLE T( a INTEGER, b VARCHAR(10)); • PL/SQL CREATE PROCEDURE addtuple1(i IN NUMBER) AS BEGIN INSERT INTO T VALUES(i, ‘xxx’); END addtuple1; . run;

  29. Διαδικασίες (2) • Σύνταξη: CREATE PROCEDURE proc-name (<param-list>)AS <local-var-declarations> BEGIN <procedure-body> END proc_name; . run;

  30. Διαδικασίες (3) • proc-name: όνομα της διαδικασίας. • <param-list>: param-id mode type, …. • param-id είναι το όνομα παραμέτρου. • Mode είναι ένα από: • IN μόνο ανάγνωση. • OUT μόνο εγγραφή. • INOUT εγγραφή και ανάγνωση. • type είναι ο τύπος της μεταβλητής. • Οι τύποι των μεταβλητών δεν επιτρέπεται να έχουν όρια.

  31. Διαδικασίες (4) • Η εντολή run στο τέλος απλώς δημιουργεί τη διαδικασία, δεν την εκτελεί. • Η εκτέλεση γίνεται σε ένα άλλο PL/SQL block ως εξής: BEGIN addtuple1(99); END; . run;

  32. Διαδικασίες (παράδειγμα) CREATE PROCEDURE addtuple2( x T.a%TYPE, y T.b%TYPE) AS BEGIN INSERT INTO T VALUES(x, y); END addtuple2; . run; BEGIN addtuple2(10, ‘abc’); END; . run;

  33. Διαδικασίες (παράδειγμα (2)) CREATE TABLE T(a INTEGER, b INTEGER); CREATE PROCEDURE addtuple3( a NUMBER, b OUT NUMBER) AS BEGIN b := 4; INSERT INTO T VALUES(a, b); END; . run; DECLARE v NUMBER; BEGIN addtuple3(10, v); END; . run;

  34. Συναρτήσεις • Σύνταξη: CREATE FUNCTION fun-name (<param-list>) RETURN <return-type> AS <local-var-declarations> BEGIN <procedure-body> END fun-name; . run;

  35. Συναρτήσεις (2) • fun-name: όνομα της συνάρτησης. • <param-list>: όπως στην διαδικασία • <return-type>: τύπος μεταβλητής που επιστρέφεται. • Στο σώμα της συνάρτησης (<procedure-body>) πρέπει να υπάρχει η εντολή RETURN <expression>;

  36. Διαδικασίες - Συναρτήσεις • Για να βρούμε ποιες διαδικασίες ή συναρτήσεις έχουμε δημιουργήσει πρέπει να γράψουμε τα εξής στην SQL: SELECT object_type, object_name FROM user_objects WHERE object_type = ‘PROCEDURE’ OR object_type = ‘FUNCTION’ ; • Για να διαγράψουμε μια διαδικασία ή συνάρτηση: DROP procedure <procedure_name>; DROP function <function_name>;

  37. Ανακαλύπτοντας λάθη • Η PL/SQL δεν σας λέει πάντα για τα λάθη μεταγλώττισης. • Δίνει ένα απλό μήνυμα “procedure created with compilation errors”. • Για να δούμε τα λάθη δίνουμε την εντολή: show errors procedure <procedure_name>;

  38. Εκτυπώνοντας μεταβλητές • Μία λύση είναι να την αποθηκεύσουμε σε έναν πίνακα και μετά να εκτελέσουμε στην SQL την εντολή SELECT. • Να κάνουμε το εξής: • Δηλώνουμε μια bind μεταβλητή: VARIABLE <name> <type> ……. BEGIN ……. PRINT :<name>;

  39. Εκτυπώνοντας μεταβλητές (2) • Type μπορεί να είναι μόνο ένα από τα τρία: • NUMBER. • CHAR. • CHAR(n). • Μπορούμε να αναθέσουμε τιμή στην μεταβλητή σε μία ακόλουθη PL/SQL δήλωση αλλά πρέπει να βάλουμε το πρόθεμα “:” πριν από τη δήλωση. • Παράδειγμα: VARIABLE x NUMBER BEGIN :x := 1; END; . run; PRINT :x;

More Related