[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
DECODE
, GROUP
-FunktionenINTO
wird benötigtSQL%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
INDEX BY
)TYPE
%ROWTYPE
'INDEX BY
tables / assoziative Arraystable(1)
EXISTS, COUNT, FIRST, LAST, PRIOR, NEXT, DELETE
* VARRAYs und Nested Tables
* Cursors
OPEN, [LOOP], FETCH, [EXIT], CLOSE
CURSOR FOR
macht alles automatisch%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
NODATAFOUND, TOOMANYROWS, ZERODIVIDE
* nicht vordefinierte Exceptions behandeln:
PRAGMA EXCEPTIONINIT
SQLCODE, SQLERRM
RAISE
RAISEAPPLICATIONERROR
(nur mit Nummer -20000 bis -20999) * 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
STANDARD
-Package (z.B. TOCHAR)
* 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:
DBMSOUTPUT, UTLFILE, HTP, UTLMAIL, DBMS_SCHEDULER
EXECUTE IMMEDIATE .. INTO .. USING
BEFORE, AFTER, INSTEAD OF
INSERT, UPDATE [OF], DELETE
FOR EACH ROW, :NEW, :OLD