Inhalt • Erkennen der PL/SQL Blockstruktur PL/SQL • Beschreiben von Variablen in PL/SQL Deklaration von Variablen • Unterschied zwischen PL/SQL und nicht-PL/SQL Variablen • Deklaration von PL/SQL Variablen • Ausführen eines PL/SQL Blocks Copyright © Oracle Corporation, 1998. All rights reserved. PL/SQL Block Struktur SQL2 basierend auf OAI-Kurs Copyright © Oracle Corporation, 1998. All rights reserved. PL/SQL Block Struktur DECLARE – Optional – Variable, Cursor, benutzerdefinierte Ausnahmen BEGIN - Befehle – SQL Statements – PL/SQL Statements – Ausnahmen – Optional – Aktionen, wenn Fehler auftreten END; DECLARE BEGIN / EXCEPTION END; SQL3 basierend auf OAI-Kurs Copyright © Oracle Corporation, 1998. All rights reserved. DECLARE v_variable VARCHAR2(5); BEGIN SELECT column_name INTO v_variable FROM table_name; EXCEPTION WHEN exception_name THEN DECLARE ... END; BEGIN / /* Prozedur mit "/" beenden*/ EXCEPTION END; SQL4 basierend auf OAI-Kurs Copyright © Oracle Corporation, 1998. All rights reserved. Programm Konstrukte Block Typen Anonyme [DECLARE] Prozeduren PROCEDURE name IS Funktionen BEGIN --statements BEGIN --statements [EXCEPTION] [EXCEPTION] FUNCTION name RETURN datatype IS BEGIN --statements RETURN value; [EXCEPTION] END; / END; / END; / SQL5 basierend auf OAI-Kurs Copyright © Oracle Corporation, 1998. All rights reserved. Verwendung von Variablen Verwendung von Variablen für • Temporäres Speichern von Daten • Verändern gespeicherter Werte • Wiederverwendung • Bequeme Handhabung Anonymous block DECLARE Application trigger BEGIN EXCEPTION Database trigger Stored procedure/ function Application procedure/ function END; Packaged procedure/ function SQL6 basierend auf OAI-Kurs Copyright © Oracle Corporation, 1998. All rights reserved. Verwendung von Variablen in PL/SQL • Deklaration und Initialisierung Variabler im Deklarationsteil. • Zuweisen neuer Werte zu den Variablen im Ausführungsteil. • Wertübergabe in den PL/SQL Block durch Parameter. • Ergebnisse durch Output-Variable ansehen . SQL7 basierend auf OAI-Kurs Copyright © Oracle Corporation, 1998. All rights reserved. SQL8 basierend auf OAI-Kurs Copyright © Oracle Corporation, 1998. All rights reserved. Typen von Variablen • PL/SQL Variable – einfache – zusammengesetzte – Referenzen – LOB (large objects) • Nicht-PL/SQL Variable – Bind und Hostvariable SQL9 basierend auf OAI-Kurs Copyright © Oracle Corporation, 1998. All rights reserved. Namensregeln • Zwei Variable können in unterschiedlichen Blöcken denselben Namen haben. • Der Variablenname (Identifier) darf nicht derselbe sein wie der Name einer Tabellenspalte im Block. DECLARE empno NUMBER(4); BEGIN SELECT empno INTO empno FROM emp WHERE ename = 'SMITH'; END; SQL11 basierend auf OAI-Kurs Copyright © Oracle Corporation, 1998. All rights reserved. Deklaration von PL/SQL Variablen Syntax identifier [CONSTANT] datatype [NOT NULL] [:= | DEFAULT expr]; Beispiele Declare v_hiredate v_deptno v_location c_ comm DATE; NUMBER(2) NOT NULL := 10; VARCHAR2(13) := 'Atlanta'; CONSTANT NUMBER := 1400; SQL10 basierend auf OAI-Kurs Copyright © Oracle Corporation, 1998. All rights reserved. Werte zu Variablen zuweisen Syntax identifier := expr; Beispiele Setze ein vordefiniertes Einstellungsdatum für einen neuen Angestellten v_hiredate := '31-DEC-98'; Der Name des Angestellten sei “Maduro.” v_ename := 'Maduro'; SQL12 basierend auf OAI-Kurs Copyright © Oracle Corporation, 1998. All rights reserved. Variablen-Initialisierung und Schlüsselworte Verwendung Skalare Basisdatentypen • VARCHAR2 (maximum_length) • NUMBER [(precision, scale)] • := Zuweisungsoperator • DATE • DEFAULT • CHAR [(maximum_length)] • NOT NULL • LONG • LONG RAW • BOOLEAN • BINARY_INTEGER • PLS_INTEGER (bringt bei Überlauf Fehlermeldung) SQL13 basierend auf OAI-Kurs Copyright © Oracle Corporation, 1998. All rights reserved. Deklaration skalarer Variabler Das %TYPE Attribut • Deklariere eine Variable passend zu: Beispiele v_job v_count v_total_sal v_orderdate c_tax_rate v_valid SQL14 basierend auf OAI-Kurs Copyright © Oracle Corporation, 1998. All rights reserved. VARCHAR2(9); BINARY_INTEGER := 0; NUMBER(9,2) := 0; DATE := SYSDATE + 7; CONSTANT NUMBER(3,2) := 8.25; BOOLEAN NOT NULL := TRUE; ... – einer Datenbank-Spaltendefinition – anderen vorher definierten Variablen • Vor %TYPE steht: – Die Datenbank-Tabelle und -Spalte – Der Name der vorher deklarierten Variablen SQL15 basierend auf OAI-Kurs Copyright © Oracle Corporation, 1998. All rights reserved. SQL16 basierend auf OAI-Kurs Copyright © Oracle Corporation, 1998. All rights reserved. Beispiele Deklaration von BOOLEAN Variablen ... v_ename v_balance v_min_balance ... emp.ename%TYPE; NUMBER(7,2); v_balance%TYPE := 10; SQL17 basierend auf OAI-Kurs Copyright © Oracle Corporation, 1998. All rights reserved. Zusammengesetzte Datentypen • haben nur die Werte TRUE, FALSE und NULL. • sind verbunden durch die logischen Operatoren AND, OR oder NOT. SQL18 basierend auf OAI-Kurs Copyright © Oracle Corporation, 1998. All rights reserved. LOB-Datentyp-Variable (> 4 Gigabyte) CLOB (char) Typen • PL/SQL Tabellen BLOB (bin) • PL/SQL RECORDS BFILE (Binärfile) NCLOB File mit nationalen Zeichen SQL19 basierend auf OAI-Kurs Copyright © Oracle Corporation, 1998. All rights reserved. SQL20 basierend auf OAI-Kurs Copyright © Oracle Corporation, 1998. All rights reserved. Nicht-PL/SQL Variable Bind Variable Deklarieren auf Kommandoebene mit Variable Variable g_monthly_sal number; Variable g_ename varchar2(20) Speichere das Jahresgehalt in eine SQL*Plus Hostvariable. Bind Variable :g_monthly_sal := v_sal / 12; Server • Verwende die nicht-PL/SQL Variable als Host Variable. • Gekennzeichnet durch einen davor gestellten Doppelpunkt (:). SQL21 basierend auf OAI-Kurs Copyright © Oracle Corporation, 1998. All rights reserved. SQL22 basierend auf OAI-Kurs Copyright © Oracle Corporation, 1998. All rights reserved. Zusammenfassung Zusammenfassung • PL/SQL Blöcke sind zusammengesetzt aus fogenden Teilen: • PL/SQL Variablennamen: – Deklaration (optional) DECLARE – Sind im Deklarationsteil definiert – Ausführung (erforderlich) BEGIN – Können einfach, zusammengesetzt, – Ausnahmebehandlung (optional) • Ein PL/SQL Block kann ein anonymer Block, eine Prozedur oder eine Funktion sein. SQL23 basierend auf OAI-Kurs Copyright © Oracle Corporation, 1998. All rights reserved. EXCEPTION END; Referenzen oder LOB Datentypen sein – Können zu anderen Variablen oder Datenbank-Objekten gehören – Können initialisiert werden. SQL24 basierend auf OAI-Kurs Copyright © Oracle Corporation, 1998. All rights reserved. PL/SQL Block Syntax • Statements können über mehrere Zeilen gehen Ausführbare Statements • Folgende Elemente gibt es: – Trennzeichen – Namen – Literale – Kommentare Copyright © Oracle Corporation, 1998. All rights reserved. SQL26 basierend auf OAI-Kurs Copyright © Oracle Corporation, 1998. All rights reserved. PL/SQL Block Syntax PL/SQL Block Syntax Namen (Identifiers) • Können bis zu 30 Zeichen enthalten • Dürfen keine reservierten Worte und keine doppelten Anführungszeichen enthalten Literale • Zeichen- und Datums-Literale müssen in einfache Apostrophe eingeschlossen sein. v_ename := 'Henderson'; • Müssen mit einem Buchstaben beginnen • Dürfen nicht den gleichen Namen wie eine Spalte in der Datenbank haben SQL27 basierend auf OAI-Kurs Copyright © Oracle Corporation, 1998. All rights reserved. • Zahlen können einfach oder in wissenschaftlicher Notation dargestellt sein. SQL28 basierend auf OAI-Kurs Copyright © Oracle Corporation, 1998. All rights reserved. Kommentare • Kommentare, die nach einer Zeile enden, werden mit zwei Querstrichen eingeleitet (- -). • Kommentare über mehrere Zeilen werden in /* und */ eingeschlossen. Example ... v_sal NUMBER (9,2); BEGIN /* Compute the annual salary based on the monthly salary input from the user */ v_sal := v_sal * 12; END; -- This is the end of the transaction SQL29 basierend auf OAI-Kurs Copyright © Oracle Corporation, 1998. All rights reserved. PL/SQL Funktionen Beispiele • Erzeuge eine Adressliste für eine Firma v_mailing_address := v_name||CHR(10)|| v_address||CHR(10)||v_state|| CHR(10)||v_zip; • Konvertiere die Angestelltennamen in Kleinbuchstaben v_ename := LOWER(v_ename); SQL Funktionen in PL/SQL • Möglich: – Ein Zeichen numerisch – Ein Zeichen Character – Datentyp konvertieren – Date • Nicht möglich: – GREATEST – LEAST – DECODE – Gruppenfunktionen SQL30 basierend auf OAI-Kurs Copyright © Oracle Corporation, 1998. All rights reserved. Datentypkonvertierung • Konvertieren von Daten in vergleichbare Typen. • Mischen von Datentypen kann Fehler zur Folge haben und verringert die Perfomance. • Konvertierungsfunktionen: – TO_CHAR – TO_DATE – TO_NUMBER SQL31 basierend auf OAI-Kurs Copyright © Oracle Corporation, 1998. All rights reserved. Gleich wie in SQL BEGIN SELECT TO_CHAR(hiredate, FROM END; 'MON. DD, YYYY') emp; SQL32 basierend auf OAI-Kurs Copyright © Oracle Corporation, 1998. All rights reserved. Datentypkonvertierung Operatoren in PL/SQL Dieses Statement ist fehlerhaft • Logische v_comment := USER||': '||SYSDATE; • Arithmetische das gleiche wie in SQL • Verkettung So ist es richtig v_comment := USER||': '||TO_CHAR(SYSDATE); • Klammerung zur Steuerung der Reihenfolge der Operationen • Exponential Operator (**) SQL33 basierend auf OAI-Kurs Copyright © Oracle Corporation, 1998. All rights reserved. Operatoren in PL/SQL Beispiele • Inkrementieren des Index in der Schleife. v_count := v_count + 1; • Wert für ein Boolean Flag setzen. v_equal := (v_n1 = v_n2); • Abfragen, ob eine Personalnummer vorhanden ist. v_valid := (v_empno IS NOT NULL); SQL35 basierend auf OAI-Kurs Copyright © Oracle Corporation, 1998. All rights reserved. SQL34 basierend auf OAI-Kurs Copyright © Oracle Corporation, 1998. All rights reserved. Verschachtelte Blöcke und Variablen-Gültigkeit Beispiel: ... x BINARY_INTEGER; BEGIN ... DECLARE y NUMBER; BEGIN ... END; ... END; Gültigkeit von x Gültigkeit von y SQL36 basierend auf OAI-Kurs Copyright © Oracle Corporation, 1998. All rights reserved. Verwendung von Bind Variablen Wenn eine Bind-Variable in PL/SQL verwendet wird, muss der Name das Prefix Doppelpunkt (:) erhalten. Beispiel DECLARE v_sal BEGIN SELECT INTO FROM WHERE :salary END; emp.sal%TYPE; sal v_sal emp empno = 7369; := v_sal; SQL37 basierend auf OAI-Kurs Copyright © Oracle Corporation, 1998. All rights reserved. Beispiel SQL> SQL> 2 3 4 5 6 7 variable a varchar2(20) declare ab varchar2(20); begin ab:='Das ist ein Test'; :a:= ab; end; / PL/SQL-Prozedur wurde erfolgreich abgeschlossen. SQL> print a A ------------------------------------------------------Das ist ein Test SQL39 basierend auf OAI-Kurs Copyright © Oracle Corporation, 1998. All rights reserved. Code Namen Konventionen Vermeide Gleichheiten: • Die Namen von lokalen Variablen und formalen Parameter haben Vorrang vor den Namen der Datenbanktabellen. • Spaltennamen haben Vorrang vor den Namen lokaler Variabler. SQL38 basierend auf OAI-Kurs Copyright © Oracle Corporation, 1998. All rights reserved.