SELECT v_name,n_name INTO mitarbeiter_rec.v_name …
END;
Aufgabe:
Patient Warteliste
Aufnahme Station
Station
zuordnung
Patient(P_NR,Name)
Warteliste(P_NR,E_datum,E_grund)
Aufnahme(Nr, P_NR,E_datum,E_grund,st_bez)
Station(st_bez,betten_anz)
Stationszuordnung(st_bez,e_grund)
SQL innerhalb von PL/SQL Blöcken
SQL-Statements:
DML: Select, Insert, Update, Delete
DDL: Create, Drop, Alter, Grant, Revoke
DCL: Transaction Control TC: Commit, Rollback, Savepoint
Session Control: Alter Session, Set Role …
System Control: Alter System, …
Embedded SQL: OCI Oracle Call Interface
In PL/SQL sind nur DML und TC Statements erlaubt.
Grund: Early binding von Objketen zur Compile Zeit
Identifizierung des Speicherplatzes
Überprüfung der Zugriffsrechte
BEGIN
Create Table my_tab(…)
END;
Create Table ist nicht erlaubt in PL/SQL da sich die Zugriffsrecht ändern können und ein Create nicht mehr erlaubt sein kann.
DML und TC sind die einzigen die die Zugriffsrechte auf Datenbankobjekte nicht veränden.
DML – Statements
…
WHERE – Klausel
<<Blockname>> -- wenn erwünscht
DECLARE
department CHAR(3);
BEGIN
v_department:=‛cs‛;
DELETE FROM dept WHERE department = bockname.department;
END;
Character - Vergleich
Arten:1 blank padded
‚abc‛=‛abc‛
‚abc ‚=‛abc‛ -- bei non blank padded nicht so
Blank padded wird verendet wenn beide Operanden fixed lenght sind: CHAR
Non blank padded: Wenn einer oder beide variable length sind: VARCHAR2
‚Literal‛…fixed length.
Department … VARCHAR2(3)
DECLARE
V_dept CHAR(3)
BEGIN
DELETE FROM dept WHERE department=v_Dept;
END;
Bei unterschiedlichem Datentyp wird nichts gelöscht.
Transaction Control
Zusammenfassung von SQL Statements die entweder alle Vollständig oder gar nicht ausgeführt werden.
TA beginnt mit dem 1. Statement nach einem COMMIT (od. Rollback) oder nach CONNECT TO DB.
COMMIT…Änderungen in Tabellen fixieren.
LOCKS aufheben.
ROLLBACK…Alle Änderungen bis zum letzten COMMIT rückgängig machen.
SAVEPOINT name…
ROLLBACK TO SAVEPOINT name
Autocommit – option: COMMIT nach jedem SQL – Statement.
Transaktion u. PL/SQL – Block
Block ist kein TA – Beginn
INSERT INTO tab Values (…)
BEGIN
DELETE FROM tab…
ROLLBACK; macht auch INSERT rückgängig
END;
CURSOR
Select …INTO…
Wenn Abfrage nur 1 Reihe als Ergebnis liefert
Cursortechnik, wenn Abfrage mehrere Reihen liefert
Bei Abarbeitung eines SQL Statements wird von der Datenbank Speicherplatz allokiert (Context Area) Sie enthält geparstes(überprüftes) SQL Statement. Und nach Ausführung der Abfrage (OPEN) die Ergebnisse.
Cursor ist ein Zeiger auf Ergebnisreihen (nach open auf 1.Reihe)
Expliziter Cursor:
Schritte:
1.DECLARE Cursor
2.OPEN Cursor
3.FETCH
4.CLOSE
1.Cursor deklarieren, in DECLARE Section CURSOR cursor_name IS SELECT_Statement (ohne INTO); in WHERE Clausel können PL/SQL Variablen verwendet werden: bind variables à müssen vor CURSOR deklariert werden !.
2.Cursor öffnen (in Begin Section) Open cursor_name; Wirkung: Werte der Bindvariablen werden in SQL-Statement übertragen. (nur zur Cursor – Open – Zeit) SQL – Statement liefert Ergebnisreihen Cursor wird auf 1 Satz positioniert.
3.Fetching: FETCH cursor_name INTO list_of_variables; FETCH cursor_name INTO PL/SQL – record; Nach jedem Fetch wird der Pointer auf die nächste Reihe positioniert. %NOTFOUND tritt am Ende nach letzten gültigen Satz ein. à Output Daten werden auf 0 gesetzt.
4.Cursor schließen CURSOR cursor_name; Gibt die vom Cursor belegten Ressourcen wieder frei.
Cursor – Attribute:
%FOUND… True, wenn vorhergehendes FETCH eine Reihe geliefert hat.
%NOTFOUND…True, -- „ -- --„-- keine Reihe
%ISOPEN…True, wenn CURSOR bereits geöffnet.
%ROWCOUNT…aktuelle Anzahl der ‚gefetchten‛ Reihen.
CURSOR-FETCH-LOOPSv
v_abt_bez VARCHAR2(10);
CURSOR C1 IS
SELECT * FROM Mitarbeiter
WHERE abt_Bez = v_abt_Bez
ORDER by m_name;
C1_rec C1%ROWTYPE; -- Deklaration auf Basis der Cursor-Definition.
Rec_anz NUMBER(5);
BEGIN
v_Abt_Bez:=‛EDV‛;
OPEN C1;
LOOP
FETCH C1 INTO C1_rec;
Exit when C1%NOTFOUND;
END LOOP;
Rec_anz:=C1%ROWCOUNT;
CLOSE C1;
END;
WHILE-LOOPS
Open C1;
FETCH C1 into C1_rec;
While C1%FOUND LOOP
Insert Into …;
FETCH C1 into C1_rec;
END LOOP;
Close C1;
Commit;
End;
Cursor For Loops
For C1_rec in C1 Loop }Führt implizit ein Open C1 und Fetch C1 into C1_rec %Found durch
Wird impliziert deklariert (nicht in Declare Section, nur in Schleife gültig)
Hat den Typ C1%ROWTYPE
Verarbeitung
End Loop; } Close C1
Select …For Update Cursor
Select …From…
For Update [of column] [Nowait];
Setzt nach Open Cursor ein Exclusiv ROW LOCK auf jede ausgewählte Reihe für ein nachfolgendes Update.
Sind Reihen durch einen anderen Prozeß gesperrt, dann wird auf die Freigabe gewartet, außer der NOWAIT Zusatz ist angegeben.
Where Current of Cursor
In Update u. Delete
Für Zugriff auf die Reihe die durch den Cursor im vorhergehenden Fetch ausgewählt wurde.
Stunden Mittel
Mitarbeiter Arbeiten Projekt
Abteilung Prozent
Mittel der Projekte der EDV-Abteilung, die gerade bearbeitet werden, um Prozentsatz erhöhen.
Declare
Cursor Help IS Select
For Help_rec in Help Loop
Where Current of Help;
Error Handling
Exception: Werden bei Auftreten eines Runtime Errors ausgelöst
SQL - Fehler
Fehler
Prozeduraler Errorl
-userdefinierte Exceptions
-vordefinierte Exceptions
DECLARE
TooManyPersons: EXCEPTION; -- userdefiniert
Current_persons NUMBER(4);
BEGIN
SELECT count(*) into current_person FROM persons;
IF current_persons > 10 THEN
RAISE TooManyPersons;
END IF;
EXCEPTION
WHEN TooManyPersons THEN
INSERT into Log_Table values(…)
END;
Raising Exceptions
-implizit bei vordefinierten Exceptions.
-Explizit durch RAISE bei userdefinierten Exceptions
Bzw. auch bei Vordefinierten
BEGIN
INSERT into Person (id, name, ) values (100,‛Walter‛);
INSERT into person (id, name) values (100,‛Eva‛);
END;
ORA-00001: unique constraint violated
Handling Exceptions
EXCEPTION
WHEN exc_name1 THEN
Statement 1;
WHEN exc_name2 THEN
Statement 2;
WHEN OTHERS THEN
Statement n;
SQLCODE u. SQLERRM
SQL – built in functions:
Um WHEN OTHER FEHLER zu identifizieren
SQLCODE… liefert aktuellen Errorcode
SQLERRM… liefert aktuelle Errog Message
DECLARE
ErrorCode NUMBER;
ErrorMSg VARCHAR2(200)
BEGIN
EXCEPTION
WHEN OTHERS THEN
ErrorCode:=SQLCODE;
ErrorMSg:=SUBSTR(SQLERRM,1,200);
Insert into Log_Tab values(ErrorCode,ErrorMSg,‛OracleError‛);
END;
SQLERRM mit 1 Argument
SQLERRM(100) ß SQLCODE liefert ORA-001403: no data found
SQLCODE ist immer negativ, außer 100
SQLERRM(-1)
Eigene Fehlertexte definieren:
RAISE_APPLICATION_ERROR (error_nr, error_text)
Errorn … -20000 bis –20999
Error-Message max 512 Bytes
Exception Propagation
Exceptions in Executable Section
Blockstrukture
DECLARE
BEGIN
DECLARE
BEGIN innerer Block
END;
END;
Wenn der aktuelle Block einen Handler für die exception besitzt wird dieser Handler ausgeführt und der Block beendet.
Wenn kein Handler vorhanden ist wird die Exception dem äußerem Block weitergegeben.
Beispiel 1:
DECLARE
A EXCEPTION;
BEGIN
BEGIN
RAISE A;
EXCEPTION A;
WHEN A THEN
END;
END;
Bsp.: 2
DECLARE
A Exception;
B Exception;
BEGIN
BEGIN
RAISE B;
EXCEPTION
WHEN A THEN
END;
Exception
WHEN B THEN
END;
Bsp.: 3
DECLARE
A EXCEPTION
B EXCEPTION
BEGIN
BEGIN
RAISE A
RAISE B
EXCEPTION
WHEN A THEN
RAISE;
WHEN B THEN
RAISE A;
END;
EXCEPTION
WHEN A THEN
END;
Exceptions in Declarative Section
Werden immer an den übergeordneten Block weitergeleitet.
DECLARE
Val NUMBER(3):=‛ABC‛;
Value_Error
BEGIN
EXCEPTION
WHEN OTHERS THEN
END;
EXCEPTIONS in der Exception-Section
Werden an den übergeordneten Block weitergeleitet, da nur 1 Exception aktiv sein kann.
Transaktion Wiederholen.
For i in 1 10 LOOP
Begin
SAVEPOINT SP;
(SQL-Statemets)
COMMIT;
EXIT;
Exception
WHEN … THEN
ROLLBACK TO SP
…
END;
END;
Prozeduren
Create [OR Replace] Procedure procedure_name
[(argument[{IN|OUT|IN OUT}] type,
…
argument [{IN|OUT|IN OUT}]type)] AS
procedure body
Procedure Body
[Declaration Section] (ohne DECLARE)
BEGIN
Executable Section
[EXCEPTION
Exception Section]
END procedure_name;
Create or replace procedure test
( in_Par IN NUMBER
out_Par OUT NUMBER
inout_Par IN OUT NUMBER) AS
local_var NUMBER;
BEGIN
Loca_var:=in_Par; ü
In_Par:=7; --Error
Out_Par:=7; ü
Local_Par:=Out_Par; --Error
Local_var:=inout_Par; ü
Inout_Par:=7; ü
END TEST;
Declare
Var1 NUMBER:=10;
Var2 NUMBER;
Var3 NUMBER;
BEGIN
TEST(var1,var2,var3);
END;
Prozeduren sind kompilierte Datenbankobjekte.
Funktionen
Create [OR REPLACE] Function function_name
[(…Arguments)]
Return return_type AS
Function body
Returnstatement:
RETURN expression;
Create or Replace function get_name
(v_m_nr IN NUMBER)
Return VARCHAR2(20) AS
Help_name VARCHAR(20);
BEGIN
SELECT m_name INTO Help_Name
FROM personal p where
p.m_nr=v_m_nr;
Return help_name;
END;
Löschen von Prozeduren und Funktionen
DROP PROCEDURE procedure_name
DROP FUNCTION function_name
Prozeduren und Funktionen sind Datenbankobjekte: Sie befinden sich in versch. Tabellen.
User_objects
User_source System-View
User_errors
SELECT object_name, object_type, STATUS FROM user_objects where object_name=‛GET_NAME‛;
SELECT * FROM User_errors;
Lokale Unterprogramme
DECLARE
- - Prototyp
PROCEDURE A ();
- - Definition
Procedure A AS in declare Section
BEGIN
END A;
BEGIN
A ( );
END;
Lokale Unterprogramme sind nicht vorcompilierte Datenbankobjekte.
Abhängigkeiten von Unterprogrammen
Schüler
Klasse getFreePlaces
Log_Table Log_Function
Status von GetFreePlaces u. Log_function sei nach Übersetzung VALID
Wird eine DDL Operation auf ein abhängiges Objekt angewandt, dann wird der Status der UP Invalid.
ALTER TABLE Klassen ADD (notendurchschnitt NUMBER(3.2));
GetFreePlaces und Log_Function à Status INVALID
Trigger
CREATE [OR REPLACE] TRIGGER trigger_name
{BEFORE | AFTER } trigger_event ON table_name
[FOR EACH ROW [WHEN trigger_condition]]
trigger_body;
Trigger Typen: Unterscheidung nach Statement, Timing, Level,
Statement: INSERT, UPDATE, DELETE
Timing: BEFORE, AFTER
LEVEL:ROW, STATEMENTà Trigger wird nur 1 mal für das auslösende
Statement ausgeführt
For Each Row, Trigger wird für jede Reihe ausgeführt die durch das auslösende Statement betroffen ist.
12 mögliche Arten 3*2*2
Before Update statement level
After Insert or Delete row level
Trigger_event INSERT, UPDATE, DELETE
oder Kombination
trigger_body: PL/SQL – Block mit Ausnahme von TC Statements (COMMIT, ROLLBACK,SAVEPOINT)
Trigger befindet sich in der selben Transaktion wie das ihn auslösende SQL Statement.
Data Dictionary View: User_triggers …Trigger Info
Trigger Löschen:
DROP TRIGGER t_name
Ändern
ALTER TRIGGER t_name {DISABLE | ENABLE};
Reihenfolge der Triggerabfeuerung
Auslösendes Ereignis: DML – Statement
1.before Statement trigger
2.Für jede betroffene Reihe a) before row trigger b) DML – Statement c) after row trigger
3.After statement trigger
Die Reihenfolge von Triggern des selben Typs ist nicht definiert.
Verwendung von: old und; new in rowlevel triggern
: old,:new sind Pseudorecords des Types table_name%Rowtype
Zugriff auf Elemente erfolgt :old.element
My_rec:=:old à Error
Personen(P_nr,Name,Gehaltst)
INSERT INTO Personen(Name,Gehaltst)
VALUES(‚Maier-Eva‛,1);
P_nr soll ein Trigger ermitteln !
CREATE OR REPLACE TRIGGER create_pnr
BEFORE INSERT ON Personen
FOR EACH ROW
BEGIN
SELECT max(P_nr)+1 INTO :new.p_nr FROM Personen
END create_pnr
New wird nur im Before Row Level Trigger verändert, Old wird nie verändert
New und old können nicht in Statement Level Triggern verwendet werden.
WHEN – Klausel
WHEN condition
Trigger body wird nur für die Reihen durchlaufen, auf die die Bedingung zutrifft.
FOR EACH ROW
WHEN(new.p_nr -> 100)
INSERTING, UPDATING, DELETING
Create Trigger . . . .
Before Insert or Update or Delte in
BEGIN
IF INSERTING THEN
ELSE IF UPDATING
.
END IF;
END .;
Mutating Tables
Es gibt Einschränkungen beim Zugriff auf Tabellen und Spalten.
Mutating, constraining tables
Mutating table: Tabelle die gerade durch ein DDL Statement bearbeitet wird. In Bezug auf einen Trigger ist es die Tabelle für die er definiert wurde. Mutating tables können auch constraint tables sein, die infolge eines Delete Cascade verändert werden.
Constraint Tabel: Eine Tabelle die aufgrund referentiel Integrity constraints gelesen oder verändert wird. Bsp. Create Table Personal(
class B: private A { //Schutzstufen von A werden privat
int k,l;
public:
void g(){ f();}
}
Konvertierung Basisklasse- Subklasse
Class a{
Int i;
}
class B:public A{
int j;
};
A a;
B b;
a=b; à Info-Verlust;
b=a; NEIN Info fehlt
B::operator=(A&);
B b;
A *pa=&b; //Zeiger wird automatisch in Zeiger auf abgeleitete Klasse umgewandelt.
Virtuelle Funktionen
Anwendungen
1.)
class A {
Protected:
Int i;
Void f(){g();}
virtual void g(){ cout << i;};
}
class B:public A{
int j;
public:
void g(){cout << i << j;}
};
2.)
class A{
protected:
virtual void f(){cout << i;} // =0 Klassen müssen diese Funktion haben
};
class B:public A{
int j;
public:
void f(){cout << i <<j;}
};
B b;
A *pa=&b
Paà f(); à mit virtual f aus B
Anwendung
Array von Pointern auf Objekte aus verschiedenen vererbten Klassen. Funktionsaufruf wird der richtigen Klasse zugeordnet !!
Pointer auf Sandler
Pointer auf Student
Beide haben eine print Funktion, aber nicht die selbe.
P[0].print() findet die richtige Print Funktion für den Sandler.
LATE BINDING
Class A{
Int a1,a2;
Public:
Void f();
Void g();
Void h();
};
class B:public A{
int b1,b2;
public:
void g();
};
class C:public B{
int c1;
public:
void h();
};
Objekte ohne virtual Objekte mit virtual
A A
A1 A1
A2 A2
B B
A1 A1
A2 A2
B1 vft_ptr à vft virtual functionpointer
B2 B1 A::f table
C B2 B::g
A1 A::h
A2 C
B1 A1
B2 A2
C1 vft_ptr à vft
B1 A::f
B2 B::g
C1 C::h
Microsoft Foundation Classes
MFC – Klassenbibliothek
Vereinfachte Hülle für WIN32 API
Menge von high-level-Abstraktionen (OLE,DAO,…)
Große Auswahl von Quellcode
Hauptkategorien von MFC Klassen: von CObject abgeleitet
·Application Architecture
·Windows – Support FrameWindows Dialog Boxes Views Controls
·Exceptions
·File Services
·Grafik Objects
·Collections
·Klassem für ODBC,DAO,Sockets,…
Nicht von Cobject abgeleitete Klassen
Simple Value Type: Cpoint,Crect, Cstring,…
OLE
Typed Template Collections
MFC-Application
1.)SDI Single Document I
2.)MDI Multiple Document I
3.)Dialog Based
Klassen, die vom Application Wizzard erzeugt werden.
CmainFrame 1 )2 )3 ) in MainFrame.h MainFrame.cpp
CChildFrame 2) ChildFrame.h ChildFrame.cpp
Cxx App 1 )2 )3 ) in xx.h xx.cpp
Cxx Doc 1 )2 ) int xxDoc.h xxDoc.cpp
Cxx View 1 )2 ) „ View.h View.cpp
CxxDlg 3 ) „ „
CaboutDlg 1 )2 )3) „ „
Applikation
Projekt erstellen: Initialisierungen werden vorgenommen, die in InitInstance() wieder auftauchen. Je nach Projekttyp werden die oben genannten Klassen erzeugt.
Applications Klasse: CxxApp
Ein Objekt dieser Klasse ist schon ablauffähig.
CxxApp ist von CwinApp abgeleitet.
In xx.h deklariert.
In xx.cpp implementiert.
Element Funktionen: InitInstance()
CappAbout()
1 Applikationsobjekt
Cxx myApp; //Global
Wird vor AfxWinMain() erzeugt
AfxWinMain()
Ruft auf Init Application()
Init Instance
Run(); à Haupnachrichtenschleife der Applikation
(DispatchMessage())
Nachrichtenzuordnung
z.B. Message WM_LBUTTONDOWN
wird an den Anwendungsrahmen geschickt
à OnLButtonDown() wird ausgeführt.
Virtuelle Funktionen kommen als Nachrichtenbearbeiter nicht in Frage.
Nachrichtenbearbeiter können beliebige Namen haben (OnConnect) die die
Übergeordnete Klasse nicht kennt.
Virtual function pointer table wird riesig.
Lösung über Makros
In .h: DECLARE_MESSAGE_MAP();
Deklariert ein Array von Nachrichtentabelleneinträgen.
In .cpp BEGIN_MESSAGE_MAP
END_MESSAGE_MAP
Enthalten Initialisierungen für dieses Array, die individuelle Nachrichten repräsentieren, auf die die Klasse reagieren kann.
Passende Nachrichtenbearbeiter werden in der Reihenfolge gesucht:
Document – View – Architecture
Trennung von Daten und deren Darstellung.
Vorteile: Unterschiedliche Darstellung der Daten, Tabellen, Diagramme.
Doc-Object enthält die Daten
View-Object zeigt die Daten und erlaubt das Editieren
SDI Anwendung
Besitzt eine von Cdocument abgeleitete Doc-Klasse, und 1 oder mehrere von Cview abgeleitete Cview-Klassen.
CObject
CCmdTarge
CDocument
CMyDoc
Title Bar
Menu Bar
Tool Bar
Formular
Ressource Controls
Status Bar
CxxView-Object
ClistBox myLB;
Cstring myStrname;
CxxDoc Object
Daten
Inhalt einer Datei
3 Klassen: CmainFrame
CxxView
CxxDoc
Deklaration und Implementierung
CmainFrame:public CframeWnd
In Mainframe.h deklariertCon
Elementvariablen:
m_wndStatusBar
m_wndToolBar
Elementfunktionen: in .cpp
OnCreate( )…erzeugt ToolBar und StatusBar
CxxDoc::public Cdocument
Wichtige Memberfunktionen
DeleteContens()
OnNewDocument()
OnSaveDocument()
Serialze()
Aufrufreihenfolge
Bei Start der SDI Anwendung
1.DeleteContens()
2.OnNewDocument()
Bei Auswahl der Menuepunktes „New“
1.DeleteContens
2.OnNewDocument
Bei Speichern, Speichern als, öffnen
1.OnSaveDocument
2.Serialize
Weitere Funktionen
SetModifiedFlag()
IsModified()
UpdatAllViews() à kann auch am Views Objekt aufgerufen werden