Präsentation herunterladen
Die Präsentation wird geladen. Bitte warten
Veröffentlicht von:Berhtram Worms Geändert vor über 11 Jahren
1
PL/SQL - Programmierung von Programmeinheiten
2
© Prof. T. Kudraß, HTWK Leipzig Gespeicherte Prozeduren – Eine Prozedur ist ein benannter PL/SQL Block, der eine Aktion ausführt. – Eine Prozedur kann in der Datenbank gespeichert sein als Datenbankobjekt zur wiederholten Ausführung.
3
© Prof. T. Kudraß, HTWK Leipzig Syntax zum Erzeugen von Prozeduren CREATE [OR REPLACE] PROCEDURE procedure_name (argument1 [mode1] datatype1, argument2 [mode2] datatype2,... IS [AS] PL/SQL Block; CREATE [OR REPLACE] PROCEDURE procedure_name (argument1 [mode1] datatype1, argument2 [mode2] datatype2,... IS [AS] PL/SQL Block;
4
© Prof. T. Kudraß, HTWK Leipzig Entwicklung von Prozeduren/Funktionen Text file Source Code P-Code Editieren Speichern in Datenbank Compile Execute 1 2 System editor OracleProcedureBuilder
5
© Prof. T. Kudraß, HTWK Leipzig Parameter-Modi IN OUT Muß bekannt sein Wert zum Subpro- gramm übermittelt; Rückgabe an Aufrufumgebung Initialisierte Variable Muß Variable sein OUT Muß bekannt sein Rückgabe an Aufrufumgebung Uninitialisierte Variable Muß Variable sein IN Default Wert wird zum Subprogram übermittelt Formaler Parameter wie Konstante Aktueller Parameter: Literal, Ausdruck, Kon- stante, init.Variable
6
© Prof. T. Kudraß, HTWK Leipzig IN-Parameter: Beispiel SQL> CREATE OR REPLACE PROCEDURE raise_salary 2 (v_id in emp.empno%TYPE) 3 IS 4 BEGIN 5UPDATE emp 6SET sal = sal * 1.10 7WHERE empno = v_id; 8 END raise_salary; 9 / Procedure created. SQL> EXECUTE raise_salary (7369) PL/SQL procedure successfully completed. SQL> CREATE OR REPLACE PROCEDURE raise_salary 2 (v_id in emp.empno%TYPE) 3 IS 4 BEGIN 5UPDATE emp 6SET sal = sal * 1.10 7WHERE empno = v_id; 8 END raise_salary; 9 / Procedure created. SQL> EXECUTE raise_salary (7369) PL/SQL procedure successfully completed. v_id7369
7
© Prof. T. Kudraß, HTWK Leipzig OUT-Parameter: Beispiel SQL> CREATE OR REPLACE PROCEDURE query_emp 1 (v_id INemp.empno%TYPE, 2 v_name OUTemp.ename%TYPE, 3 v_salary OUTemp.sal%TYPE, 4 v_comm OUTemp.comm%TYPE) 5 IS 6 BEGIN 7 SELECT ename, sal, comm 8 INTO v_name, v_salary, v_comm 9 FROM emp 10 WHERE empno = v_id; 11 END query_emp; 12 / SQL> CREATE OR REPLACE PROCEDURE query_emp 1 (v_id INemp.empno%TYPE, 2 v_name OUTemp.ename%TYPE, 3 v_salary OUTemp.sal%TYPE, 4 v_comm OUTemp.comm%TYPE) 5 IS 6 BEGIN 7 SELECT ename, sal, comm 8 INTO v_name, v_salary, v_comm 9 FROM emp 10 WHERE empno = v_id; 11 END query_emp; 12 /
8
© Prof. T. Kudraß, HTWK Leipzig OUT-Parameter und SQL*Plus SQL> START emp_query.sql Procedure created. SQL> START emp_query.sql Procedure created. SQL> VARIABLE g_namevarchar2(15) SQL> VARIABLE g_salarynumber SQL> VARIABLE g_commnumber SQL> VARIABLE g_namevarchar2(15) SQL> VARIABLE g_salarynumber SQL> VARIABLE g_commnumber SQL> EXECUTE query_emp (7654, :g_name, :g_salary, 2 :g_comm) PL/SQL procedure successfully completed. SQL> EXECUTE query_emp (7654, :g_name, :g_salary, 2 :g_comm) PL/SQL procedure successfully completed. SQL> PRINT g_name G_NAME --------------- MARTIN SQL> PRINT g_name G_NAME --------------- MARTIN
9
© Prof. T. Kudraß, HTWK Leipzig Parameter Passing Position Namen Kombination aus beiden
10
© Prof. T. Kudraß, HTWK Leipzig Parameter Passing (Beispielprozedur) SQL> CREATE OR REPLACE PROCEDURE add_dept 1 (v_name IN dept.dname%TYPE DEFAULT 'unknown', 2 v_loc IN dept.loc%TYPE DEFAULT 'unknown') 3 IS 4 BEGIN 5 INSERT INTO dept 6 VALUES (dept_deptno.NEXTVAL, v_name, v_loc); 7 END add_dept; 8 / SQL> CREATE OR REPLACE PROCEDURE add_dept 1 (v_name IN dept.dname%TYPE DEFAULT 'unknown', 2 v_loc IN dept.loc%TYPE DEFAULT 'unknown') 3 IS 4 BEGIN 5 INSERT INTO dept 6 VALUES (dept_deptno.NEXTVAL, v_name, v_loc); 7 END add_dept; 8 /
11
© Prof. T. Kudraß, HTWK Leipzig Parameter Passing (Beispiele) SQL> begin 2 add_dept; 3 add_dept ( 'TRAINING', 'NEW YORK'); 4 add_dept ( v_loc => 'DALLAS', v_name => 'EDUCATION') ; 5 add_dept ( v_loc => 'BOSTON') ; 6 end; 7 / PL/SQL procedure successfully completed. SQL> begin 2 add_dept; 3 add_dept ( 'TRAINING', 'NEW YORK'); 4 add_dept ( v_loc => 'DALLAS', v_name => 'EDUCATION') ; 5 add_dept ( v_loc => 'BOSTON') ; 6 end; 7 / PL/SQL procedure successfully completed. SQL>SELECT * FROM dept; DEPTNODNAMELOC ---------------------------------......... 41unknownunknown 42TRAININGNEW YORK 43EDUCATIONDALLAS 44 unknownBOSTON SQL>SELECT * FROM dept; DEPTNODNAMELOC ---------------------------------......... 41unknownunknown 42TRAININGNEW YORK 43EDUCATIONDALLAS 44 unknownBOSTON
12
© Prof. T. Kudraß, HTWK Leipzig Löschen von Prozeduren Mit SQL*Plus: Drop der serverseitigen Prozedur Beispiel Syntax DROP PROCEDURE procedure_name SQL> DROP PROCEDURE raise_salary; Procedure dropped. SQL> DROP PROCEDURE raise_salary; Procedure dropped. Mit Procedure Builder: Drop clientseitige oder serverseitige Prozedur
13
© Prof. T. Kudraß, HTWK Leipzig Zusammenfassung Prozeduren Eine Prozedur ist ein benannter PL/SQL Block, der eine Aktion ausführt. Parameter zum Übermitteln der Daten von der Aufrufumgebung zur Prozedur. Prozeduren können von jedem Tool oder Sprache aufgerufen werden, die PL/SQL unterstützen. Prozeduren können als Bausteine für eine Applikation dienen.
14
© Prof. T. Kudraß, HTWK Leipzig Gespeicherte Funktionen Eine Funktion ist ein benannter PL/SQL Block, der einen Wert zurückliefert. Eine Funktion kann in der Datenbank als Datenbankobjekt für wiederholte Ausführung gespeichert werden. Eine Funktion kann als Teil eines Ausdrucks aufgerufen werden.
15
© Prof. T. Kudraß, HTWK Leipzig Erzeugen neuer Funktionen CREATE [OR REPLACE] FUNCTION function_name (argument1 [mode1] datatype1, argument2 [mode2] datatype2,... RETURN datatype IS|AS PL/SQL Block; CREATE [OR REPLACE] FUNCTION function_name (argument1 [mode1] datatype1, argument2 [mode2] datatype2,... RETURN datatype IS|AS PL/SQL Block; Syntax
16
© Prof. T. Kudraß, HTWK Leipzig Erzeugen neuer Funktionen (Beispiel) SQL> CREATE OR REPLACE FUNCTION get_sal 2 (v_id IN emp.empno%TYPE) 3 RETURN NUMBER 4 IS 5 v_salaryemp.sal%TYPE :=0; 6 BEGIN 7 SELECT sal 8 INTO v_salary 9 FROM emp 10 WHERE empno = v_id; 11 RETURN (v_salary); 12 END get_sal; 13 / SQL> CREATE OR REPLACE FUNCTION get_sal 2 (v_id IN emp.empno%TYPE) 3 RETURN NUMBER 4 IS 5 v_salaryemp.sal%TYPE :=0; 6 BEGIN 7 SELECT sal 8 INTO v_salary 9 FROM emp 10 WHERE empno = v_id; 11 RETURN (v_salary); 12 END get_sal; 13 / SQL*Plus
17
© Prof. T. Kudraß, HTWK Leipzig Ausführen von Funktionen –Aufrufen einer Funktion als Teil eines PL/SQL Ausdrucks. –Erzeugen einer Host-Variable, um den Rückgabewert aufzunehmen. –Ausführen der Funktion. Host-Variable wird belegt mit dem RETURN Wert. SQL> VARIABLE g_salary number SQL> EXECUTE :g_salary := get_sal(7934) PL/SQL procedure successfully completed. SQL> EXECUTE :g_salary := get_sal(7934) PL/SQL procedure successfully completed.
18
© Prof. T. Kudraß, HTWK Leipzig Wo können benutzerdefinierter Funktionen aufgerufen werden? Select-Liste in einem SELECT Befehl Bedingung in einer WHERE oder HAVING Klausel CONNECT BY, START WITH, ORDER BY, und GROUP BY Klausel VALUES Klausel eines INSERT Befehls SET Klausel eines UPDATE Befehls
19
© Prof. T. Kudraß, HTWK Leipzig Restriktionen für benutzerdefinierte Funktionen Muß als gespeicherte Funktion vorliegen. Nur IN Parameter erlaubt. Erlaubte Datentypen: CHAR, DATE, oder NUMBER - keine PL/SQL Typen wie BOOLEAN, RECORD, oder TABLE. Rückgabe-Typ muß ein interner Typ des Oracle Server sein. INSERT, UPDATE, oder DELETE verboten. Keine Aufrufe von Subprogrammen, die diese Restriktion verletzen.
20
© Prof. T. Kudraß, HTWK Leipzig Löschen von Funktionen Mit SQL*Plus Syntax Beispiel SQL> DROP FUNCTION get_salary; Function dropped. SQL> DROP FUNCTION get_salary; Function dropped. DROP FUNCTION function_name Procedure Builder (Löschen clientseitiger und serverseitiger Funktionen möglich)
21
© Prof. T. Kudraß, HTWK Leipzig Vergleich von Prozeduren und Funktionen Prozedur Ausführen als PL/SQL Befehl Kein RETURN Datentyp Kann einen oder meh- rere Werte zurückgeben Funktion Aufruf als Teil eines Ausdrucks RETURN Datentyp Muß einen Wert zurückliefern
22
© Prof. T. Kudraß, HTWK Leipzig Packages: Überblick Gruppierung logisch zusammenhängender PL/SQL- Typen, Konstrukte (Cursor, Exeptions, Variable) und Subprogramme Besteht aus zwei Teilen: – Spezifikation – Rumpf Kann nicht aufgerufen, parametrisiert oder geschachtelt werden Erlaubt Oracle8, gleichzeitig mehrere Objekte in den Speicher einzulesen
23
© Prof. T. Kudraß, HTWK Leipzig Vorteile von Packages Information Hiding und Kapselung – Objekte eines Packages benutzbar, ohne interne Implementierung zu kennen Top-Down Design – Kopf kann vor dem Rumpf implementiert werden, d.h. Nutzung der deklarierten Objekte schon möglich Objektpersistenz – Objekte, die im Kopf deklariert werden, bleiben für die Dauer der Sitzung erhalten
24
© Prof. T. Kudraß, HTWK Leipzig Vorteile von Packages (Forts.) Bessere Performance – Package wird als ganzes in den Hauptspeicher geladen, spart weitere I/Os Overloading – Mehrere Prozeduren und Funktionen mit dem gleichen Namen im Package, jeweils mit unterschiedlichen Parametern (Anzahl, Typ)
25
© Prof. T. Kudraß, HTWK Leipzig Beispiel-Package: COMM_PACKAGE G_COMM RESET_COMM procedure declaration VALIDATE_COMM function definition Package-Spezifikation Package-Rumpf 1 2 3 2 RESET_COMM procedure definition
26
© Prof. T. Kudraß, HTWK Leipzig Beispiel Package-Spezifikation SQL>CREATE OR REPLACE PACKAGE comm_package IS 2 g_comm NUMBER := 10; --initialized to 10 3 PROCEDURE reset_comm 4 (v_comm INNUMBER); 5 END comm_package; 6 /
27
© Prof. T. Kudraß, HTWK Leipzig Beispiel Package-Rumpf SQL>CREATE OR REPLACE PACKAGE BODY comm_package IS 2 FUNCTION validate_comm 3 (v_comm IN NUMBER) RETURN BOOLEAN 4 IS 5 v_max_comm NUMBER; 6 BEGIN 7 SELECT MAX(comm) 8 INTO v_max_comm 9 FROM emp; 10 IF v_comm > v_max_comm THEN RETURN(FALSE); 11 ELSE RETURN(TRUE); 12 END IF; 13 END validate_comm; 14 END comm_package; 15 /
28
© Prof. T. Kudraß, HTWK Leipzig Beispiel Package-Rumpf (Forts.) SQL>PROCEDURE reset_comm 2 (v_comm IN NUMBER) 3 IS 4 v_validBOOLEAN; 5 BEGIN 6 v_valid := validate_comm(v_comm); 7 IF v_valid = TRUE THEN 8 g_comm := v_comm; 9 ELSE 10 RAISE_APPLICATION_ERROR 11(-20210,'Invalid commission'); 12 END IF; 13 END reset_comm; 14 END comm_package; 15 /
29
© Prof. T. Kudraß, HTWK Leipzig Aufruf von Package-Konstrukten Beispiel1: Aufruf einer Package-Prozedur aus SQL*Plus. Beispiel2: Aufruf einer Package-Prozedur in einem anderen Schema. SQL>EXECUTE comm_package.reset_comm(1500); SQL>EXECUTE scott.comm_package.reset_comm(1500);
30
© Prof. T. Kudraß, HTWK Leipzig Löschen von Packages DROP PACKAGE package_name Löschen der Package-Spezifikation und des Rumpfes: Löschen nur des Package-Rumpfes: DROP PACKAGE BODY package_name
31
© Prof. T. Kudraß, HTWK Leipzig Erzeugen von Triggern Trigger-Zeitpunkt: BEFORE oder AFTER Auslösendes Event: INSERT oder UPDATE oder DELETE Tabellen-Name: ON Tabelle Trigger-Type: Zeilen- oder befehlsorientiert WHEN-Klausel: Einschränkende Bedingung Trigger-Rumpf: DECLARE BEGIN END;
32
© Prof. T. Kudraß, HTWK Leipzig Auslösen von Triggern EMPNO783976987788ENAMEKINGBLAKESMITHDEPTNO303030 BEFORE statement trigger BEFORE row trigger AFTER row trigger BEFORE row trigger AFTER row trigger BEFORE row trigger AFTER row trigger AFTER statement trigger
33
© Prof. T. Kudraß, HTWK Leipzig Befehlsorientierter Trigger (Syntax) CREATE [OR REPLACE] TRIGGER trigger_name timing event1 [OR event2 OR event3] ON table_name PL/SQL block; CREATE [OR REPLACE] TRIGGER trigger_name timing event1 [OR event2 OR event3] ON table_name PL/SQL block;
34
© Prof. T. Kudraß, HTWK Leipzig Befehlsorientierter BEFORE- Trigger Beispiel SQL> CREATE OR REPLACE TRIGGER secure_emp 2 BEFORE INSERT ON emp 3 BEGIN 4 IF (TO_CHAR (sysdate,'DY') IN ('SAT','SUN')) 5 OR (TO_CHAR(sysdate,'HH24')NOT BETWEEN 6 '08' AND '18' 7 THEN RAISE_APPLICATION_ERROR (-20500, 8 'You may only insert into EMP during normal 9 hours.'); 10 END IF; 11 END; 12 / SQL> CREATE OR REPLACE TRIGGER secure_emp 2 BEFORE INSERT ON emp 3 BEGIN 4 IF (TO_CHAR (sysdate,'DY') IN ('SAT','SUN')) 5 OR (TO_CHAR(sysdate,'HH24')NOT BETWEEN 6 '08' AND '18' 7 THEN RAISE_APPLICATION_ERROR (-20500, 8 'You may only insert into EMP during normal 9 hours.'); 10 END IF; 11 END; 12 /
35
© Prof. T. Kudraß, HTWK Leipzig Zeilenorientierter Trigger (Syntax) CREATE [OR REPLACE] TRIGGER trigger_name timing event1 [OR event2 OR event3] ON table_name [REFERENCING OLD AS old | NEW AS new] FOR EACH ROW [WHEN condition] PL/SQL block; CREATE [OR REPLACE] TRIGGER trigger_name timing event1 [OR event2 OR event3] ON table_name [REFERENCING OLD AS old | NEW AS new] FOR EACH ROW [WHEN condition] PL/SQL block;
36
© Prof. T. Kudraß, HTWK Leipzig Zeilenorientierter Trigger (Beispiel) SQL>CREATE OR REPLACE TRIGGER audit_emp_values 2 AFTER DELETE OR INSERT OR UPDATE ON emp 3 FOR EACH ROW 4 BEGIN 5 INSERT INTO audit_emp_values (user_name, 6 timestamp, id, old_last_name, new_last_name, 7 old_title, new_title, old_salary, new_salary) 8 VALUES (USER, SYSDATE, :old.empno, :old.ename, 9 :new.ename, :old.job, :new.job, 10 :old.sal, :new.sal); 11 END; 12 / SQL>CREATE OR REPLACE TRIGGER audit_emp_values 2 AFTER DELETE OR INSERT OR UPDATE ON emp 3 FOR EACH ROW 4 BEGIN 5 INSERT INTO audit_emp_values (user_name, 6 timestamp, id, old_last_name, new_last_name, 7 old_title, new_title, old_salary, new_salary) 8 VALUES (USER, SYSDATE, :old.empno, :old.ename, 9 :new.ename, :old.job, :new.job, 10 :old.sal, :new.sal); 11 END; 12 / Verwendung von old und new-Präfixen beachten!
37
© Prof. T. Kudraß, HTWK Leipzig Ausführung von Triggern 1. Ausführung aller befehlsorientierten BEFORE Trigger 2. Für jede betroffene Zeile a. Ausführung aller zeilenorientierten BEFORE Trigger b. Ausführung des DML-Befehls und der Integritätsprüfungen c. Ausführung aller zeilenorientierten AFTER Trigger 3. Ausführung der verzögerten Integritätsprüfungen 4. Ausführung aller befehlsorientierten AFTER Trigger
38
© Prof. T. Kudraß, HTWK Leipzig Anwendungen für Trigger Security Security Auditing Datenintegrität Referentielle Integrität Replikation von Tabellen Abgeleitete Daten Aufzeichnen von Ereignissen
39
© Prof. T. Kudraß, HTWK Leipzig Objekttyp –Ist ein benutzerdefinierter zusammengesetzter Datentyp –Kapselt eine Datenstruktur zusammen mit den benötigten Methoden zur Manipulation –Ist ein transientes Objekt Attribut Methode order_nocust_infoline_itemsamount Hold CheckStatus Cancel Ship
40
© Prof. T. Kudraß, HTWK Leipzig Struktur eines Objekttyps Methodenrümpfe Public Interface Private Implementation Attributdeklarationen Methodenspezifikationen Spezifikation Rumpf
41
© Prof. T. Kudraß, HTWK Leipzig Spezifikation eines Objekttyps CREATE TYPE type_name AS OBJECT [(attribute1 datatype, attribute2 datatype,...] [MEMBER procedure1 | function1 spec, procedure2 | function2 spec,...)] CREATE TYPE type_name AS OBJECT [(attribute1 datatype, attribute2 datatype,...] [MEMBER procedure1 | function1 spec, procedure2 | function2 spec,...)] Syntax
42
© Prof. T. Kudraß, HTWK Leipzig Rumpf eines Objekttyps Syntax CREATE TYPE BODY type_name AS [MEMBER procedure1 | function1 body, procedure2 | function2 body,...] CREATE TYPE BODY type_name AS [MEMBER procedure1 | function1 body, procedure2 | function2 body,...]
43
© Prof. T. Kudraß, HTWK Leipzig Spezifikation eines Objekttyps (Beispiel) SQL> CREATE TYPE name_typ AS OBJECT( 2 f_name VARCHAR2(25), 3 l_name VARCHAR22(25), 4 initials varchar2(7), 5 MEMBER FUNCTION full_name return varchar2 6 PRAGMA RESTRICT_REFERENCES( full_name, 7 WNDS, WNPS, RNPS )); 1 2 Pragma: Zur Verhinderung von Seiteneffekten: WNDS Write No Database State WNPS Write No Package State RNPS Read No Package State
44
© Prof. T. Kudraß, HTWK Leipzig Rumpf eines Objekttyps (Beispiel) SQL> CREATE TYPE BODY name_typ AS 2 MEMBER FUNCTION full_name RETURN VARCHAR2 3 IS 4 BEGIN 5 RETURN (l_name || ' ' || f_name ); 6 END full_name; 7 END; 1
45
© Prof. T. Kudraß, HTWK Leipzig Spezifikation eines komplexen Objekt-Typs SQL> CREATE TYPE BODY emp_typ AS 2 MEMBER FUNCTION get_name RETURN VARCHAR2 3 IS 4 BEGIN 5 RETURN (name.l_name ||' '|| name.f_name ); 6 END; 7 MEMBER PROCEDURE set_l_name (v_name VARCHAR2) 8 IS 9 BEGIN 10 name.l_name := v_name; 11 END; 12 END;
46
© Prof. T. Kudraß, HTWK Leipzig Aufruf von Objektmethoden SQL>CREATE TABLE name_table OF name_typ; SQL>INSERT INTO name_table 2 VALUES('Marilyn','Monroe','MM'); SQL>SELECT nt.f_name,nt.name_typ.full_name() 2 FROM name_table nt;
47
© Prof. T. Kudraß, HTWK Leipzig Konstruktor-Methode SQL> CREATE TYPE tv_type AS OBJECT ( 2 tv_category VARCHAR2(20), 3 screen_size NUMBER(4)); DECLARE v_new_tv tv_type := tv_type('WEB tv', 32); v_alt_tv tv_type; BEGIN v_alt_tv := tv_type('Big Screen', 72); END; Hat den gleichen Namen wie der Typ, genutzt für die Initialisierung
48
© Prof. T. Kudraß, HTWK Leipzig Verwendung des Konstruktors BEGIN INSERT INTO person_tab VALUES(emp_typ(4567,'Christian','Bauwens',...)); END; BEGIN UPDATE person_tab p SET p = emp_typ(5678,'Charlie','Brown',...) WHERE p.l_name = 'Bauwens'; END;
Ähnliche Präsentationen
© 2025 SlidePlayer.org Inc.
All rights reserved.