Der Ausführungsteil eines PL/SQL-Blocks



Ähnliche Dokumente
Themen des Kapitels. 2 Grundlagen von PL/SQL. PL/SQL Blöcke Kommentare Bezeichner Variablen Operatoren. 2.1 Übersicht. Grundelemente von PL/SQL.

Die bisher bereits bekannten Aggregatsfunktionen MIN, MAX, SUM, AVG, COUNT, VARIANCE und STDDEV wurden um FIRST und LAST erweitert.

Dipl. Inf. Dipl. Math. Y. Orkunoglu Datum:

Prozedurale Datenbank- Anwendungsprogrammierung

Dynamisches SQL. Folien zum Datenbankpraktikum Wintersemester 2009/10 LMU München

SQL (Structured Query Language) Schemata Datentypen

Oracle 10g Einführung

Datentypen. Agenda für heute, 4. März, Pascal ist eine streng typisierte Programmiersprache

Diana Lange. Generative Gestaltung Operatoren

Funktionen. Überblick über Stored Functions. Syntax zum Schreiben einer Funktion. Schreiben einer Funktion

Erwin Grüner

Java Einführung Operatoren Kapitel 2 und 3

Universität Augsburg, Institut für Informatik WS 2006/2007 Dr. W.-T. Balke 27. Nov M. Endres, A. Huhn, T. Preisinger Lösungsblatt 5

Programmierkurs Java

Der Aufruf von DM_in_Euro 1.40 sollte die Ausgabe 1.40 DM = Euro ergeben.

Informatik 12 Datenbanken SQL-Einführung

5 DATEN Variablen. Variablen können beliebige Werte zugewiesen und im Gegensatz zu

PL/SQL. Deklaration von Variablen. Inhalt. PL/SQL Block Struktur. PL/SQL Block Struktur

Zeichen bei Zahlen entschlüsseln

Datenbanken SQL Einführung Datenbank in MySQL einrichten mit PhpMyAdmin

Art der Info: Technische Background Info Teil 1 (April 2002)

SQL Intensivpraktikum SS 2008

Zur drittletzten Zeile scrollen

Grundlagen der Programmierung Prof. H. Mössenböck. 3. Verzweigungen

Details zu den Ausdrücken nach FROM, WHERE, GROUP BY und HAVING finden Sie in den Abschnitten über JOIN, WHERE und GROUP BY.

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren

Erweiterung der Aufgabe. Die Notenberechnung soll nicht nur für einen Schüler, sondern für bis zu 35 Schüler gehen:

Art der Info: Technische Background Info Teil 3 (April 2002)

Grundbegriffe der Informatik

Java 7. Elmar Fuchs Grundlagen Programmierung. 1. Ausgabe, Dezember 2011 JAV7

Das Typsystem von Scala. L. Piepmeyer: Funktionale Programmierung - Das Typsystem von Scala

Einführung in die C++ Programmierung für Ingenieure

Powerful PL/SQL: Collections indizieren mit VARCHAR2- Indizes ein Praxisbeispiel

Oracle Datenbankprogrammierung mit PL/SQL Grundlagen

Suchmaschinen. Universität Augsburg, Institut für Informatik SS 2014 Prof. Dr. W. Kießling 23. Mai 2014 Dr. M. Endres, F. Wenzel Lösungsblatt 6

Übungen zu C++ Kapitel 1

Modul 122 VBA Scribt.docx

Modellierung und Programmierung 1

Visual Basic Basisbefehle Hinweis: Der Text in eckigen Klammern [ ] ist variabel, z.b. [var] => 5.3. Eckige Klammern sind stets wegzulassen!

Whitepaper. Produkt: combit Relationship Manager. Datensatzhistorie mit dem SQL Server 2000 und combit GmbH Untere Laube Konstanz

Views in SQL. 2 Anlegen und Verwenden von Views 2

11 Funktionen Vorteile von Funktionen. Leseprobe aus Access und SQL Server

Funktion definieren Gibt Summe der Gehälter zurück. Aufruf in einem SQL-Statement

Software- und Druckerzuweisung Selbstlernmaterialien

Gesicherte Prozeduren

SQL für Trolle. mag.e. Dienstag, Qt-Seminar

4 Aufzählungen und Listen erstellen

mit Musterlösungen Prof. Dr. Gerd Stumme, Dipl.-Inform. Christoph Schmitz 11. Juni 2007

C++ Grundlagen. ++ bedeutet Erweiterung zum Ansi C Standard. Hier wird eine Funktion eingeleitet

Einführung in die Programmierung (EPR)

Downloadfehler in DEHSt-VPSMail. Workaround zum Umgang mit einem Downloadfehler

Sin-Funktion vgl. Cos-Funktion

cs241: Datenbanken mit Übungen HS 2011

Objektorientierte Programmierung

Übersicht Programmablaufsteuerung

Excel Funktionen durch eigene Funktionen erweitern.

Java Kurs für Anfänger Einheit 4 Klassen und Objekte

Programmierparadigmen. Programmierparadigmen. Imperatives vs. objektorientiertes Programmieren. Programmierparadigmen. Agenda für heute, 4.

Kontrollstrukturen in PL/SQL

SQL and PL/SQL unleashed. Neuheiten bei Oracle 11g und Oracle 12c im Bereich SQL und PL/SQL

1 Vom Problem zum Programm

Ein reales Testumfeld bereitstellen - basierend auf einer Produktionsdatenbank (ohne eine neue Kopie zu erstellen)

Viele Bilder auf der FA-Homepage

Unterabfragen (Subqueries)

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen

SQL Intensivpraktikum SS 2008

Hochschule Karlsruhe Technik und Wirtschaft Anhänge: Fakultät für Informatik und Wirtschaftsinformatik SS 2013 Prof. Schmidt.

Einführung in die Programmierung

Datenbanken Kapitel 2

Prakt. Datenbankprogrammierung. Sommersemester 2005

Die Gleichung A x = a hat für A 0 die eindeutig bestimmte Lösung. Für A=0 und a 0 existiert keine Lösung.

In diesem Thema lernen wir die Grundlagen der Datenbanken kennen und werden diese lernen einzusetzen. Access. Die Grundlagen der Datenbanken.

Systeme 1. Kapitel 6. Nebenläufigkeit und wechselseitiger Ausschluss

Einstellungen zur Verwendung von Flashback-Abfragen

Primzahlen und RSA-Verschlüsselung

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 16

Datenbanken für Online Untersuchungen

Das erste Programm soll einen Text zum Bildschirm schicken. Es kann mit jedem beliebigen Texteditor erstellt werden.

Einführung in die Programmierung

Leseprobe: SQL mit MySQL - Band 4 Kompendium mit Online-Übungs-DB. Kompendium zur schnellen Kurzinformation der Datenbanksprache SQL/MySQL 5.

SMS/ MMS Multimedia Center

Einführung in SQL. 1. Grundlagen SQL. Structured Query Language. Viele Dialekte. Unterteilung: i. DDL (Data Definition Language)

Grundlagen der Programmiersprache C++

Bedienungsanleitung Anlassteilnehmer (Vereinslisten)

Handbuch organice SQL-Reportgenerator

Hello World. Javakurs 2014, 1. Vorlesung. Sebastian Schuck. basierend auf der Vorlage von Arne Kappen. wiki.freitagsrunde.org. 3.

Handbuch Fischertechnik-Einzelteiltabelle V3.7.3

Zusammengesetzte Datentypen

Softwarelösungen: Versuch 4

MdtTax Programm. Programm Dokumentation. Datenbank Schnittstelle. Das Hauptmenü. Die Bedienung des Programms geht über das Hauptmenü.

AGROPLUS Buchhaltung. Daten-Server und Sicherheitskopie. Version vom b

Lehrer: Einschreibemethoden

Übungen Programmieren 1 Felix Rohrer. Übungen

Entwurf von Algorithmen - Kontrollstrukturen

Mediator 9 - Lernprogramm

Kapitel 33. Der xml-datentyp. In diesem Kapitel: Der xml-datentyp 996 Abfragen aus xml-datentypen 1001 XML-Indizierung 1017 Zusammenfassung 1023

Programmieren in C. Felder, Schleifen und Fließkommaarithmetik. Prof. Dr. Nikolaus Wulff

Abfrage-Befehle in MySQL -diverse Funktionen -

Transkript:

3 Der Ausführungsteil eines PL/SQL-Blocks 3.1 Aufbau des Ausführungsteils... 3-4 3.2 Zuweisungen... 3-6 3.3 Funktionen innerhalb von PL/SQL... 3-8 3.3.1...Erlaubte SQL-Funktionen... 3-8 3.3.2...Nicht erlaubte SQL-Funktionen... 3-10 3.4 Reguläre Ausdrücke... 3-12 3.4.1...Allgemein... 3-12 3.4.2...Einsatz in ORACLE 10g... 3-14 3.4.3...REGEXP_Funktionen... 3-14 3.4.4...Die Metazeichen der Regulären Ausdrücke... 3-18 3.5 Operatoren in PL/SQL... 3-20 3.6 Der SELECT-Befehl in PL/SQL... 3-22 3.7 DML-Befehle in PL/SQL... 3-25 3.8 Erweiterungen der DML-Befehle in ORACLE 10g... 3-28 3.8.1...INSERT Statement... 3-28 3.8.2...UPDATE Statement... 3-28 3.8.3...DELETE Statement... 3-28 3.9 Die GOTO-Anweisung... 3-30 1.2.066 / 4053 3-1

3 Der Ausführungsteil eines PL/SQL-Blocks 3.10 Bedingte Kompilierung... 3-32 3-2 1.2.066 / 4053

Der Ausführungsteil eines PL/SQL-Blocks 3 1.2.066 / 4053 3-3

3 Der Ausführungsteil eines PL/SQL-Blocks 3 Der Ausführungsteil eines PL/SQL-Blocks 3.1 Aufbau des Ausführungsteils Dieser Teil beinhaltet das eigentliche Programm. Hier finden sich Kontrollkonstrukte wie Schleifen, bedingte Anweisungen, Zuweisungen und SQL-Befehle. Der Block wird eingeleitet durch das Schlüsselwort BEGIN und beendet durch END;. Im Ausführungsteil dürfen PL/SQL-Anweisungen, Funktionen sowie alle SQL-Befehle mit Ausnahme von DDL-Befehlen (Data Definition Language: CREATE, ALTER, DROP, RENAME, TRUNCATE) und DCL-Befehlen (Data Control Language: GRANT, REVOKE) verwendet werden. DDL-Befehle sind allerdings leicht einzubauen durch Verwendung von EXECUTE IMMEDIATE sql_statement; Weiterhin nicht erlaubt sind Befehle aus dem SYSDBA Bereich wie: STARTUP SHUTDOWN RECOVER DATABASE 3-4 1.2.066 / 4053

Der Ausführungsteil eines PL/SQL-Blocks 3 Allgemeine Eigenschaften des Ausführungsteils 3 PL/SQL-Befehle: Bedingungen Schleifen RAISE (Auslösen einer Exception) EXIT WHEN NULL Zuweisungen SQL-Befehle: INSERT UPDATE DELETE SELECT... INTO EXECUTE IMMEDIATE ddl_sql_statement Transaktionssteuerungsbefehle: COMMIT SAVEPOINT ROLLBACK SET TRANSACTION READ ONLY LOCK TABLE www.unilog-integrata.de www.unilog.integrata.de 4053 / 1.2.036 Folie 2 1.2.066 / 4053 3-5

3 Der Ausführungsteil eines PL/SQL-Blocks 3.2 Zuweisungen Variablen können im Ausführungsteil (und im Fehlerbehandlungsteil) beliebig oft Werte zugewiesen werden, wobei die Variable stets den zuletzt zugewiesenen Wert beinhaltet. Die Zuweisung geschieht in der Regel mit dem Zuweisungsoperator := in der Form: variablename := ausdruck; Der Ausdruck kann ein einzelner Wert sein, eine Funktion, eine andere Variable oder auch eine arithmetische Operation. Beispiele: var_a := 17; var_b := INITCAP('asterix'); var_c := var_a + 11; var_d := sysdate; var_e := pack.var; Weitere Möglichkeiten der Zuweisung sind der SELECT INTO-Befehl und der FETCH INTO-Befehl bei Cursoren, die später behandelt werden. 3-6 1.2.066 / 4053

Der Ausführungsteil eines PL/SQL-Blocks 3 Zuweisungen 3 möglich im Deklarationsteil (als Default-Wert) beliebig oft erlaubt im Ausführungs- und Exception-Teil durch den Zuweisungsoperator: variable := ausdruck; durch SELECT INTO durch FETCH INTO (bei Cursor) Beispiele: var_a := 17; var_b := INITCAP('asterix'); var_c := var_a + 11; www.unilog-integrata.de www.unilog.integrata.de 4053 / 1.2.036 Folie 3 1.2.066 / 4053 3-7

3 Der Ausführungsteil eines PL/SQL-Blocks 3.3 Funktionen innerhalb von PL/SQL Eine Funktion kann durch ihren Funktionsnamen und der Angabe von zu übergebenden Parametern aufgerufen werden. Jede Funktion liefert ein Ergebnis als Rückgabewert wieder. Dieser Rückgabewert wird üblicherweise einer Variablen zugeordnet, wie im zweiten vorherigen Beispiel. 3.3.1 Erlaubte SQL-Funktionen ORACLE bietet im SQL-Bereich eine Vielzahl von Funktionen, die fast alle auch in PL/SQL-Anweisungen zur Verfügung stehen: Zeichenkettenfunktionen (Single Row), z.b.: CONCAT SUBSTR, INSTR LOWER, UPPER, INITCAP LPAD, RPAD LTRIM, RTRIM, TRIM REPLACE, REGEXP_REPLACE (10g)... Numerische Funktionen (Single Row), z. B.: MOD ROUND, TRUNC POWER, LOG,... Datumsfunktionen, z. B.: ADD_MONTHS, MONTHS_BETWEEN NEXT_DAY, LAST_DAY SYSDATE TRUNC... Konvertierungsfunktionen, z. B.: TO_CHAR (für NUMBER und DATE) TO_NUMBER TO_DATE TO_LOB (LONG zu CLOB) NVL ISNULL (seit 9i) Diese SQL-Funktionen sind auch in PL/SQL-Anweisungen uneingeschränkt verfügbar. 3-8 1.2.066 / 4053

Der Ausführungsteil eines PL/SQL-Blocks 3 Erlaubte SQL-Funktionen 3 Zeichenkettenfunktionen (Single Row) Numerische Funktionen (Single Row) Datumsfunktionen Konvertierungsfunktionen Beispiele: v_rest := MOD(v_xyz, 5); v_name := LOWER(v_ename); v_friday := NEXT_DAY(SYSDATE, 'FRIDAY'); v_date := TO_DATE('13.10.1962', 'DD.MM.YYYY'); v_str := TO_CHAR(v_date, 'DD.Month YYYY'); www.unilog-integrata.de www.unilog.integrata.de 4053 / 1.2.066 Folie 4 1.2.066 / 4053 3-9

3 Der Ausführungsteil eines PL/SQL-Blocks 3.3.2 Nicht erlaubte SQL-Funktionen Gruppenfunktionen (SUM, AVG, MIN, MAX..) Analytische Funktionen (PARTITION, DIMENSION,OVER, ) DECODE Diese Funktionen sind in PL/SQL-Anweisungen nicht zulässig, in SQL- Anweisungen innerhalb eines PL/SQL-Blocks dagegen sind sie erlaubt. nicht zulässig: zulässig: v_sum := SUM (sal_table); SELECT SUM(sal) INTO v_sum FROM emp; 3-10 1.2.066 / 4053

Der Ausführungsteil eines PL/SQL-Blocks 3 Nicht erlaubte SQL-Funktionen 3 Nicht erlaubte SQL-Funktionen: Gruppenfunktionen DECODE Beispiel: -- nicht erlaubt!!! v_sum := SUM(sal_Table); -- erlaubt SELECT SUM(sal) INTO v_sum FROM emp; www.unilog-integrata.de www.unilog.integrata.de 4053 / 1.2.036 Folie 5 1.2.066 / 4053 3-11

3 Der Ausführungsteil eines PL/SQL-Blocks 3.4 Reguläre Ausdrücke 3.4.1 Allgemein Reguläre Ausdrücke (engl.: regular expressions) sind ein leistungsstarkes Werkzeug zur Verarbeitung von Texten und Daten in der ORACLE Version 10g. Mit regulären Ausdrücken können sehr komplexe und subtile Textprobleme elegant beschrieben und gelöst werden. Reguläre Ausdrücke sind in der UNIX Welt (egrep, vi, awk, emacs, ) seit langem verbreitet. Bsp.: Suche alle Zeilen aus der Datei protokoll.log, welche mit dem Wort "Fehler" oder Wort "Error" anfangen: % egrep '^(Fehler Error)' protokoll.log Die Programmiersprachen Java, Visual Basic, VBScript, JavaScript, C, C++, C#, (.NET), elist, perl, Python, Tcl, Ruby, PHP, etc. können mit regulären Ausdrücken umgehen. Ein produktiver Einsatz ist für Ungeübte jedoch kein einfaches Unterfangen, da sie ein sehr mächtiges und komplexes Werkzeug darstellen. Mehr über reguläre Ausdrücke im Allgemeinen erfährt man im Buch von J.E.F. Friedl: "Reguläre Ausdrücke". Reguläre Ausdrücke im Zusammenhang mit Oracle sind in einer zusammengefassten Form im Buch "Oracle Regular Expressions" zu finden. 3-12 1.2.066 / 4053

Der Ausführungsteil eines PL/SQL-Blocks 3 Reguläre Ausdrücke 3 Reguläre Ausdrücke (über REGEXP Funktionen) Anwendung auf: CHAR VARCHAR2 CLOB NCHAR NVARCHAR2 NCLOB www.unilog-integrata.de www.unilog.integrata.de 4053 / 1.2.036 Folie 6 1.2.066 / 4053 3-13

3 Der Ausführungsteil eines PL/SQL-Blocks 3.4.2 Einsatz in ORACLE 10g Mögliche Einsatzgebiete in ORACLE sind: das Suchen eines bestimmten Musters in einer Zeichenkette das Ersetzen eines bestimmten Musters durch ein anderes in einer Zeichenkette das Extrahieren bestimmter Muster aus einer Zeichenkette das Prüfen des Auftretens eines bestimmten Musters in einer Zeichenkette Reguläre Ausdrücke können bei ORACLE auf folgende Datentypen angewandt werden: CHAR, VARCHAR2, CLOB, NCHAR, NVARCHAR, NCLOB 3.4.3 REGEXP_Funktionen Für reguläre Ausdrücke wurden vier neue Funktionen entwickelt. 3.4.3.1 REGEXP_INSTR REGEXP_INSTR stellt ähnlich wie der INSTR-Operator fest, an welcher Stelle das gesuchte Muster auftritt. Beispiel: Angestellte mit mehr als einem 'A' im Namen suchen: SELECT * FROM emp WHERE REGEXP_INSTR (ename, '[A]+', 1, 2) > 0; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO 7876 ADAMS CLERK 7788 23.05.87 1400 20 3-14 1.2.066 / 4053

Der Ausführungsteil eines PL/SQL-Blocks 3 3.4.3.2 REGEXP_SUBSTR REGEXP_SUBSTR ist ähnlich wie der SUBSTR-Operator. Gibt den Teilstring aus, welcher auf das gesuchte Muster passt. SELECT ename, REGEXP_SUSTR (ename,'[^a]+') Test FROM emp; ENAME SMITH ALLEN WARD JONES MARTIN BLAKE CLARK SCOTT KING TURNER ADAMS JAMES FORD MILLER TEST SMITH LLEN W JONES M BL CL SCOTT KING TURNER D J FORD MILLER 1.2.066 / 4053 3-15

3 Der Ausführungsteil eines PL/SQL-Blocks 3.4.3.3 REGEXP_LIKE REGEXP_LIKE prüft ähnlich wie der LIKE-Operator, ob die Muster gleich sind. Beispiel: Alle die mit 'J' anfangen und ein 'N' im Namen haben: SELECT ename FROM emp WHERE REGEXP_LIKE (ename,'^j.*n'); JONES ENAME 3.4.3.4 REGEXP_REPLACE REGEXP_REPLACE ist ähnlich wie der REPLACE-Operator. Sucht und ersetzt die beschriebenen Muster. Beispiel: Ersetzen von L s durch das benachbarte Nachfolgezeichen, sofern dieses kein weiteres L ist. SELECT ename, REGEXP_REPLACE (ename, 'L([^L])', '\1\1') AS Test FROM emp; SMITH ALLEN WARD JONES MARTIN BLAKE CLARK SCOTT KING TURNER ADAMS JAMES FORD MILLER ENAME SMITH ALEEN WARD JONES MARTIN BAAKE CAARK SCOTT KING TURNER ADAMS JAMES FORD MILEER TEST 3-16 1.2.066 / 4053

Der Ausführungsteil eines PL/SQL-Blocks 3 REGEXP 3 REGEXP Funktionen: REGEXP_INSTR REGEXP_SUBSTR REGEXP_LIKE REGEXP_REPLACE Bsp.: SELECT ename, REGEXP_REPLACE (ename, 'L([^L])', '\1\1') AS Test FROM emp; www.unilog-integrata.de www.unilog.integrata.de 4053 / 1.2.036 Folie 7 1.2.066 / 4053 3-17

3 Der Ausführungsteil eines PL/SQL-Blocks 3.4.4 Die Metazeichen der Regulären Ausdrücke Die Implementierung in ORACLE 10g basiert auf dem POSIX ERE (Extended Regular Expression) Standard. Des Weiteren sind auch diverse Zeichenklassen ab Oracle 10g abprüfbar. Oracle hat ab Version 10.2 eigene Kürzel für einige Zeichenklassen eingeführt. Zeichen 10.2 Bedeutung [:alnum:] \w Alle alphanumerischen Zeichen (A-Z, 0-9) [^[:alnum:]] \W Alles außer alphanumerischen Zeichen [:alpha:] Alle alphabetischen Zeichen (A-Z) [:blank:] Alle Leerzeichen [:cntrl:] Alle nichtdruckbaren Sonderzeichen [:digit:] \d Alle Zahlen [^[:digit:]] \D Alles außer Zahlen [:graph:] Alle [:punct:], [:upper:], [:lower:], und [:digit:] Zeichen. [:lower:] Alle Kleinbuchstaben [:print:] Alle druckbaren Zeichen [:punct:] Alle Punktations Zeichen [:space:] \s Alle Space Zeichen (nichtdruckbar) [^[:space:]] \S Alle außer Space Zeichen [:upper:] Alle Großbuchstaben [:xdigit:] Alle Hexadezimalzeichen 3-18 1.2.066 / 4053

Der Ausführungsteil eines PL/SQL-Blocks 3 Metazeichen von Regulären Ausdrücken 3 \ Der Backslash kann abhängig vom Kontext vier verschiedene Bedeutungen haben. Er kann: für sich selbst stehen, das nächste Zeichen zitieren, einen Operator einbringen oder nichts tun. * +? ^ $. [ ] ( ) {m} {m,} {m,n} \n [..] [: :] [==] Passt bei beliebig vielen Vorkommen (auch bei keinen) Passt bei mindestens einem Vorkommen Passt bei keinem oder genau einem Vorkommen Trennzeichen für alternative Muster Passt auf den Zeilenanfang Passt auf das Zeilenende Passt auf jedes unterstützte Zeichen ausgenommen von NULL Klammerausdruck enthält eine Liste von Ausdrücken, von denen ein beliebiger passen darf. Eine Ausschlussliste beginnt mit einem Circumflex (^). Gruppierung, wird als einzelner Teilausdruck behandelt. Passt bei genau m Auftreten. Passt bei mindestens m Auftreten. Passt bei mindestens m Auftreten, jedoch nicht mehr als n. Eine Backreference (n ist eine Ziffer zwischen 1 und 9) passt auf den n-ten Teilausdruck vor dem \n Steht für ein (evtl. zusammengesetztes) Textzeichen, z.b. [.ch.] im Spanischen. Steht für eine Zeichenklasse (z.b. [:alpha:]). Passt auf jedes Zeichen dieser Klasse. Steht für eine Äquivalenzklasse. So passt z.b. [=o=] auf o, ô, ö, ò, usw. www.unilog-integrata.de www.unilog.integrata.de 4053 / 1.2.066 Folie 8 Weitere mögliche reguläre Ausdrücke 3 Zeichen 10.2 Bedeutung [:alnum:] \w Alle alphanummerischen Zeichen (A-Z, 0-9) [^[:alnum:]]\w Alles außer alphanummerischen Zeichen [:alpha:] Alle alphabetischen Zeichen (A-Z) [:blank:] Alle Leerzeichen [:cntrl:] Alle nichtdruckbaren Sonderzeichen [:digit:] \d Alle Zahlen [^[:digit:]] \D Alles außer Zahlen [:graph:] Alle [:punct:], [:upper:], [:lower:], und [:digit:] Zeichen. [:lower:] Alle Kleinbuchstaben [:print:] Alle druckbaren Zeichen [:punct:] Alle Punktations Zeichen [:space:] \s Alle Space Zeichen (nichtdruckbar) [^[:space:]] \S Alle außer Space Zeichen [:upper:] Alle Großbuchstaben [:xdigit:] Alle Hexadezimalzeichen www.unilog-integrata.de www.unilog.integrata.de 4053 / 1.2.066 Folie 9 1.2.066 / 4053 3-19

3 Der Ausführungsteil eines PL/SQL-Blocks 3.5 Operatoren in PL/SQL PL/SQL unterstützt das logische Vergleichen von Variablen und Konstanten in SQL sowie in PL/SQL-Befehlen. Es sind dieselben arithmetischen und logischen Operatoren und Verknüpfungen zulässig wie unter SQL. Zusätzlich gibt es den Exponentialoperator (**). Mit Klammern kann man die Priorität der Operationen verändern. Auch Wildcards ( _ für ein Zeichen und % für 0 n Zeichen) sind erlaubt. Priorität der Operatoren: Logiktabellen: Operator Operation **, NOT Exponentialoperator, logische Verneinung +, - Vorzeichen *, / Multiplikation, Division +, -, Addition, Subtraktion, Konkatenierung =,!=, <, >, <=, >=, IS NULL, LIKE, BETWEEN, IN AND OR Vergleich logisches UND logisches ODER NOT TRUE FALSE NULL FALSE TRUE NULL AND TRUE FALSE NULL TRUE TRUE FALSE NULL FALSE FALSE FALSE FALSE NULL NULL FALSE NULL OR TRUE FALSE NULL TRUE TRUE TRUE TRUE FALSE TRUE FALSE NULL NULL TRUE NULL NULL 3-20 1.2.066 / 4053

Der Ausführungsteil eines PL/SQL-Blocks 3 Operatoren in PL/SQL 3 Operator **, NOT +, - *, / +, -, =,!=, <, >, <=, >=, IS NULL, LIKE, BETWEEN, IN TRUE FALSE NULL NOT AND AND OR TRUE FALSE TRUE TRUE FALSE NULL Operation Exponentialoperator, logische Verneinung Vorzeichen Multiplikation, Division Addition, Subtraktion, Konkatenierung Vergleich logisches UND logisches ODER FALSE TRUE FALSE FALSE FALSE FALSE NULL NULL NULL NULL FALSE NULL OR TRUE FALSE NULL TRUE TRUE TRUE TRUE FALSE TRUE FALSE NULL NULL TRUE NULL NULL www.unilog-integrata.de www.unilog.integrata.de 4053 / 1.2.066 Folie 10 Operatoren in PL/SQL 3 AND: beide Bedingungen müssen TRUE sein, damit das Ergebnis TRUE wird OR: Mindestens eine der Bedingungen muss TRUE sein, damit das Ergebnis TRUE wird NOT und logische Verknüpfungen Achtung: NOT NULL ergibt NULL! Beispiele: 5 < 7 AND 'ADAM'!= 'EVE' TRUE 5 < 7 OR 'EVE' < 'ADAM TRUE a < b OR 'EVE' < 'ADAM' NULL (a und b unbekannt) a < b AND 'EVE' < 'ADAM' FALSE www.unilog-integrata.de www.unilog.integrata.de 4053 / 1.2.036 Folie 11 1.2.066 / 4053 3-21

3 Der Ausführungsteil eines PL/SQL-Blocks 3.6 Der SELECT-Befehl in PL/SQL Innerhalb von PL/SQL ist die normale SELECT-Syntax nicht zulässig. Stattdessen müssen mit Hilfe eines SELECT-Befehls Werte aus einer Tabelle in Variablen eingelesen werden. Syntax: SELECT INTO FROM [WHERE spalte1 {, spalte2} variable1 {, variable2} tabelle Bedingungen]; Dabei ist zu beachten: Anzahl und Datentyp der Variablen müssen mit der Anzahl und dem Datentyp der selektierten Spalten übereinstimmen. Die WHERE-Bedingung ist so zu gestalten, dass genau ein Datensatz zurückgeliefert wird. Wird gar kein Datensatz oder mehr als einer zurückgeliefert, so wird ein Fehler ausgelöst (NO_DATA_FOUND bzw. TOO_MANY_ROWS). Tipp: Gruppenfunktionen (ohne GROUP BY) liefern immer genau einen Wert zurück Mehr als einen Wert mit einem einzelnen SELECT-Befehl einlesen kann man mit der Klausel BULK COLLECT : Syntax: SELECT spalte1 [, spalte2,...] BULK COLLECT INTO variable1 [, variable2,...] FROM tabelle [WHERE Bedingung]; Auch hier müssen Anzahl und Datentyp von Spaltenliste und Variablen zusammenpassen. Die verwendeten Variablen müssen allerdings in der Lage sein, mehr als einen Wert aufzunehmen; nur Collections sind zulässig (z.b. PL/SQL-Tables). Einzelheiten zur Variablendeklaration im Beispiel (PL/SQL-TABLE) finden Sie in Kapitel 5. 3-22 1.2.066 / 4053

Der Ausführungsteil eines PL/SQL-Blocks 3 Beispiele: SELECT ename INTO v_name FROM emp where empno = 7788; SELECT ename INTO v_name FROM emp where mgr IS NULL; SELECT MAX(mgr) INTO v_mgr FROM emp; SELECT ename, mgr, hiredate INTO v_name, v_mgr, v_date FROM emp where empno = 7788; DECLARE TYPE namensliste IS TABLE OF emp.ename%type; n_list namensliste; BEGIN SELECT ename BULK COLLECT INTO n_list FROM emp;... END; 1.2.066 / 4053 3-23

3 Der Ausführungsteil eines PL/SQL-Blocks SELECT-Befehl in PL/SQL 3 Syntax: SELECT INTO FROM [WHERE spalte1 {spalte2} variable1 {,variable2} tabelle bedingungen]; Anzahl und Datentyp der Spalten und Variablen müssen übereinstimmen Es darf nur genau eine Zeile zurückgegeben werden Tipp: Gruppenfunktionen verwenden BULK COLLECT möglich www.unilog-integrata.de www.unilog.integrata.de 4053 / 1.2.066 Folie 12 3-24 1.2.066 / 4053

Der Ausführungsteil eines PL/SQL-Blocks 3 3.7 DML-Befehle in PL/SQL DML-Befehle (INSERT, UPDATE, DELETE) sind in PL/SQL uneingeschränkt erlaubt. Innerhalb von DML-Befehlen dürfen PL/SQL-Variablen anstatt fester Werte verwendet werden, falls der Datentyp stimmt. Auch Befehle zur Transaktionssteuerung (COMMIT, ROLLBACK) sind zulässig (Ausnahme: Trigger). Ein DML-Befehl, der keine Zeile oder mehr als eine Zeile betrifft, löst im Gegensatz zu SELECT keinen Fehler aus. Der Erfolg eines DML- Befehls kann jedoch mit Hilfe von Cursor-Attributen überprüft werden. Ein Cursor ist ein privater Speicherbereich innerhalb der SGA, in dem ein SQL-Befehl geparst und ausgeführt wird. Gleichzeitig ist er auch ein Zeiger auf diesen Speicherbereich. Man unterscheidet explizite und implizite Cursor. Explizite Cursor werden ähnlich wie Variablen deklariert. Jedem SQL-Befehl wird automatisch ein impliziter SQL-Cursor zugeordnet, dessen Attribute unmittelbar nach Ausführung des Befehls abgefragt werden können. SQL-Cursor-Attribute: SQL%ROWCOUNT: Anzahl der Zeilen, die vom letzten SQL-Befehl bearbeitet wurden (Datentyp INTEGER) SQL%FOUND: gibt TRUE zurück, wenn der letzte SQL-Befehl mindestens eine Zeile bearbeitet hat (Datentyp BOOLEAN) SQL%NOTFOUND: gibt TRUE zurück, wenn der letzte SQL-Befehl keine Zeile bearbeitet hat (Datentyp BOOLEAN) SQL%ISOPEN: gibt immer FALSE zurück, weil ein impliziter Cursor unmittelbar nach Ausführung des SQL- Befehls geschlossen wird Im nächsten Beispiel wird die Anzahl der geänderten bzw. gelöschten Zeilen mit Hilfe von DBMS_OUTPUT.PUT_LINE am Bildschirm ausgegeben. Damit diese vordefinierte Prozedur unter SQL*Plus wirksam wird, muss vorher eingegeben werden: SQL> SET SERVEROUTPUT ON 1.2.066 / 4053 3-25

3 Der Ausführungsteil eines PL/SQL-Blocks Beispiel: UPDATE emp SET sal = sal * 1.1 WHERE job = 'MANAGER'; v_count := SQL%ROWCOUNT; if SQL%FOUND THEN -- falls Zeile -- geändert, dann lösche: DELETE FROM emp WHERE mgr = 7902; v_count2 := SQL%ROWCOUNT; end if; COMMIT; DBMS_OUTPUT.PUT_LINE(v_count ' Zeilen geändert'); DBMS_OUTPUT.PUT_LINE(v_count2 ' Zeilen gelöscht'); 3-26 1.2.066 / 4053

Der Ausführungsteil eines PL/SQL-Blocks 3 DML-Befehle in PL/SQL 3 uneingeschränkt zulässig Transaktionskontrolle zulässig (Ausnahme Trigger) durch Cursor-Attribute kontrollierbar SQL-Cursor-Attribute: SQL%ROWCOUNT SQL%FOUND SQL%NOTFOUND SQL%ISOPEN Beispiel: UPDATE emp SET sal = sal * 1.1 WHERE job = 'MANAGER'; v_count := SQL%ROWCOUNT; IF SQL%FOUND THEN -- falls Zeile geändert, dann lösche: DELETE FROM emp WHERE mgr = 7902; v_count2 := SQL%ROWCOUNT; END IF; COMMIT; DBMS_OUTPUT.PUT_LINE(v_count ' Zeilen geändert'); DBMS_OUTPUT.PUT_LINE(v_count2 ' Zeilen gelöscht'); www.unilog-integrata.de www.unilog.integrata.de 4053 / 1.2.036 Folie 13 1.2.066 / 4053 3-27

3 Der Ausführungsteil eines PL/SQL-Blocks 3.8 Erweiterungen der DML-Befehle in ORACLE 10g Es ist bei INSERT, UPDATE und DELETE Befehlen nun möglich, innerhalb des Statements einen Einzelwert (Single Aggregate) einer Variable zuzuweisen und diesen später aus der Variable auszulesen. SQL> SET SERVEROUTPUT ON; SQL> VARIABLE sum_verdienst NUMBER; 3.8.1 INSERT Statement SQL> INSERT INTO emp (empno, ename, sal) VALUES (4711, 'Mato Bejic', 5000) RETURNING (SELECT sum(sal) FROM emp) INTO :sum_verdienst; SQL> exec dbms_output.put_line (TO_CHAR(:sum_verdienst)); 3.8.2 UPDATE Statement SQL> UPDATE emp SET sal = sal + 100 RETURNING SUM(sal) INTO :sum_verdienst; SQL> exec dbms_output.put_line (TO_CHAR(:sum_verdienst)); 3.8.3 DELETE Statement SQL> DELETE FROM emp WHERE empno = 4711 RETURNING SUM(sal) INTO :sum_verdienst; SQL> exec dbms_output.put_line (TO_CHAR(:sum_verdienst)); 3-28 1.2.066 / 4053

Der Ausführungsteil eines PL/SQL-Blocks 3 Änderungen der DML Befehle in ORACLE 10g 3 Single Aggregate können einer Variable zugewiesen werden Möglich bei: INSERT UPDATE DELETE Beispiel: UPDATE emp SET sal = sal + 100 RETURNING SUM(sal) INTO :sum_verdienst; exec dbms_output.put_line (TO_CHAR(:sum_verdienst)); www.unilog-integrata.de www.unilog.integrata.de 4053 / 1.2.036 Folie 14 1.2.066 / 4053 3-29

3 Der Ausführungsteil eines PL/SQL-Blocks 3.9 Die GOTO-Anweisung Mit GOTO wird bedingungslos zu einem Label gesprungen, um von dort aus den Code weiter abzuarbeiten. Dieses Label wird auch als Sprungmarke bezeichnet. Nicht zulässig sind allerdings: Sprung in ein IF-Konstrukt hinein (s. Kapitel 4) Sprung von einem Zweig eines IF-Konstrukts in einen anderen Sprung in eine Schleife hinein (s. Kapitel 4) Sprung in einen untergeordneten Block hinein Sprung aus dem Fehlerbehandlungsteil zurück in den Ausführungsteil Sprünge aus einem IF-Konstrukt heraus, aus einer Schleife heraus, und aus einem untergeordneten Block in den übergeordneten Block sind erlaubt. Anmerkung: GOTO-Anweisungen sollten möglichst vermieden werden, da sie den Code unübersichtlich machen. Syntax: GOTO label; 3-30 1.2.066 / 4053

Der Ausführungsteil eines PL/SQL-Blocks 3 GOTO-Anweisung 3 Durch GOTO springt das Programm an die angegebene Stelle Nicht gesprungen werden darf in: Schleifen, IF-Konstrukten und untergeordneten Blöcken. Beispiel: DECLARE v_name CHAR(10); valid BOOLEAN; BEGIN <<get_name>> SELECT ename INTO v_name FROM emp WHERE empno = &g_no; BEGIN... IF valid THEN... ELSE GOTO get_name; END IF; END; END; www.unilog-integrata.de www.unilog.integrata.de 4053 / 1.2.036 Folie 15 1.2.066 / 4053 3-31

3 Der Ausführungsteil eines PL/SQL-Blocks 3.10 Bedingte Kompilierung Ab Version 10.2 sind nun endlich auch Preprozessoranweisungen möglich. Abhängig von der Version kann z.b. dann nur ein bestimmter Codeabschnitt kompiliert werden. Beispiel: Hier wird abhängig von der Version nur ein bestimmter Codeabschnitt kompiliert. $IF DBMS_DB_VERSION.VER_LE_10 $THEN Code für Version 10 oder älter$elsif DBMS_DB_VERSION.VER_LE_11 $THEN Versions 11 code $ELSE Version 12 oder größer Code $END In diesem Beispiel wird eine boolsche Variable für die Kompilierung auf einen Wert gesetzt. Diese Variable entscheidet dann welche Teil der Funktion kompiliert wird. CREATE OR REPLACE FUNCTION f1 RETURN VARCHAR2 AS BEGIN $If $$ppv $Then RETURN 'PPV was TRUE'; $Else RETURN 'PPV was FALSE'; $END /* Kein Semicolon */ END; SQL> ALTER SESSION SET plsql_ccflags = 'PPV:TRUE'; SQL> ALTER FUNCTION F1 COMPILE; SQL> select f1 from dual; MYFUNC ------------------------------------- PPVAL was TRUE 3-32 1.2.066 / 4053

Der Ausführungsteil eines PL/SQL-Blocks 3 Bedingte Kompilierung 3 Lange haben die Programmier auf Preprozessor- anweisungen gewartet. Damit kann ein bedingte Kompilierung erzeugt werden Beispiele: Programmteile für verschiedene Versionen Debugginginfos mit in den Code kompileren Deluxe Version (vergleichbar Enterprise/Standard Edition) kompilieren Syntax: $IF <bed> $THEN <Code> $ELSIF <bed> $THEN <Code> $ELSE <Code> $END www.unilog-integrata.de www.unilog.integrata.de 4053 / 1.2.036 Folie 16 1.2.066 / 4053 3-33

3 Der Ausführungsteil eines PL/SQL-Blocks 3-34 1.2.066 / 4053