Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
se:datenbankentwicklung [2008-09-14 18:24] stefan |
se:datenbankentwicklung [2014-04-05 11:42] |
||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
- | ====== Datenbankentwicklung ====== | ||
- | ===== Administration ===== | ||
- | * Benutzergruppe ''ORA_DBA'' wird bei der Installation angelegt. | ||
- | * Benutzer dürfen alles (inkl. ''STARTUP/SHUTDOWN''). | ||
- | * Operating System Authentication: ''SQLPLUS / AS SYSDBA'' | ||
- | * ''STARTUP'' | ||
- | * ''OPEN <> MOUNT'' (nur Verwaltungsaktionen möglich) | ||
- | * ''SHUTDOWN'' | ||
- | * ''TRANSACTIONAL, IMMEDIATE, ABORT'' | ||
- | * Client und Server kommunizieren über Oracle Net (Ports 1521 und 8080) | ||
- | * Listener steuern: ''lsnrctl'' START/STOP/STATUS | ||
- | * Listener-Konfiguration: listener.ora | ||
- | * Ändern der DB-Portnummer: listener.ora ändern, ''ALTER SYSTEM SET LOCAL_LISTENER="(ADDRESS=(PROTOCOL=TCP)(HOST= rzn055.hv.fh-nuernberg.de)(PORT=1522))"; ALTER SYSTEM REGISTER;'' | ||
- | * Ändern der Web-Portnummer: als ''SYSTEM: EXEC DBMS_XDB.SETHTTPPORT(8080);'' | ||
- | * Remote-Zugriff auf Weboberfläche: als ''SYSTEM: EXEC DBMS_XDB.SETLISTENERLOCALACCESS(FALSE);'' oder über Oberfläche unter Administration -> Manage HTTP access | ||
- | * {{:se:oraclearchitektur.jpg|}} | ||
- | * {{:se:oraclecache.jpg|}} | ||
- | * System Global Area: Benutzerübergreifender Cache | ||
- | * Data Buffer Cache: Abgefragte oder modifizierte Daten, vermeidet physikalischen Zugriff auf Dateien, zuletzt bearbeitete Blöcke | ||
- | * Redo Log Buffer: Redo-Informationen werden zwischengespeichert bis sie physikalisch geschrieben werden | ||
- | * 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 | ||
- | * 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: Procedural Language extension to SQL | ||
- | * Bietet eine Blockstruktur für Code an | ||
- | * Bietet prozedurale Konstrukte an (Variablen, Kontrollstrukturen etc.) | ||
- | * {{:se:plsqlarchitektur.jpg|}} | ||
- | * Vorteile | ||
- | * Integration in Oracle Tools | ||
- | * Modularisierte Anwendungsentwicklung | ||
- | * Portabilität des PL/SQL-Codes | ||
- | * Exception Handling | ||
- | * PL/SQL-Blöcke | ||
- | * Aufbau | ||
- | * DECLARE: Variablen, Cursor, eigene Exceptions | ||
- | * **BEGIN**: SQL und PL/SQL | ||
- | * EXCEPTION: Fehlerbehandlung | ||
- | * **END** | ||
- | * Typen | ||
- | * Anonymous | ||
- | * Procedure | ||
- | * Function | ||
- | * Speicherort: Server oder Anwendung | ||
- | * Variablen | ||
- | * ''[a-zA-Z][a-zA-Z0-9$_#]{0,29}'' | ||
- | * Deklarierung/Initialisierung in ''DECLARE'', Zuweisung in ''BEGIN'' | ||
- | * ''identifier [CONSTANT] datatype [NOT NULL] [:= | DEFAULT expr];'' | ||
- | * String-Begrenzung: ''q'!Das ist ein Text!''' | ||
- | * Typen | ||
- | * Scalar: ''CHAR, VARCHAR, LONG, INTEGER, BOOLEAN, DATE'' etc. | ||
- | * Composite: Zusammengesetzte Variablen aus mehrere Datentypen | ||
- | * Reference | ||
- | * LOB: Fotos, Filme etc. | ||
- | * Nicht-PL/SQL: Bind variables | ||
- | * Host-Variablen, die mit ''VARIABLE'' deklariert werden und mit einem führenden '':'' referenziert werden | ||
- | * ''SET AUTOPRINT ON'' | ||
- | * Substitution Variables | ||
- | * referenziert mit führendem ''&'': Eingabe zur Laufzeit | ||
- | * ''ACCEPT varname PROMPT 'Text''' | ||
- | * User Variable: deklariert mit ''DEFINE'', referenziert mit ''&'' | ||
- | * ''%TYPE''-Attribut: Datentyp einer Spalte/Variable übernehmen (''identifier table.column_name%TYPE;'') | ||
- | * Mögliche Boolean-Werte: ''TRUE, FALSE, NULL'' (!) | ||
- | * Lexikalische Einheiten | ||
- | * Folgen von Zeichen, Zahlen, Whitespace und Symbolen | ||
- | * Typen: Identifier, Delimiter, Literals, Comments | ||
- | * SQL-Funktionen | ||
- | * Nicht in PL/SQL verfügbar: ''DECODE'', ''GROUP''-Funktionen | ||
- | * SELECT in PL/SQL | ||
- | * ''INTO'' wird benötigt | ||
- | * Abfragen müssen genaue eine Zeile zurückliefern | ||
- | * Variablenpriorität: Spaltennamen -> lokale Variablen/Parameter -> Tabellennamen | ||
- | * Cursor | ||
- | * Zeiger auf den privaten Speicherplatz des Oracle-Servers | ||
- | * Implizit: werden intern vom Oracle-Server erzeugt und verwendet (z.B. bei SQL-Statements) | ||
- | * Attributes: ''SQL%FOUND'', ''SQL%NOTFOUND'', ''SQL%ROWCOUNT'' | ||
- | * Explizit: werden vom Programmierer definiert und verwendet | ||
- | * Kontrollstrukturen | ||
- | * ''IF THEN - ELSIF - ELSE''' | ||
- | * ''CASE'' Expression <> ''CASE'' Statement | ||
- | * Behandlung von NULL bei booleschen Operationen | ||
- | * Schleifen | ||
- | * ''LOOP - EXIT WHEN - END LOOP'' | ||
- | * ''WHILE LOOP - END LOOP'' | ||
- | * ''FOR IN LOOP - END LOOP'' | ||
- | * Nested Loops: Labels ''<<label_name>>'' | ||
- | * Komplexe Datentypen | ||
- | * Records | ||
- | * ein oder mehrere Felder (Scalar, Record, ''INDEX BY'') | ||
- | * werden üblicherweise eingesetzt, um Tabellenzeilen zu lesen | ||
- | * Deklaration mit ''TYPE'' | ||
- | * einfache Definition mit ''%ROWTYPE''' | ||
- | * Collections | ||
- | * ''INDEX BY'' tables / assoziative Arrays | ||
- | * 2 Spalten: Key (int/string) / Value | ||
- | * dynamische Länge | ||
- | * Zugriff über Index ''table(1)'' | ||
- | * verfügbare Methoden: ''EXISTS, COUNT, FIRST, LAST, PRIOR, NEXT, DELETE'' | ||
- | * VARRAYs und Nested Tables | ||
- | * Cursors | ||
- | * manuelle Aktionen: ''OPEN, [LOOP], FETCH, [EXIT], CLOSE'' | ||
- | * ''CURSOR FOR'' macht alles automatisch | ||
- | * Attribute: ''%ISOPEN, %NOTFOUND, %FOUND, %ROWCOUNT'' | ||
- | * entsprechen Pointern aus C (Referenz auf Speicherbereich) | ||
- | * Datentyp der Curosr-Variablen ist ''REF CURSOR'' | ||
- | * Cursor sind statisch, Cursor-Variablen sind dynamisch | ||
- | * Exceptions | ||
- | * Exceptions sind Fehler, die während der Programmausführung auftreten | ||
- | * Können implizit oder explizit ausgelöst werden | ||
- | * Behandlung: Handler oder weiterwerfen | ||
- | * Es sind mehrere Handler pro Block erlaubt, aber lediglich einer wird abgearbeitet. | ||
- | * Vorhandene Exceptions: z.B. ''NO_DATA_FOUND, TOO_MANY_ROWS, ZERO_DIVIDE'' | ||
- | * nicht vordefinierte Exceptions behandeln: ''PRAGMA EXCEPTION_INIT'' | ||
- | * Funktionen: ''SQLCODE, SQLERRM'' | ||
- | * Eigene Exceptions werfen: ''RAISE'' | ||
- | * Eigene Fehlermeldungen analog zum Oracle-Server ausgeben: ''RAISE_APPLICATION_ERROR'' (nur mit Nummer -20000 bis -20999) | ||
- | * Prozeduren und Funktionen | ||
- | * {{:se:proceduresvsfunctions.jpg|}} | ||
- | * Subprograms, benannte PL/SQL-Blöcke | ||
- | * {{:se:anonymousblockssubprograms.jpg|}} | ||
- | * Parameter | ||
- | * Formal <> actual Parameters | ||
- | * Parameter Modes: ''IN, OUT, IN OUT'' | ||
- | * {{:se:subprogramparameters.jpg|}} | ||
- | * Passing: positional, named, combination | ||
- | * Kein Zugriff auf Host-Variablem | ||
- | * Gespeichert in ''USER_SOURCE'' oder ''ALL_SOURCE'', Namen stehen in ''USER_OBJECTS'' | ||
- | * Vorteile: einfach zu verwalten, Datensicherheit und -integrität, bessere Performance, bessere Codeverständlichkeit | ||
- | * Funktionen können in SQL-Statements verwendet werden: ''SELECT, WHERE, HAVING, ORDER BY, GROUP BY, VALUES, SET'' | ||
- | * Aber nur, wenn: in der DB gespeichert, nur IN Parameter, nur SQL-Datentypen verwenden, Parameter positional | ||
- | * Packages | ||
- | * Gruppierung von logisch zusammengehörenden Komponenten (Typen, Cursor, Subprograms etc.) | ||
- | * Bestehen aus Specification (quasi das Interface, Prozeduren sind public) und Body (die Implementierung) | ||
- | * Änderungen an der Specification erfordert Neukompilierung aller referenzierenden Subprogramme | ||
- | * 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'') | ||
- | * 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 State | ||
- | * Package wird beim ersten Aufruf initialisiert und bleibt die gesamte Session über bestehen. | ||
- | * Eindeutig für jede Session. | ||
- | * Hilfspakete: ''DBMS_OUTPUT, UTL_FILE, HTP, UTL_MAIL, DBMS_SCHEDULER'' | ||
- | * Dynamic SQL | ||
- | * Execution Flow: parse (compile time), bind (compile time), execute, fetch | ||
- | * Dynamic SQL ist ein String | ||
- | * ''EXECUTE IMMEDIATE .. INTO .. USING'' | ||
- | * Triggers | ||
- | * PL/SQL-Block, der einer Tabelle, einem View, einem Schema oder einer Datenbank zugeordnet ist | ||
- | * Typen: Application/Database, Statement/Row Trigger | ||
- | * Timing: ''BEFORE, AFTER, INSTEAD OF'' | ||
- | * Trigger Events: ''INSERT, UPDATE [OF], DELETE'' | ||
- | * Row Trigger: ''FOR EACH ROW, :NEW, :OLD'' | ||
- | * {{:se:triggersvsprocedures.jpg|}} | ||
- | |||
- | ===== 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 ===== | ||
- | |||
- | ===== ToDo ===== | ||
- | * Unterschiede Host- (auch Bind-/Global-), User-, Substitution-Variablen |