Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung Nächste Überarbeitung Beide Seiten der Revision | ||
se:datenbankentwicklung [2008-09-13 21:19] stefan |
se:datenbankentwicklung [2008-09-14 18:24] stefan |
||
---|---|---|---|
Zeile 17: | Zeile 17: | ||
* {{:se:oraclearchitektur.jpg|}} | * {{:se:oraclearchitektur.jpg|}} | ||
* {{:se:oraclecache.jpg|}} | * {{:se:oraclecache.jpg|}} | ||
- | * System Global Area | + | * System Global Area: Benutzerübergreifender Cache |
- | * Buffer Cache: Abgefragte oder modifizierte Daten, vermeidet physikalischen Zugriff auf Dateien | + | * Data Buffer Cache: Abgefragte oder modifizierte Daten, vermeidet physikalischen Zugriff auf Dateien, zuletzt bearbeitete Blöcke |
- | * Redo Buffer: Redo-Informationen werden zwischengespeichert bis sie physikalisch geschrieben werden | + | * Redo Log Buffer: Redo-Informationen werden zwischengespeichert bis sie physikalisch geschrieben werden |
- | * Shared Pool: Benutzerübergreifende Informationen (SQL-Statements, Infos aus Data Dictionary, Tabellenbeschreibungen, Stored Procedures) | + | * Dictionary Cache: Data Dictionary Informationen |
+ | * Shared SQL Pool: Benutzerübergreifende Informationen (übersetzte SQL-Statements, Tabellenbeschreibungen, Stored Procedures) | ||
* Large Pool: Optionaler Bereich zum Puffern von größeren I/O-Operationen | * Large Pool: Optionaler Bereich zum Puffern von größeren I/O-Operationen | ||
+ | * Größe wird bei der Installation gesetzt: SGA Target, Größe der SGA-Komponenten wird automatisch angepasst | ||
+ | * Mögliche Fehler: ''unable to allocate shared memory, no free buffers in buffer pool'' | ||
+ | * Prozesskommunikation über Speicherbereiche | ||
+ | * speichert permanente Verwaltungsinformationen | ||
+ | * Program Global Area: Speicher für jede Session (Prozess) individuell | ||
+ | * Größe wird bei Installation gesetzt: PGA-Aggregat-Größe kann angepasst werden, individuelle PGA-Größen werden automatisch angepasst | ||
+ | * Mögliche Fehler: ''out of process memory'' | ||
+ | * Datenbankspeicher | ||
+ | * {{:se:oraclestoragestructure.jpg|}} | ||
+ | * Zusammenfassung von logischen und physischen Strukturen | ||
+ | * Enthalten Nutzdaten und Metadaten sowie Kontrolldaten (z.B. zum Datenbankstart) | ||
+ | * **Logische Strukturen** sind nur der DB bekannt | ||
+ | * **Physikalische Strukturen** sind die Dateien auf der Festplatte | ||
+ | * **Recovery-bezogene Strukturen** (z.B. Redo-Logs und Backups) dienen der Wiederherstellung des Systems (z.B. nach Betriebssystemausfällen), werden in der Flash Recovery Area abgelegt | ||
+ | * Tablespaces | ||
+ | * System- und Nutzdaten liegen im permanenten Tablespace | ||
+ | * SYS hat SYSTEM als permanenten Tablespace, alle übrigen Benutzer USERS | ||
+ | * SYSTEM | ||
+ | * Data Dictionary, Tabellen mit administrativen Informationen über die DB (in Schema SYS) | ||
+ | * SYSAUX | ||
+ | * Hilfstablespace für einige Komponenten/Produkte (z.B. HR) | ||
+ | * UNDO | ||
+ | * Rollback, Read Consistency, Flashback Queries | ||
+ | * USERS | ||
+ | * Permanente Benutzerdaten | ||
+ | * TEMP | ||
+ | * temporäre (Zwischen-)Ergebnisse, Parallelisierung und Performanceverbesserung von Operationen (z.B. Sortierung), eine oder mehrere Dateien | ||
+ | * Physikalische Strukturen | ||
+ | * Dateien und temporäre Speicherung (datafiles, tempfiles) | ||
+ | * Datafiles: Betriebssystem-Dateien, nur von Oracle-Instanz bearbeitbar | ||
+ | * Tempfiles: nur für temporary Tablespace | ||
+ | * Kontroll-Dateien (control files) | ||
+ | * Enthält spezifische Informationen, die für das Funktionieren der Datenbank essentiell sind | ||
+ | * Server-Parameter Dateien (server parameter file) | ||
+ | * SPFILE enthält Initialisierungsparameter (binär) | ||
+ | * Parameterwerte werden mit ALTER SYSTEM verändert | ||
+ | * Passwort-Datei (password file) | ||
+ | * Authentifizierung für Remote-Zugriff des SYS-Users | ||
+ | * Enthält verschlüsseltes SYS-Passwort | ||
+ | * Flash Recovery Area | ||
+ | * Verzeichnis, getrennt von der Datenbank | ||
+ | * Enthalten: | ||
+ | * Backup der Datenbank-Dateien (Datenbank-Dateien, Control-Dateien, Server Parameter Files SPFILES) | ||
+ | * Gespeichert in Backup Sets | ||
+ | * Bestehend aus Backup pieces | ||
+ | * Online redo log Dateien | ||
+ | * Aufnahme aller Datenbankänderungen | ||
+ | * Archivierte redo log Dateien | ||
+ | * Dauerhafte Archivierung der Datenbankänderungen (ARCHIVELOG Mode) | ||
+ | * Speicherort | ||
+ | * Initialisierungsparameter DB_RECOVERY_FILE_DEST | ||
+ | * Einloggen als SYS-DBA: / SYSDBA | ||
+ | * ''ALTER SYSTEM SET DB_RECOVERY_FILE_DEST = 'new_path';'' | ||
+ | * Starten einer PL/SQL-Prozedur zum verschieben der Information: ''@?/sqlplus/admin/movelogs'' | ||
+ | * Größe | ||
+ | * Initialisierungsparameter DB_RECOVERY_FILE_DEST_SIZE | ||
+ | * Einloggen als SYS-DBA: / SYSDBA | ||
+ | * ''ALTER SYSTEM SET DB_RECOVERY_FILE_DEST_SIZE = new_size;'' (new_size= nK (kilobytes), nM (megabytes) or nG (gigabytes)) | ||
+ | * Schemas | ||
+ | * Logische Container für DB-Objekte | ||
+ | * Sind einem User zugeordnet | ||
+ | * Datenbankobjekt = Schemaobjekt | ||
+ | * Privilegien: System-/Objekt-Privilegien | ||
+ | * Rollen: CONNECT (verbinden und abfragen), RESOURCE (Objekte erzeugen), DBA (alles außer STARTUP und SHUTDOWN) | ||
+ | * Benutzer: interne (z.B. SYS, SYSTEM) und Datenbankbenutzer | ||
+ | * Einloggen, auch wenn DB heruntergefahren ist: AS SYSDBA | ||
+ | * Passwort ändern: ALTER USER user IDENTIFIED BY pass | ||
+ | * Datenaustausch | ||
+ | * Export/Import: proprietäres Format | ||
+ | * ''expdp, impdp'' (kein XML), ''exp, imp'' (kein FLOAT und DOUBLE) | ||
+ | * Unload/Load: CSV etc. | ||
+ | * Weboberfläche (nur eine Tabelle auf einmal, keine Filterung, CSV oder XML), ''sqlldr'' (verschiedenste Formate möglich) | ||
+ | * SQL*Loader | ||
+ | * Methoden: conventional, direct, external tables | ||
+ | * ''sqlldr hr/hr DATA=dependents.dat CONTROL=dependents.ctl LOG=dependents.log'' | ||
+ | * Dump | ||
+ | * ''sqlplus SYSTEM/password'' | ||
+ | * ''CREATE OR REPLACE DIRECTORY dmpdir AS 'c:\oraclexe\app\tmp';'' | ||
+ | * ''GRANT READ,WRITE ON DIRECTORY dmpdir TO hr;'' | ||
+ | * ''ALTER USER hrdev IDENTIFIED BY hrdev;'' | ||
+ | * ''expdp SYSTEM/password SCHEMAS=hr DIRECTORY=dmpdir DUMPFILE=schema.dmp LOGFILE=expschema.log'' | ||
+ | * ''impdp SYSTEM/password SCHEMAS=hr DIRECTORY=dmpdir DUMPFILE=schema.dmp REMAP_SCHEMA=hr:hrdev EXCLUDE=constraint, ref_constraint, index TABLE_EXISTS_ACTION=replace LOGFILE=impschema.log'' | ||
+ | * Backup und Recovery | ||
+ | * Schützen aller DB-Dateien (Daten, Control, SPFILE, REDO LOG) | ||
+ | * Sicherung der gesamten Datenbank in der Flash Recovery Area | ||
+ | * Recovery Manager (RMAN) bedienbar über Kommandozeile/Script | ||
+ | * Backup Retention Policy: Zwei vollständige Backups müssen vorgehalten werden, ARCHIVELOG: zusätzlich alle Logs für media recovery | ||
+ | * ARCHIVELOG schützt gegen Fehler des BS, der Oracle Instanz und der Media Disk | ||
+ | * Online-(ARCHIVELOG)/Offline-(NOARCHIVELOG)Backup | ||
+ | * Ein-/Ausschalten | ||
+ | * SQLPLUS SYS/password AS SYSDBA | ||
+ | * SHUTDOWN IMMEDIATE | ||
+ | * STARTUP MOUNT | ||
+ | * ALTER DATABASE [NO]ARCHIVELOG; | ||
+ | * ALTER DATABASE OPEN; | ||
+ | * Flashback Queries (Anzeige historischer Daten) | ||
+ | * ''SELECT * FROM employees AS OF TIMESTAMP TO_TIMESTAMP('2005-04-04 09:30:00', 'YYYY-MM-DD HH:MI:SS') WHERE last_name = 'Chung';'' | ||
+ | * ''INSERT INTO employees (SELECT * FROM employees AS OF TIMESTAMP TO_TIMESTAMP('2005-04-04 09:30:00', 'YYYY-MM-DD HH:MI:SS') WHERE last_name = 'Chung');'' | ||
+ | * Tabellen löschen bedeutet Verschieben in den Papierkorb (Recycle Bin), Leeren bei Speicherbedarf oder manuell | ||
+ | * Datenbankstruktur | ||
+ | * {{:se:dbstruktur.jpg|}} | ||
+ | * 3 Ebenen: externe (VIEW), logische (TABLE), interne (INDEX) | ||
+ | * Eine DB ist ein Programmpaket zur Manipulation von gespeicherten Daten (Benutzer-/Verwaltungsdaten) | ||
+ | * Physische Sicht (Dateien) != logische Sicht (Tablespaces) | ||
+ | * Dateigruppen | ||
+ | * Datenbankdateien (Tabellen, Data Dictionary, PL/SQL, Index, Nutzdaten) | ||
+ | * REDO-Logs (Protokollierung aller Änderungen, jede DB hat mind. 2, ARCHIVELOG: vor Überschreiben Sicherung) | ||
+ | * Kontrolldateien (Zeitpunkt der DB-Erstellung, Namen der DB-Dateien und der Logs) | ||
+ | * Tablespaces | ||
+ | * Datenbankdateien sind nur benannter Speicherplatz -> logische Struktur darüber (Tablespaces) | ||
+ | * eine Datei -> ein Tablespace, ein Tablespace -> mehrere Dateien | ||
+ | * Standard-Tablespaces: SYSTEM, TEMP, USERS, Rollback Data, Tools | ||
+ | * ''SELECT * FROM user_tablespaces;'' | ||
+ | * ''CREATE TABLESPACE Users DATAFILE 'data3.ora' SIZE 100MB;'' | ||
+ | * ''ALTER TABLESPACE system ADD DATAFILE 'data2.ora' SIZE 200MB;'' | ||
+ | * ''DROP TABLESPACE TA [INCLUDING CONTENTS];'' | ||
+ | * Modi: Online/Offline: ''ALTER TABLESPACE TA [ONLINE | OFFLINE] [NORMAL | TEMPORARY | IMMEDIATE];'' | ||
+ | * {{:se:tablespacemodi.jpg|}} | ||
+ | * Datenbankobjekte/Segmente: Tabellen, Indizes, Recovery-Informationen | ||
+ | * Tablespaces sind in Segmente (Daten, Index, Rollback, temporär) unterteilt | ||
+ | * Jedes DB-Objekt belegt genau ein Segment | ||
+ | * Problem: Fragmentierung | ||
+ | * Segmente bestehen aus Extents (unteschiedlicher Größe) | ||
+ | * Anfangs-/Folge-Extent | ||
+ | * Die Festlegung der Anfangs-Extent-Größe erfolgt über den Parameter initial | ||
+ | * Die Anzahl der bei der Erstellung eines Segments mit angelegten Folge-Extents wird mit dem Parameter minextents definiert. | ||
+ | * Die Anzahl der insgesamt maximal möglichen Folge-Extents wird mit dem Parameter maxextents definiert. | ||
+ | * Die Größe der Folge-Extents kann festgelegt bzw. dynamisch verändert werden. Die Festlegung der Folge-Extent-Größe erfolgt über den Parameter next | ||
+ | * Der Parameter pctincrease gibt den Wachstumsfaktor der Extents in % an. | ||
+ | * ''TRUNC TABLE'' bewirkt Zurücksetzen des belegten Speichers (<> ''DELETE FROM TABLE'') | ||
+ | * Festlegung der Parameter bei Erstellung des Tablespaces oder der DB-Objekte | ||
+ | * {{:se:storageclause.jpg|}} | ||
+ | * Extents bestehen aus Oracle-Datenblöcken (2KB) | ||
+ | * Block-Kopf | ||
+ | * Verwaltungsinformationen 57 Byte | ||
+ | * Datensatz-Directory, für jeden im Block abgelegten Datensatz 2 Byte | ||
+ | * Transaktionsdirectory (23 Byte pro Eintrag) | ||
+ | * initrans (1 (default) - 255) | ||
+ | * maxtrans | ||
+ | * Block-Datenbereich | ||
+ | * Freibereich (Speicher für sich vergrößernde Datensätze) | ||
+ | * Einfüge-Bereich (neue Datensätze) | ||
+ | * Der pctfree-Parameter gibt an, wie viel % des DB-Block-Datenbereiches als Freibereich genutzt werden sollen. | ||
+ | * Der pctused-Parameter gibt den Mindestfüllgrad eines DB-Blockes an. | ||
+ | * Insert-Operationen werden an Blöcken vorgenommen, deren Mindestfüllgrad noch nicht erreicht ist. Damit wird eine gleichmäßige Belegung der DB-Blöcke erreicht. | ||
+ | * Der freelists-Parameter gibt die Anzahl der FREE-Listen an. | ||
+ | * Block-Verwaltung | ||
+ | * {{:se:blockmanagement.jpg|}} | ||
+ | * Überlauf: zu lange Blöcke werden in einen neuen Block eingetragen und im ursprünglichen eine Referenz erzeugt | ||
+ | * Freispeicherverwaltung: Blöcke mit Füllstand unter pctused werde in FREE BLOCK-Listen eingetragen | ||
+ | * Transactions-FREE-Liste: Innerhalb einer Transaktion freiwerdende Blöcke | ||
+ | * Segment-FREE-Liste: Blöcke, deren Füllstand unter pctused liegt und die nicht in einer Transaktion bearbeitet werden | ||
+ | * {{:se:freispeicherverwaltung.jpg|}} | ||
+ | * {{:se:insertoperation.jpg|}} | ||
+ | * Datensätze | ||
+ | * Kopf (Verwaltungsinformationen, 2-5 Byte) | ||
+ | * ID (2 Byte) | ||
+ | * Anzahl Spalten (1 Byte, obligatorische Spalte row-id -> 255 Spalten für Benutzer) | ||
+ | * Verkettungsadressen (1 Byte) | ||
+ | * Cluster-Schlüsselinformationen (1 Byte) | ||
+ | * Rumpf (Daten) | ||
+ | * Spaltenlänge: 1 Byte (NUMBER, CHAR, DATE), 3 Byte (VARCHAR, VARCHAR2, LONG, RAW, LONG RAW) | ||
+ | * Spaltendaten | ||
+ | * Dictionary Views: DBA_FREE_SPACE, USER_TABLESPACES, USER_SEGMENTS, USER_EXTENTS, USER_TABLES, USER_TS_QUOTAS | ||
+ | * Architektur | ||
+ | * Oracle Instanz | ||
+ | * SGA, PGA, Hintergrundprozesse | ||
+ | * Definiert durch SGA, Files und DB-Prozesse | ||
+ | * Hat eindeutige SID | ||
+ | * Orace Server-Prozesse | ||
+ | * Parsen und Ausführen von SQL, Lesen von DB-Blöcken aus Files | ||
+ | * Konfiguration | ||
+ | * Dedicated Server: Jeder Anwenderprozess hat einen Serverprozess | ||
+ | * Multi-Threaded Server: Anwenderprozess übergibt Request an Dispatcher -> Request-Queue in SGA -> Abarbeitung durch beliebigen Serverprozess -> Ergebnis wird in Response-Queue in SGA gelegt | ||
+ | * Beide Möglichkeiten können gleichzeitig genutzt werden, Entscheidung über Parameter beim Start des Anwenderprozesses | ||
+ | * viele Benutzer, wenig Last -> MTS | ||
+ | * viele Prozesse, hohe Last -> DS | ||
+ | * Client-/Server-Architektur | ||
+ | * Schützt Server-Programme, unterschiedliche Rechner für Client und Server | ||
+ | * Hintergrundprozesse | ||
+ | * Recoverer (RECO): Recovery bei verteilten DBs | ||
+ | * Process Monitor (PMON): Recovery für fehlerhafte Anwenderprozesse | ||
+ | * System Monitor (SMON): Recovery beim Systemstart | ||
+ | * Database Writer (DBWR): liest/schreibt Blöcke aus Cache in DB und umgekehrt | ||
+ | * Redo Log Writer (LGWR): liest/schreibt REDO-Log | ||
+ | * Checkpoint (CKPT): übernimmt die Checkpoint-Aktivitäten vom LGWR (optional) | ||
+ | * Archiver (ARCH): archiviert REDO-Logs | ||
+ | * Lock (LCKn): Aufgaben bei Parallel-Server-Konfiguration (optional) | ||
+ | * Systemparameter editieren | ||
+ | * ''CREATE PFILE [='pfile_name'] FROM SPFILE [='spfile_name'];'' | ||
+ | * ''CREATE SPFILE [='pfile_name'] FROM PFILE [='spfile_name'];'' | ||
- | | ||
===== PL/SQL (Schwerpunkt der Klausur) ===== | ===== PL/SQL (Schwerpunkt der Klausur) ===== | ||
* PL/SQL: Procedural Language extension to SQL | * PL/SQL: Procedural Language extension to SQL | ||
Zeile 33: | Zeile 224: | ||
* Modularisierte Anwendungsentwicklung | * Modularisierte Anwendungsentwicklung | ||
* Portabilität des PL/SQL-Codes | * Portabilität des PL/SQL-Codes | ||
- | * Exception Handling | + | * Exception Handling |
* PL/SQL-Blöcke | * PL/SQL-Blöcke | ||
* Aufbau | * Aufbau | ||
Zeile 43: | Zeile 234: | ||
* Anonymous | * Anonymous | ||
* Procedure | * Procedure | ||
- | * Function | + | * Function |
* Speicherort: Server oder Anwendung | * Speicherort: Server oder Anwendung | ||
* Variablen | * Variablen | ||
Zeile 61: | Zeile 252: | ||
* referenziert mit führendem ''&'': Eingabe zur Laufzeit | * referenziert mit führendem ''&'': Eingabe zur Laufzeit | ||
* ''ACCEPT varname PROMPT 'Text''' | * ''ACCEPT varname PROMPT 'Text''' | ||
- | * User Variable: deklariert mit ''DEFINE'', referenziert mit ''&'' | + | * User Variable: deklariert mit ''DEFINE'', referenziert mit ''&'' |
* ''%TYPE''-Attribut: Datentyp einer Spalte/Variable übernehmen (''identifier table.column_name%TYPE;'') | * ''%TYPE''-Attribut: Datentyp einer Spalte/Variable übernehmen (''identifier table.column_name%TYPE;'') | ||
- | * Mögliche Boolean-Werte: ''TRUE, FALSE, NULL'' (!) | + | * Mögliche Boolean-Werte: ''TRUE, FALSE, NULL'' (!) |
* Lexikalische Einheiten | * Lexikalische Einheiten | ||
* Folgen von Zeichen, Zahlen, Whitespace und Symbolen | * Folgen von Zeichen, Zahlen, Whitespace und Symbolen | ||
- | * Typen: Identifier, Delimiter, Literals, Comments | + | * Typen: Identifier, Delimiter, Literals, Comments |
* SQL-Funktionen | * SQL-Funktionen | ||
* Nicht in PL/SQL verfügbar: ''DECODE'', ''GROUP''-Funktionen | * Nicht in PL/SQL verfügbar: ''DECODE'', ''GROUP''-Funktionen | ||
Zeile 72: | Zeile 263: | ||
* ''INTO'' wird benötigt | * ''INTO'' wird benötigt | ||
* Abfragen müssen genaue eine Zeile zurückliefern | * Abfragen müssen genaue eine Zeile zurückliefern | ||
- | * Variablenpriorität: Spaltennamen -> lokale Variablen/Parameter -> Tabellennamen | + | * Variablenpriorität: Spaltennamen -> lokale Variablen/Parameter -> Tabellennamen |
* Cursor | * Cursor | ||
* Zeiger auf den privaten Speicherplatz des Oracle-Servers | * Zeiger auf den privaten Speicherplatz des Oracle-Servers | ||
* Implizit: werden intern vom Oracle-Server erzeugt und verwendet (z.B. bei SQL-Statements) | * Implizit: werden intern vom Oracle-Server erzeugt und verwendet (z.B. bei SQL-Statements) | ||
* Attributes: ''SQL%FOUND'', ''SQL%NOTFOUND'', ''SQL%ROWCOUNT'' | * Attributes: ''SQL%FOUND'', ''SQL%NOTFOUND'', ''SQL%ROWCOUNT'' | ||
- | * Explizit: werden vom Programmierer definiert und verwendet | + | * Explizit: werden vom Programmierer definiert und verwendet |
* Kontrollstrukturen | * Kontrollstrukturen | ||
* ''IF THEN - ELSIF - ELSE''' | * ''IF THEN - ELSIF - ELSE''' | ||
Zeile 98: | Zeile 289: | ||
* dynamische Länge | * dynamische Länge | ||
* Zugriff über Index ''table(1)'' | * Zugriff über Index ''table(1)'' | ||
- | * verfügbare Methoden: ''EXISTS, COUNT, FIRST, LAST, PRIOR, NEXT, DELETE'' | + | * verfügbare Methoden: ''EXISTS, COUNT, FIRST, LAST, PRIOR, NEXT, DELETE'' |
* VARRAYs und Nested Tables | * VARRAYs und Nested Tables | ||
* Cursors | * Cursors | ||
Zeile 106: | Zeile 297: | ||
* entsprechen Pointern aus C (Referenz auf Speicherbereich) | * entsprechen Pointern aus C (Referenz auf Speicherbereich) | ||
* Datentyp der Curosr-Variablen ist ''REF CURSOR'' | * Datentyp der Curosr-Variablen ist ''REF CURSOR'' | ||
- | * Cursor sind statisch, Cursor-Variablen sind dynamisch | + | * Cursor sind statisch, Cursor-Variablen sind dynamisch |
* Exceptions | * Exceptions | ||
* Exceptions sind Fehler, die während der Programmausführung auftreten | * Exceptions sind Fehler, die während der Programmausführung auftreten | ||
Zeile 112: | Zeile 303: | ||
* Behandlung: Handler oder weiterwerfen | * Behandlung: Handler oder weiterwerfen | ||
* Es sind mehrere Handler pro Block erlaubt, aber lediglich einer wird abgearbeitet. | * Es sind mehrere Handler pro Block erlaubt, aber lediglich einer wird abgearbeitet. | ||
- | * Vorhandene Exceptions: z.B. ''NO_DATA_FOUND, TOO_MANY_ROWS, ZERO_DIVIDE'' | + | * Vorhandene Exceptions: z.B. ''NO_DATA_FOUND, TOO_MANY_ROWS, ZERO_DIVIDE'' |
* nicht vordefinierte Exceptions behandeln: ''PRAGMA EXCEPTION_INIT'' | * nicht vordefinierte Exceptions behandeln: ''PRAGMA EXCEPTION_INIT'' | ||
* Funktionen: ''SQLCODE, SQLERRM'' | * Funktionen: ''SQLCODE, SQLERRM'' | ||
* Eigene Exceptions werfen: ''RAISE'' | * Eigene Exceptions werfen: ''RAISE'' | ||
- | * Eigene Fehlermeldungen analog zum Oracle-Server ausgeben: ''RAISE_APPLICATION_ERROR'' (nur mit Nummer -20000 bis -20999) | + | * Eigene Fehlermeldungen analog zum Oracle-Server ausgeben: ''RAISE_APPLICATION_ERROR'' (nur mit Nummer -20000 bis -20999) |
* Prozeduren und Funktionen | * Prozeduren und Funktionen | ||
* {{:se:proceduresvsfunctions.jpg|}} | * {{:se:proceduresvsfunctions.jpg|}} | ||
Zeile 122: | Zeile 313: | ||
* {{:se:anonymousblockssubprograms.jpg|}} | * {{:se:anonymousblockssubprograms.jpg|}} | ||
* Parameter | * Parameter | ||
- | * Formal <> actual Parameters | + | * Formal <> actual Parameters |
* Parameter Modes: ''IN, OUT, IN OUT'' | * Parameter Modes: ''IN, OUT, IN OUT'' | ||
- | * {{:se:subprogramparameters.jpg|}} | + | * {{:se:subprogramparameters.jpg|}} |
* Passing: positional, named, combination | * Passing: positional, named, combination | ||
* Kein Zugriff auf Host-Variablem | * Kein Zugriff auf Host-Variablem | ||
Zeile 137: | Zeile 328: | ||
* Vorteile: Modularisierung, einfachere Verwaltung, einfacheres Anwendungsdesign, Information Hiding, bessere Performance (Package wird komplett und nur einmal in den Speicher geladen), Overloading | * Vorteile: Modularisierung, einfachere Verwaltung, einfacheres Anwendungsdesign, Information Hiding, bessere Performance (Package wird komplett und nur einmal in den Speicher geladen), Overloading | ||
* Overloading: Beispiele im ''STANDARD''-Package (z.B. ''TO_CHAR'') | * Overloading: Beispiele im ''STANDARD''-Package (z.B. ''TO_CHAR'') | ||
- | * Forward Declaration: Spezifikation eines Subprograms mit Semikolon abgeschlossen. Wird zu Beginn eines Blocks gemacht, damit Prozeduren auf die möglicherweise weiter unten im Quelltext implementierten Prozeduren zugreifen können. | + | * Forward Declaration: Spezifikation eines Subprograms mit Semikolon abgeschlossen. Wird zu Beginn eines Blocks gemacht, damit Prozeduren auf die möglicherweise weiter unten im Quelltext implementierten Prozeduren zugreifen können. |
* Package Initialization Block: ''BEGIN''-Teil am Ende des package body zur Initialisierung von Variablen. | * Package Initialization Block: ''BEGIN''-Teil am Ende des package body zur Initialisierung von Variablen. | ||
* Package State | * Package State | ||
Zeile 146: | Zeile 337: | ||
* Execution Flow: parse (compile time), bind (compile time), execute, fetch | * Execution Flow: parse (compile time), bind (compile time), execute, fetch | ||
* Dynamic SQL ist ein String | * Dynamic SQL ist ein String | ||
- | * ''EXECUTE IMMEDIATE .. INTO .. USING'' | + | * ''EXECUTE IMMEDIATE .. INTO .. USING'' |
* Triggers | * Triggers | ||
* PL/SQL-Block, der einer Tabelle, einem View, einem Schema oder einer Datenbank zugeordnet ist | * PL/SQL-Block, der einer Tabelle, einem View, einem Schema oder einer Datenbank zugeordnet ist | ||
Zeile 153: | Zeile 344: | ||
* Trigger Events: ''INSERT, UPDATE [OF], DELETE'' | * Trigger Events: ''INSERT, UPDATE [OF], DELETE'' | ||
* Row Trigger: ''FOR EACH ROW, :NEW, :OLD'' | * Row Trigger: ''FOR EACH ROW, :NEW, :OLD'' | ||
- | * {{:se:triggersvsprocedures.jpg|}} | + | * {{:se:triggersvsprocedures.jpg|}} |
===== Web ===== | ===== Web ===== | ||
+ | * Voraussetzung: Database Access Descriptor (DAD) vorhanden | ||
+ | * erzeugen mit DBA-Rechten | ||
+ | * ''DBMS_EPG.create_dad (dad_name => 'systemdad', path => '/systemdad/*');'' | ||
+ | * HTML-Ausgabe über HTP-/HTF-Package | ||
+ | * Vorteile: Aufbau auf PL/SQL, integriert SQL und HTML, kein zusätzliches Konfigurationsmanagement | ||
+ | * Webapplikationen werden als Packages erstellt | ||
+ | * HTML-Erzeugung mit PL/SQL Web Toolkit -> HTP/HTF | ||
+ | * GET vs. POST | ||
+ | * gut für Debugging, Programmstruktur wird offenbart, Bookmarks möglich, begrenzte Länge der URL | ||
+ | * mehrere Parameter (Array): ''OWA_UTIL.ident_arr'' (beginnt bei Index 2) | ||
+ | * Arbeitsweise: Requests kommen anonym auf dem Server an -> Server liefert Seite aus | ||
+ | * Kein Session-Konzept, kein Benutzerlogging | ||
+ | * Designschritte | ||
+ | * {{:se:designschritte.jpg|}} | ||
+ | * Application Design | ||
+ | * High Level Storyboard: Screens und Navigation (Site Map) | ||
+ | * Detailed Storyboard | ||
+ | * Alle Elemente, auf die der Benutzer klicken kann | ||
+ | * Nicht alle Datenfelder, nur soviel um die ausgeführte Aktion erkennen zu können | ||
+ | * Jeder Ausgang aus einer Seite wird mit einem Pfeil mit dem resultierenden Screen verbunden | ||
+ | * Application Flow Diagram: Welche Daten werden zwischen den Seiten ausgetauscht (abwechselnd Procedure/Screen) | ||
+ | * Updates stellen aufgrund des fehlenden Sessionmanagements ein Problem dar (alte Daten müssen mit übergeben werden, um herauszufinden, ob jemand anderes die Daten in der Zwischenzeit bearbeitet hat) | ||
+ | * Skeletons für Procedures/Functions mit den ermittelten Parametern erzeugen | ||
+ | * Page Design | ||
+ | * Beispielseiten erstellen, Fokus auf Layout -> Designer machen lassen | ||
+ | * Übliche Tipps: kein Splashscreen, Browsertests, wenige Grafiken, Web Standards, Formularelemente zur Einschränkung der Benutzereingaben, kontrastreicher Text | ||
+ | * Conversion | ||
+ | * WebAlchemy, html2plsql -> statische Seiten | ||
+ | * Business Logic | ||
+ | * die statischen Seiten mit "echter" Logik versehen | ||
+ | * Modularization | ||
+ | * Trennung von HTML-Ausgabe und Logik | ||
+ | * Header-/Footer-Procedures etc. | ||
+ | * eigene projektübergreifende Webkomponenten erzeugen | ||
===== Modellierung ===== | ===== Modellierung ===== |