PL / SQL - Kurzanleitung

Die PL / SQL-Programmiersprache wurde Ende der 1980er Jahre von der Oracle Corporation als prozedurale Erweiterungssprache für SQL und die relationale Oracle-Datenbank entwickelt. Im Folgenden finden Sie einige bemerkenswerte Fakten zu PL / SQL -

  • PL / SQL ist eine vollständig portable, leistungsstarke Transaktionsverarbeitungssprache.

  • PL / SQL bietet eine integrierte, interpretierte und vom Betriebssystem unabhängige Programmierumgebung.

  • PL / SQL kann auch direkt über die Befehlszeile aufgerufen werden SQL*Plus interface.

  • Ein direkter Aufruf kann auch von externen Programmiersprachenaufrufen an die Datenbank erfolgen.

  • Die allgemeine Syntax von PL / SQL basiert auf der Programmiersprache ADA und Pascal.

  • Neben Oracle ist PL / SQL in verfügbar TimesTen in-memory database und IBM DB2.

Funktionen von PL / SQL

PL / SQL bietet die folgenden Funktionen:

  • PL / SQL ist eng in SQL integriert.
  • Es bietet eine umfassende Fehlerprüfung.
  • Es bietet zahlreiche Datentypen.
  • Es bietet eine Vielzahl von Programmierstrukturen.
  • Es unterstützt die strukturierte Programmierung durch Funktionen und Prozeduren.
  • Es unterstützt die objektorientierte Programmierung.
  • Es unterstützt die Entwicklung von Webanwendungen und Serverseiten.

Vorteile von PL / SQL

PL / SQL bietet folgende Vorteile:

  • SQL ist die Standarddatenbanksprache und PL / SQL ist stark in SQL integriert. PL / SQL unterstützt sowohl statisches als auch dynamisches SQL. Statisches SQL unterstützt DML-Operationen und die Transaktionssteuerung über den PL / SQL-Block. In Dynamic SQL ermöglicht SQL das Einbetten von DDL-Anweisungen in PL / SQL-Blöcke.

  • Mit PL / SQL kann ein ganzer Block von Anweisungen gleichzeitig an die Datenbank gesendet werden. Dies reduziert den Netzwerkverkehr und bietet eine hohe Leistung für die Anwendungen.

  • PL / SQL bietet Programmierern eine hohe Produktivität, da es Daten in einer Datenbank abfragen, transformieren und aktualisieren kann.

  • PL / SQL spart Zeit beim Entwerfen und Debuggen durch leistungsstarke Funktionen wie Ausnahmebehandlung, Kapselung, Ausblenden von Daten und objektorientierte Datentypen.

  • In PL / SQL geschriebene Anwendungen sind vollständig portierbar.

  • PL / SQL bietet ein hohes Sicherheitsniveau.

  • PL / SQL bietet Zugriff auf vordefinierte SQL-Pakete.

  • PL / SQL bietet Unterstützung für die objektorientierte Programmierung.

  • PL / SQL bietet Unterstützung für die Entwicklung von Webanwendungen und Serverseiten.

In diesem Kapitel werden wir das Umgebungs-Setup von PL / SQL erläutern. PL / SQL ist keine eigenständige Programmiersprache. Es ist ein Tool in der Oracle-Programmierumgebung.SQL* Plusist ein interaktives Tool, mit dem Sie SQL- und PL / SQL-Anweisungen an der Eingabeaufforderung eingeben können. Diese Befehle werden dann zur Verarbeitung an die Datenbank gesendet. Sobald die Anweisungen verarbeitet wurden, werden die Ergebnisse zurückgesendet und auf dem Bildschirm angezeigt.

Um PL / SQL-Programme ausführen zu können, muss der Oracle RDBMS-Server auf Ihrem Computer installiert sein. Dies kümmert sich um die Ausführung der SQL-Befehle. Die neueste Version von Oracle RDBMS ist 11g. Sie können eine Testversion von Oracle 11g über den folgenden Link herunterladen:

Laden Sie die Oracle 11g Express Edition herunter

Sie müssen entweder die 32-Bit- oder die 64-Bit-Version der Installation gemäß Ihrem Betriebssystem herunterladen. Normalerweise gibt es zwei Dateien. Wir haben die 64-Bit-Version heruntergeladen. Sie werden ähnliche Schritte auch auf Ihrem Betriebssystem ausführen, unabhängig davon, ob es sich um Linux oder Solaris handelt.

  • win64_11gR2_database_1of2.zip

  • win64_11gR2_database_2of2.zip

Nachdem Sie die beiden oben genannten Dateien heruntergeladen haben, müssen Sie sie in einem einzigen Verzeichnis entpacken database und darunter finden Sie die folgenden Unterverzeichnisse -

Schritt 1

Lassen Sie uns nun das Oracle Database Installer mithilfe der Setup-Datei starten. Es folgt der erste Bildschirm. Sie können Ihre E-Mail-ID angeben und das Kontrollkästchen aktivieren, wie im folgenden Screenshot gezeigt. Drücke denNext Taste.

Schritt 2

Sie werden zum folgenden Bildschirm weitergeleitet. Deaktivieren Sie das Kontrollkästchen und klicken Sie aufContinue Taste, um fortzufahren.

Schritt 3

Wählen Sie einfach die erste Option Create and Configure Database Verwenden Sie das Optionsfeld und klicken Sie auf Next Taste, um fortzufahren.

Schritt 4

Wir gehen davon aus, dass Sie Oracle zu Lernzwecken installieren und auf Ihrem PC oder Laptop installieren. Wählen Sie daher dieDesktop Class Option und klicken Sie auf die Next Taste, um fortzufahren.

Schritt 5

Geben Sie einen Speicherort an, an dem Sie den Oracle-Server installieren. Ändern Sie einfach dieOracle Baseund die anderen Standorte werden automatisch eingestellt. Sie müssen auch ein Passwort eingeben; Dies wird vom System-DBA verwendet. Wenn Sie die erforderlichen Informationen eingegeben haben, klicken Sie aufNext Taste, um fortzufahren.

Schritt 6

Klicken Sie erneut auf Next Taste, um fortzufahren.

Schritt 7

Drücke den FinishTaste, um fortzufahren; Dadurch wird die eigentliche Serverinstallation gestartet.

Schritt 8

Dies dauert einige Momente, bis Oracle mit der Durchführung der erforderlichen Konfiguration beginnt.

Schritt 9

Hier kopiert die Oracle-Installation die erforderlichen Konfigurationsdateien. Dies sollte einen Moment dauern -

Schritt 10

Sobald die Datenbankdateien kopiert wurden, wird das folgende Dialogfeld angezeigt. Klicken Sie einfach aufOK Knopf und komm raus.

Schritt 11

Nach der Installation wird das folgende letzte Fenster angezeigt.

Letzter Schritt

Es ist jetzt Zeit, Ihre Installation zu überprüfen. Verwenden Sie an der Eingabeaufforderung den folgenden Befehl, wenn Sie Windows verwenden:

sqlplus "/ as sysdba"

Sie sollten die SQL-Eingabeaufforderung haben, in die Sie Ihre PL / SQL-Befehle und -Skripte schreiben -

Texteditor

Wenn Sie große Programme über die Eingabeaufforderung ausführen, verlieren Sie möglicherweise versehentlich einen Teil der Arbeit. Es wird immer empfohlen, die Befehlsdateien zu verwenden. So verwenden Sie die Befehlsdateien -

  • Geben Sie Ihren Code in einen Texteditor ein, wie z Notepad, Notepad+, oder EditPlus, usw.

  • Speichern Sie die Datei mit dem .sql Erweiterung im Home-Verzeichnis.

  • Starte den SQL*Plus command prompt aus dem Verzeichnis, in dem Sie Ihre PL / SQL-Datei erstellt haben.

  • Art @file_name an der SQL * Plus-Eingabeaufforderung, um Ihr Programm auszuführen.

Wenn Sie keine Datei zum Ausführen der PL / SQL-Skripte verwenden, kopieren Sie einfach Ihren PL / SQL-Code und klicken Sie mit der rechten Maustaste auf das schwarze Fenster, in dem die SQL-Eingabeaufforderung angezeigt wird. benutze diepasteOption zum Einfügen des vollständigen Codes an der Eingabeaufforderung. Zum Schluss einfach drückenEnter um den Code auszuführen, falls er noch nicht ausgeführt wurde.

In diesem Kapitel werden wir die grundlegende Syntax von PL / SQL diskutieren, die a block-structuredSprache; Dies bedeutet, dass die PL / SQL-Programme in logische Codeblöcke unterteilt und geschrieben sind. Jeder Block besteht aus drei Unterteilen -

S.No. Abschnitte & Beschreibung
1

Declarations

Dieser Abschnitt beginnt mit dem Schlüsselwort DECLARE. Es ist ein optionaler Abschnitt und definiert alle Variablen, Cursor, Unterprogramme und andere Elemente, die im Programm verwendet werden sollen.

2

Executable Commands

Dieser Abschnitt ist zwischen den Schlüsselwörtern eingeschlossen BEGIN und ENDund es ist ein obligatorischer Abschnitt. Es besteht aus den ausführbaren PL / SQL-Anweisungen des Programms. Es sollte mindestens eine ausführbare Codezeile enthalten, die nur eine sein kannNULL command um anzuzeigen, dass nichts ausgeführt werden soll.

3

Exception Handling

Dieser Abschnitt beginnt mit dem Schlüsselwort EXCEPTION. Dieser optionale Abschnitt enthältexception(s) die Fehler im Programm behandeln.

Jede PL / SQL-Anweisung endet mit einem Semikolon (;). PL / SQL-Blöcke können mit in andere PL / SQL-Blöcke verschachtelt werdenBEGIN und END. Es folgt die Grundstruktur eines PL / SQL-Blocks -

DECLARE 
   <declarations section> 
BEGIN 
   <executable command(s)>
EXCEPTION 
   <exception handling> 
END;

Das Beispiel 'Hallo Welt'

DECLARE 
   message  varchar2(20):= 'Hello, World!'; 
BEGIN 
   dbms_output.put_line(message); 
END; 
/

Das end;line signalisiert das Ende des PL / SQL-Blocks. Um den Code über die SQL-Befehlszeile auszuführen, müssen Sie möglicherweise / am Anfang der ersten leeren Zeile nach der letzten Zeile des Codes eingeben. Wenn der obige Code an der SQL-Eingabeaufforderung ausgeführt wird, wird das folgende Ergebnis ausgegeben:

Hello World  

PL/SQL procedure successfully completed.

Die PL / SQL-Kennungen

PL / SQL-Bezeichner sind Konstanten, Variablen, Ausnahmen, Prozeduren, Cursor und reservierte Wörter. Die Bezeichner bestehen aus einem Buchstaben, dem optional weitere Buchstaben, Ziffern, Dollarzeichen, Unterstriche und Zahlenzeichen folgen, und sollten 30 Zeichen nicht überschreiten.

Standardmäßig, identifiers are not case-sensitive. So können Sie verwendeninteger oder INTEGEReinen numerischen Wert darstellen. Sie können ein reserviertes Schlüsselwort nicht als Kennung verwenden.

Die PL / SQL-Begrenzer

Ein Trennzeichen ist ein Symbol mit einer besonderen Bedeutung. Es folgt die Liste der Trennzeichen in PL / SQL -

Trennzeichen Beschreibung
+, -, *, / Addition, Subtraktion / Negation, Multiplikation, Division
% Attributindikator
' Zeichenfolgenbegrenzer
. Komponentenauswahl
(,) Ausdrucks- oder Listenbegrenzer
: Hostvariablenindikator
, Artikeltrennzeichen
" Zitierter Bezeichnerbegrenzer
= Vergleichsoperator
@ Fernzugriffsanzeige
; Anweisungsabschluss
:= Aufgabenverwalter
=> Vereinsbetreiber
|| Verkettungsoperator
** Potenzierungsoperator
<<, >> Beschriftungsbegrenzer (Anfang und Ende)
/*, */ Mehrzeiliger Kommentarbegrenzer (Anfang und Ende)
-- Einzeilige Kommentaranzeige
.. Bereichsoperator
<, >, <=, >= Vergleichsoperatoren
<>, '=, ~=, ^= Verschiedene Versionen von NOT EQUAL

Die PL / SQL-Kommentare

Programmkommentare sind erklärende Anweisungen, die in den von Ihnen geschriebenen PL / SQL-Code aufgenommen werden können und jedem helfen, seinen Quellcode zu lesen. Alle Programmiersprachen erlauben irgendeine Form von Kommentaren.

PL / SQL unterstützt einzeilige und mehrzeilige Kommentare. Alle in einem Kommentar verfügbaren Zeichen werden vom PL / SQL-Compiler ignoriert. Die einzeiligen PL / SQL-Kommentare beginnen mit dem Trennzeichen - (doppelter Bindestrich), und mehrzeilige Kommentare werden von / * und * / eingeschlossen.

DECLARE 
   -- variable declaration 
   message  varchar2(20):= 'Hello, World!'; 
BEGIN 
   /* 
   *  PL/SQL executable statement(s) 
   */ 
   dbms_output.put_line(message); 
END; 
/

Wenn der obige Code an der SQL-Eingabeaufforderung ausgeführt wird, wird das folgende Ergebnis ausgegeben:

Hello World

PL/SQL procedure successfully completed.

PL / SQL-Programmeinheiten

Eine PL / SQL-Einheit ist eine der folgenden -

  • PL / SQL-Block
  • Function
  • Package
  • Paketkörper
  • Procedure
  • Trigger
  • Type
  • Geben Sie body ein

Jede dieser Einheiten wird in den folgenden Kapiteln behandelt.

In diesem Kapitel werden die Datentypen in PL / SQL erläutert. Die PL / SQL-Variablen, -Konstanten und -Parameter müssen einen gültigen Datentyp haben, der ein Speicherformat, Einschränkungen und einen gültigen Wertebereich angibt. Wir werden uns auf die konzentrierenSCALAR und die LOBDatentypen in diesem Kapitel. Die beiden anderen Datentypen werden in anderen Kapiteln behandelt.

S.No. Kategorie beschreibung
1

Scalar

Einzelwerte ohne interne Komponenten, z NUMBER, DATE, oder BOOLEAN.

2

Large Object (LOB)

Zeiger auf große Objekte, die getrennt von anderen Datenelementen gespeichert werden, z. B. Text, Grafiken, Videoclips und Tonwellenformen.

3

Composite

Datenelemente mit internen Komponenten, auf die einzeln zugegriffen werden kann. Zum Beispiel Sammlungen und Aufzeichnungen.

4

Reference

Zeiger auf andere Datenelemente.

Skalare PL / SQL-Datentypen und Subtypen

PL / SQL-skalare Datentypen und Subtypen fallen unter die folgenden Kategorien:

S.No. Datumstyp & Beschreibung
1

Numeric

Numerische Werte, für die arithmetische Operationen ausgeführt werden.

2

Character

Alphanumerische Werte, die einzelne Zeichen oder Zeichenfolgen darstellen.

3

Boolean

Logische Werte, für die logische Operationen ausgeführt werden.

4

Datetime

Daten und Zeiten.

PL / SQL bietet Untertypen von Datentypen. Beispielsweise hat der Datentyp NUMBER einen Untertyp namens INTEGER. Sie können die Untertypen in Ihrem PL / SQL-Programm verwenden, um die Datentypen mit Datentypen in anderen Programmen kompatibel zu machen, während Sie den PL / SQL-Code in ein anderes Programm, z. B. ein Java-Programm, einbetten.

Numerische PL / SQL-Datentypen und Subtypen

In der folgenden Tabelle sind die vordefinierten numerischen PL / SQL-Datentypen und ihre Untertypen aufgeführt.

S.No. Datentyp & Beschreibung
1

PLS_INTEGER

Ganzzahl mit Vorzeichen im Bereich von -2.147.483.648 bis 2.147.483.647, dargestellt in 32 Bit

2

BINARY_INTEGER

Ganzzahl mit Vorzeichen im Bereich von -2.147.483.648 bis 2.147.483.647, dargestellt in 32 Bit

3

BINARY_FLOAT

Gleitkommazahl im IEEE 754-Format mit einfacher Genauigkeit

4

BINARY_DOUBLE

Gleitkommazahl im IEEE 754-Format mit doppelter Genauigkeit

5

NUMBER(prec, scale)

Festkomma- oder Gleitkommazahl mit Absolutwert im Bereich von 1E-130 bis 1.0E126 (jedoch nicht eingeschlossen). Eine NUMBER-Variable kann auch 0 darstellen

6

DEC(prec, scale)

ANSI-spezifischer Festkommatyp mit einer maximalen Genauigkeit von 38 Dezimalstellen

7

DECIMAL(prec, scale)

IBM spezifischer Festkommatyp mit einer maximalen Genauigkeit von 38 Dezimalstellen

8

NUMERIC(pre, secale)

Floating-Typ mit einer maximalen Genauigkeit von 38 Dezimalstellen

9

DOUBLE PRECISION

ANSI-spezifischer Gleitkommatyp mit maximaler Genauigkeit von 126 Binärziffern (ca. 38 Dezimalstellen)

10

FLOAT

ANSI- und IBM-spezifischer Gleitkommatyp mit einer maximalen Genauigkeit von 126 Binärziffern (ca. 38 Dezimalstellen)

11

INT

ANSI-spezifischer Integer-Typ mit einer maximalen Genauigkeit von 38 Dezimalstellen

12

INTEGER

ANSI- und IBM-spezifischer Integer-Typ mit einer maximalen Genauigkeit von 38 Dezimalstellen

13

SMALLINT

ANSI- und IBM-spezifischer Integer-Typ mit einer maximalen Genauigkeit von 38 Dezimalstellen

14

REAL

Gleitkomma-Typ mit maximaler Genauigkeit von 63 Binärziffern (ca. 18 Dezimalstellen)

Es folgt eine gültige Erklärung -

DECLARE 
   num1 INTEGER; 
   num2 REAL; 
   num3 DOUBLE PRECISION; 
BEGIN 
   null; 
END; 
/

Wenn der obige Code kompiliert und ausgeführt wird, ergibt sich das folgende Ergebnis:

PL/SQL procedure successfully completed

PL / SQL-Zeichendatentypen und -Untertypen

Im Folgenden werden die vordefinierten PL / SQL-Zeichendatentypen und ihre Untertypen detailliert beschrieben.

S.No. Datentyp & Beschreibung
1

CHAR

Zeichenfolge mit fester Länge und einer maximalen Größe von 32.767 Byte

2

VARCHAR2

Zeichenfolge variabler Länge mit einer maximalen Größe von 32.767 Byte

3

RAW

Binär- oder Bytezeichenfolge variabler Länge mit einer maximalen Größe von 32.767 Bytes, die von PL / SQL nicht interpretiert wird

4

NCHAR

Nationale Zeichenfolge mit fester Länge und einer maximalen Größe von 32.767 Byte

5

NVARCHAR2

Nationale Zeichenfolge variabler Länge mit einer maximalen Größe von 32.767 Byte

6

LONG

Zeichenfolge variabler Länge mit einer maximalen Größe von 32.760 Byte

7

LONG RAW

Binär- oder Bytezeichenfolge mit variabler Länge und einer maximalen Größe von 32.760 Byte, die von PL / SQL nicht interpretiert wird

8

ROWID

Physische Zeilenkennung, die Adresse einer Zeile in einer normalen Tabelle

9

UROWID

Universelle Zeilenkennung (physische, logische oder fremde Zeilenkennung)

Boolesche PL / SQL-Datentypen

Das BOOLEANDer Datentyp speichert logische Werte, die in logischen Operationen verwendet werden. Die logischen Werte sind die Booleschen WerteTRUE und FALSE und der Wert NULL.

SQL hat jedoch keinen Datentyp, der BOOLEAN entspricht. Daher können Boolesche Werte nicht in - verwendet werden

  • SQL-Anweisungen
  • Integrierte SQL-Funktionen (z TO_CHAR)
  • PL / SQL-Funktionen, die aus SQL-Anweisungen aufgerufen werden

PL / SQL-Datums- und Intervalltypen

Das DATEDer Datentyp wird zum Speichern von Datumszeiten fester Länge verwendet, einschließlich der Tageszeit in Sekunden seit Mitternacht. Gültige Daten reichen vom 1. Januar 4712 v. Chr. Bis zum 31. Dezember 9999 n. Chr.

Das Standard-Datumsformat wird durch den Oracle-Initialisierungsparameter NLS_DATE_FORMAT festgelegt. Die Standardeinstellung ist beispielsweise "TT-MON-JJ", die eine zweistellige Nummer für den Tag des Monats, eine Abkürzung für den Monatsnamen und die letzten beiden Ziffern des Jahres enthält. Zum Beispiel 01-OCT-12.

Jedes DATUM enthält das Jahrhundert, das Jahr, den Monat, den Tag, die Stunde, die Minute und die Sekunde. Die folgende Tabelle zeigt die gültigen Werte für jedes Feld -

Feldname Gültige Datetime-Werte Gültige Intervallwerte
JAHR -4712 bis 9999 (ohne Jahr 0) Beliebige Ganzzahl ungleich Null
MONAT 01 bis 12 0 bis 11
TAG 01 bis 31 (begrenzt durch die Werte von MONAT und JAHR gemäß den Regeln des Kalenders für das Gebietsschema) Beliebige Ganzzahl ungleich Null
STUNDE 00 bis 23 0 bis 23
MINUTE 00 bis 59 0 bis 59
ZWEITE 00 bis 59,9 (n), wobei 9 (n) die Genauigkeit der Zeitbruchsekunden ist 0 bis 59,9 (n), wobei 9 (n) die Genauigkeit der Intervallbruchsekunden ist
TIMEZONE_HOUR -12 bis 14 (Bereich berücksichtigt Änderungen der Sommerzeit) Unzutreffend
TIMEZONE_MINUTE 00 bis 59 Unzutreffend
TIMEZONE_REGION Gefunden in der dynamischen Leistungsansicht V $ TIMEZONE_NAMES Unzutreffend
TIMEZONE_ABBR Gefunden in der dynamischen Leistungsansicht V $ TIMEZONE_NAMES Unzutreffend

LOB-Datentypen (PL / SQL Large Object)

LOB-Datentypen (Large Object) beziehen sich auf große Datenelemente wie Text, Grafiken, Videoclips und Tonwellenformen. LOB-Datentypen ermöglichen einen effizienten, zufälligen und stückweisen Zugriff auf diese Daten. Im Folgenden sind die vordefinierten PL / SQL-LOB-Datentypen aufgeführt:

Datentyp Beschreibung Größe
BFILE Wird zum Speichern großer Binärobjekte in Betriebssystemdateien außerhalb der Datenbank verwendet. Systemabhängig. 4 Gigabyte (GB) dürfen nicht überschritten werden.
KLECKS Wird zum Speichern großer Binärobjekte in der Datenbank verwendet. 8 bis 128 Terabyte (TB)
CLOB Wird verwendet, um große Blöcke von Zeichendaten in der Datenbank zu speichern. 8 bis 128 TB
NCLOB Wird verwendet, um große Blöcke von NCHAR-Daten in der Datenbank zu speichern. 8 bis 128 TB

Benutzerdefinierte PL / SQL-Untertypen

Ein Subtyp ist eine Teilmenge eines anderen Datentyps, der als Basistyp bezeichnet wird. Ein Subtyp hat dieselben gültigen Operationen wie sein Basistyp, jedoch nur eine Teilmenge seiner gültigen Werte.

PL / SQL definiert mehrere Untertypen im Paket vor STANDARD. Beispielsweise definiert PL / SQL die Untertypen vorCHARACTER und INTEGER wie folgt -

SUBTYPE CHARACTER IS CHAR; 
SUBTYPE INTEGER IS NUMBER(38,0);

Sie können Ihre eigenen Untertypen definieren und verwenden. Das folgende Programm veranschaulicht das Definieren und Verwenden eines benutzerdefinierten Subtyps:

DECLARE 
   SUBTYPE name IS char(20); 
   SUBTYPE message IS varchar2(100); 
   salutation name; 
   greetings message; 
BEGIN 
   salutation := 'Reader '; 
   greetings := 'Welcome to the World of PL/SQL'; 
   dbms_output.put_line('Hello ' || salutation || greetings); 
END; 
/

Wenn der obige Code an der SQL-Eingabeaufforderung ausgeführt wird, wird das folgende Ergebnis ausgegeben:

Hello Reader Welcome to the World of PL/SQL 
 
PL/SQL procedure successfully completed.

NULL in PL / SQL

PL / SQL NULL-Werte repräsentieren missing oder unknown dataund sie sind keine Ganzzahl, kein Zeichen oder ein anderer spezifischer Datentyp. Beachten Sie, dassNULL ist nicht dasselbe wie eine leere Datenzeichenfolge oder der Nullzeichenwert '\0'. Eine Null kann zugewiesen werden, aber sie kann mit nichts gleichgesetzt werden, auch nicht mit sich selbst.

In diesem Kapitel werden wir Variablen in Pl / SQL diskutieren. Eine Variable ist nichts anderes als ein Name für einen Speicherbereich, den unsere Programme bearbeiten können. Jede Variable in PL / SQL hat einen bestimmten Datentyp, der die Größe und das Layout des Speichers der Variablen bestimmt. den Wertebereich, der in diesem Speicher gespeichert werden kann, und den Satz von Operationen, die auf die Variable angewendet werden können.

Der Name einer PL / SQL-Variablen besteht aus einem Buchstaben, dem optional weitere Buchstaben, Ziffern, Dollarzeichen, Unterstriche und Zahlenzeichen folgen, und sollte 30 Zeichen nicht überschreiten. Bei Variablennamen wird standardmäßig nicht zwischen Groß- und Kleinschreibung unterschieden. Sie können ein reserviertes PL / SQL-Schlüsselwort nicht als Variablennamen verwenden.

Mit der PL / SQL-Programmiersprache können verschiedene Arten von Variablen definiert werden, z. B. Datums- und Uhrzeitdatentypen, Datensätze, Sammlungen usw., die in den folgenden Kapiteln behandelt werden. Lassen Sie uns in diesem Kapitel nur grundlegende Variablentypen untersuchen.

Variablendeklaration in PL / SQL

PL / SQL-Variablen müssen im Deklarationsabschnitt oder in einem Paket als globale Variable deklariert werden. Wenn Sie eine Variable deklarieren, weist PL / SQL dem Wert der Variablen Speicher zu, und der Speicherort wird durch den Variablennamen identifiziert.

Die Syntax zum Deklarieren einer Variablen lautet -

variable_name [CONSTANT] datatype [NOT NULL] [:= | DEFAULT initial_value]

Wenn Variablenname ein gültiger Bezeichner in PL / SQL ist, muss der Datentyp ein gültiger PL / SQL-Datentyp oder ein benutzerdefinierter Datentyp sein, den wir bereits im letzten Kapitel erörtert haben. Einige gültige Variablendeklarationen zusammen mit ihrer Definition sind unten gezeigt -

sales number(10, 2); 
pi CONSTANT double precision := 3.1415; 
name varchar2(25); 
address varchar2(100);

Wenn Sie für den Datentyp eine Größen-, Skalierungs- oder Genauigkeitsbeschränkung angeben, wird diese als a bezeichnet constrained declaration. Eingeschränkte Deklarationen benötigen weniger Speicher als nicht eingeschränkte Deklarationen. Zum Beispiel -

sales number(10, 2); 
name varchar2(25); 
address varchar2(100);

Variablen in PL / SQL initialisieren

Wenn Sie eine Variable deklarieren, weist PL / SQL ihr den Standardwert NULL zu. Wenn Sie eine Variable mit einem anderen Wert als dem NULL-Wert initialisieren möchten, können Sie dies während der Deklaration mit einer der folgenden Methoden tun:

  • Das DEFAULT Stichwort

  • Das assignment Operator

Zum Beispiel -

counter binary_integer := 0; 
greetings varchar2(20) DEFAULT 'Have a Good Day';

Sie können auch angeben, dass eine Variable keine haben soll NULL Wert mit dem NOT NULLZwang. Wenn Sie die NOT NULL-Einschränkung verwenden, müssen Sie dieser Variablen explizit einen Anfangswert zuweisen.

Es ist eine gute Programmierpraxis, Variablen ansonsten richtig zu initialisieren. Manchmal führen Programme zu unerwarteten Ergebnissen. Versuchen Sie das folgende Beispiel, in dem verschiedene Arten von Variablen verwendet werden:

DECLARE 
   a integer := 10; 
   b integer := 20; 
   c integer; 
   f real; 
BEGIN 
   c := a + b; 
   dbms_output.put_line('Value of c: ' || c); 
   f := 70.0/3.0; 
   dbms_output.put_line('Value of f: ' || f); 
END; 
/

Wenn der obige Code ausgeführt wird, wird das folgende Ergebnis erzeugt:

Value of c: 30 
Value of f: 23.333333333333333333  

PL/SQL procedure successfully completed.

Variabler Bereich in PL / SQL

PL / SQL ermöglicht das Verschachteln von Blöcken, dh jeder Programmblock kann einen anderen inneren Block enthalten. Wenn eine Variable innerhalb eines inneren Blocks deklariert ist, kann der äußere Block nicht darauf zugreifen. Wenn jedoch eine Variable deklariert ist und für einen äußeren Block zugänglich ist, ist sie auch für alle verschachtelten inneren Blöcke zugänglich. Es gibt zwei Arten von Variablenbereichen:

  • Local variables - Variablen, die in einem inneren Block deklariert sind und für äußere Blöcke nicht zugänglich sind.

  • Global variables - Variablen, die im äußersten Block oder in einem Paket deklariert sind.

Das folgende Beispiel zeigt die Verwendung von Local und Global Variablen in ihrer einfachen Form -

DECLARE 
   -- Global variables  
   num1 number := 95;  
   num2 number := 85;  
BEGIN  
   dbms_output.put_line('Outer Variable num1: ' || num1); 
   dbms_output.put_line('Outer Variable num2: ' || num2); 
   DECLARE  
      -- Local variables 
      num1 number := 195;  
      num2 number := 185;  
   BEGIN  
      dbms_output.put_line('Inner Variable num1: ' || num1); 
      dbms_output.put_line('Inner Variable num2: ' || num2); 
   END;  
END; 
/

Wenn der obige Code ausgeführt wird, wird das folgende Ergebnis erzeugt:

Outer Variable num1: 95 
Outer Variable num2: 85 
Inner Variable num1: 195 
Inner Variable num2: 185  

PL/SQL procedure successfully completed.

Zuweisen von SQL-Abfrageergebnissen zu PL / SQL-Variablen

Du kannst den ... benutzen SELECT INTOSQL-Anweisung zum Zuweisen von Werten zu PL / SQL-Variablen. Für jeden Artikel in derSELECT listmuss eine entsprechende typkompatible Variable in der vorhanden sein INTO list. Das folgende Beispiel veranschaulicht das Konzept. Lassen Sie uns eine Tabelle mit dem Namen CUSTOMERS erstellen -

(For SQL statements, please refer to the SQL tutorial)

CREATE TABLE CUSTOMERS( 
   ID   INT NOT NULL, 
   NAME VARCHAR (20) NOT NULL, 
   AGE INT NOT NULL, 
   ADDRESS CHAR (25), 
   SALARY   DECIMAL (18, 2),        
   PRIMARY KEY (ID) 
);  

Table Created

Fügen wir nun einige Werte in die Tabelle ein -

INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) 
VALUES (1, 'Ramesh', 32, 'Ahmedabad', 2000.00 );  

INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) 
VALUES (2, 'Khilan', 25, 'Delhi', 1500.00 );  

INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) 
VALUES (3, 'kaushik', 23, 'Kota', 2000.00 );
  
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) 
VALUES (4, 'Chaitali', 25, 'Mumbai', 6500.00 ); 
 
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) 
VALUES (5, 'Hardik', 27, 'Bhopal', 8500.00 );  

INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) 
VALUES (6, 'Komal', 22, 'MP', 4500.00 );

Das folgende Programm weist PL / SQL-Variablen mithilfe der Werte aus der obigen Tabelle zu SELECT INTO clause von SQL -

DECLARE 
   c_id customers.id%type := 1; 
   c_name  customers.name%type; 
   c_addr customers.address%type; 
   c_sal  customers.salary%type; 
BEGIN 
   SELECT name, address, salary INTO c_name, c_addr, c_sal 
   FROM customers 
   WHERE id = c_id;  
   dbms_output.put_line 
   ('Customer ' ||c_name || ' from ' || c_addr || ' earns ' || c_sal); 
END; 
/

Wenn der obige Code ausgeführt wird, wird das folgende Ergebnis erzeugt:

Customer Ramesh from Ahmedabad earns 2000  

PL/SQL procedure completed successfully

In diesem Kapitel werden wir diskutieren constants und literalsin PL / SQL. Eine Konstante enthält einen Wert, der sich nach seiner Deklaration im Programm nicht ändert. Eine konstante Deklaration gibt den Namen, den Datentyp und den Wert an und weist ihr Speicher zu. Die Erklärung kann auch die auferlegenNOT NULL constraint.

Konstante deklarieren

Eine Konstante wird mit dem deklariert CONSTANTStichwort. Es erfordert einen Anfangswert und erlaubt nicht, diesen Wert zu ändern. Zum Beispiel -

PI CONSTANT NUMBER := 3.141592654; 
DECLARE 
   -- constant declaration 
   pi constant number := 3.141592654; 
   -- other declarations 
   radius number(5,2);  
   dia number(5,2);  
   circumference number(7, 2); 
   area number (10, 2); 
BEGIN  
   -- processing 
   radius := 9.5;  
   dia := radius * 2;  
   circumference := 2.0 * pi * radius; 
   area := pi * radius * radius; 
   -- output 
   dbms_output.put_line('Radius: ' || radius); 
   dbms_output.put_line('Diameter: ' || dia); 
   dbms_output.put_line('Circumference: ' || circumference); 
   dbms_output.put_line('Area: ' || area); 
END; 
/

Wenn der obige Code an der SQL-Eingabeaufforderung ausgeführt wird, wird das folgende Ergebnis ausgegeben:

Radius: 9.5 
Diameter: 19 
Circumference: 59.69 
Area: 283.53  

Pl/SQL procedure successfully completed.

Die PL / SQL-Literale

Ein Literal ist eine explizite Zahl, ein Zeichen, eine Zeichenfolge oder ein Boolescher Wert, der nicht durch einen Bezeichner dargestellt wird. Beispielsweise sind TRUE, 786, NULL und 'tutorialspoint' alle Literale vom Typ Boolean, number oder string. PL / SQL, Literale unterscheiden zwischen Groß- und Kleinschreibung. PL / SQL unterstützt die folgenden Arten von Literalen:

  • Numerische Literale
  • Zeichenliterale
  • String-Literale
  • BOOLEAN Literale
  • Datums- und Zeitliterale

Die folgende Tabelle enthält Beispiele aus all diesen Kategorien von Literalwerten.

S.No. Literal Typ & Beispiel
1

Numeric Literals

050 78 -14 0 +32767

6,6667 0,0 -12,0 3,14159 +7800,00

6E5 1.0E-8 3.14159e0 -1E38 -9.5e-3

2

Character Literals

'A' '%' '9' '' 'z' '('

3

String Literals

'Hallo Welt!'

"Tutorials Point"

'19 -NOV-12 '

4

BOOLEAN Literals

TRUE, FALSE und NULL.

5

Date and Time Literals

DATUM '1978-12-25';

TIMESTAMP '2012-10-29 12:01:01';

Um einfache Anführungszeichen in ein Zeichenfolgenliteral einzubetten, platzieren Sie zwei einfache Anführungszeichen nebeneinander, wie im folgenden Programm gezeigt -

DECLARE 
   message  varchar2(30):= 'That''s tutorialspoint.com!'; 
BEGIN 
   dbms_output.put_line(message); 
END; 
/

Wenn der obige Code an der SQL-Eingabeaufforderung ausgeführt wird, wird das folgende Ergebnis ausgegeben:

That's tutorialspoint.com!  

PL/SQL procedure successfully completed.

In diesem Kapitel werden Operatoren in PL / SQL erläutert. Ein Operator ist ein Symbol, das den Compiler anweist, bestimmte mathematische oder logische Manipulationen durchzuführen. Die PL / SQL-Sprache ist reich an integrierten Operatoren und bietet die folgenden Arten von Operatoren:

  • Rechenzeichen
  • Vergleichsoperatoren
  • Vergleichsoperatoren
  • Logische Operatoren
  • String-Operatoren

Hier werden wir die arithmetischen, relationalen, vergleichenden und logischen Operatoren nacheinander verstehen. Die String-Operatoren werden in einem späteren Kapitel erläutert.PL/SQL - Strings.

Rechenzeichen

Die folgende Tabelle zeigt alle von PL / SQL unterstützten arithmetischen Operatoren. Lasst uns annehmenvariable A hält 10 und variable B hält 5, dann -

Beispiele anzeigen

Operator Beschreibung Beispiel
+ Fügt zwei Operanden hinzu A + B ergibt 15
- - Subtrahiert den zweiten Operanden vom ersten A - B ergibt 5
* * Multipliziert beide Operanden A * B ergibt 50
/. Teilt den Zähler durch den De-Zähler A / B gibt 2
** **. Exponentiationsoperator, hebt einen Operanden zur Potenz des anderen an A ** B ergibt 100000

Vergleichsoperatoren

Vergleichsoperatoren vergleichen zwei Ausdrücke oder Werte und geben ein boolesches Ergebnis zurück. Die folgende Tabelle zeigt alle von PL / SQL unterstützten Vergleichsoperatoren. Lasst uns annehmenvariable A hält 10 und variable B hält 20, dann -

Beispiele anzeigen

Operator Beschreibung Beispiel
= Überprüft, ob die Werte von zwei Operanden gleich sind oder nicht. Wenn ja, wird die Bedingung wahr. (A = B) ist nicht wahr.

! =

<>

~ =

Überprüft, ob die Werte von zwei Operanden gleich sind oder nicht. Wenn die Werte nicht gleich sind, wird die Bedingung wahr. (A! = B) ist wahr.
> Überprüft, ob der Wert des linken Operanden größer als der Wert des rechten Operanden ist. Wenn ja, wird die Bedingung wahr. (A> B) ist nicht wahr.
< Überprüft, ob der Wert des linken Operanden kleiner als der Wert des rechten Operanden ist. Wenn ja, wird die Bedingung wahr. (A <B) ist wahr.
> = Überprüft, ob der Wert des linken Operanden größer oder gleich dem Wert des rechten Operanden ist. Wenn ja, wird die Bedingung wahr. (A> = B) ist nicht wahr.
<= Überprüft, ob der Wert des linken Operanden kleiner oder gleich dem Wert des rechten Operanden ist. Wenn ja, wird die Bedingung wahr. (A <= B) ist wahr

Vergleichsoperatoren

Vergleichsoperatoren werden zum Vergleichen eines Ausdrucks mit einem anderen verwendet. Das Ergebnis ist immer entwederTRUE, FALSE oder NULL.

Beispiele anzeigen

Operator Beschreibung Beispiel
MÖGEN Der LIKE-Operator vergleicht ein Zeichen, eine Zeichenfolge oder einen CLOB-Wert mit einem Muster und gibt TRUE zurück, wenn der Wert mit dem Muster übereinstimmt, und FALSE, wenn dies nicht der Fall ist. Wenn 'Zara Ali' wie 'Z% A_i' einen Booleschen Wert true zurückgibt, während 'Nuha Ali' wie 'Z% A_i' einen Booleschen Wert false zurückgibt.
ZWISCHEN Der BETWEEN-Operator testet, ob ein Wert in einem bestimmten Bereich liegt. x ZWISCHEN a UND b bedeutet, dass x> = a und x <= b. Wenn x = 10 ist, gibt x zwischen 5 und 20 true zurück, x zwischen 5 und 10 gibt true zurück, aber x zwischen 11 und 20 gibt false zurück.
IM Der IN-Operator testet die eingestellte Mitgliedschaft. x IN (Menge) bedeutet, dass x gleich einem Mitglied der Menge ist. Wenn x = 'm' ist, gibt x in ('a', 'b', 'c') Boolean false zurück, aber x in ('m', 'n', 'o') gibt Boolean true zurück.
IST NULL Der Operator IS NULL gibt den BOOLEAN-Wert TRUE zurück, wenn sein Operand NULL ist, oder FALSE, wenn er nicht NULL ist. Vergleiche mit NULL-Werten ergeben immer NULL. Wenn x = 'm', dann gibt 'x ist null' den Booleschen Wert false zurück.

Logische Operatoren

Die folgende Tabelle zeigt die von PL / SQL unterstützten logischen Operatoren. Alle diese Operatoren arbeiten mit booleschen Operanden und erzeugen boolesche Ergebnisse. Lasst uns annehmenvariable A gilt und variable B hält falsch, dann -

Beispiele anzeigen

Operator Beschreibung Beispiele
und Wird als logischer AND-Operator bezeichnet. Wenn beide Operanden wahr sind, wird die Bedingung wahr. (A und B) ist falsch.
oder Wird als logischer ODER-Operator bezeichnet. Wenn einer der beiden Operanden wahr ist, wird die Bedingung wahr. (A oder B) ist wahr.
nicht Wird als logischer NOT-Operator bezeichnet. Wird verwendet, um den logischen Zustand seines Operanden umzukehren. Wenn eine Bedingung wahr ist, macht der Operator Logical NOT sie falsch. nicht (A und B) ist wahr.

PL / SQL-Operator-Vorrang

Die Operatorrangfolge bestimmt die Gruppierung von Begriffen in einem Ausdruck. Dies wirkt sich darauf aus, wie ein Ausdruck ausgewertet wird. Bestimmte Operatoren haben eine höhere Priorität als andere. Beispielsweise hat der Multiplikationsoperator eine höhere Priorität als der Additionsoperator.

Zum Beispiel, x = 7 + 3 * 2;; Hier,x zugewiesen ist 13, nicht 20, da der Operator * eine höhere Priorität als + hat und daher zuerst mit multipliziert wird 3*2 und fügt dann hinzu 7.

Hier werden Operatoren mit der höchsten Priorität oben in der Tabelle angezeigt, Operatoren mit der niedrigsten Priorität unten. Innerhalb eines Ausdrucks werden zuerst Operatoren mit höherer Priorität ausgewertet.

Die Priorität von Operatoren lautet wie folgt: =, <,>, <=,> =, <> ,! =, ~ =, ^ =, IS NULL, LIKE, ZWISCHEN, IN.

Beispiele anzeigen

Operator Betrieb
** **. Potenzierung
+, - Identität, Verneinung
*, / Multiplikation, Division
+, -, || Addition, Subtraktion, Verkettung
Vergleich
NICHT logische Negation
UND Verbindung
ODER Aufnahme

In diesem Kapitel werden die Bedingungen in PL / SQL erläutert. Entscheidungsstrukturen erfordern, dass der Programmierer eine oder mehrere Bedingungen angibt, die vom Programm bewertet oder getestet werden sollen, zusammen mit einer Anweisung oder Anweisungen, die ausgeführt werden sollen, wenn die Bedingung als wahr bestimmt wird, und optional anderen Anweisungen, die ausgeführt werden sollen, wenn die Bedingung wird als falsch bestimmt.

Es folgt die allgemeine Form einer typischen bedingten Struktur (dh Entscheidungsfindung), die in den meisten Programmiersprachen zu finden ist:

Die PL / SQL-Programmiersprache bietet die folgenden Arten von Entscheidungsbefehlen. Klicken Sie auf die folgenden Links, um deren Details zu überprüfen.

S.No. Aussage & Beschreibung
1 IF - THEN Anweisung

Das IF statement ordnet eine Bedingung einer Folge von Anweisungen zu, die von den Schlüsselwörtern eingeschlossen werden THEN und END IF. Wenn die Bedingung wahr ist, werden die Anweisungen ausgeführt, und wenn die Bedingung falsch oder NULL ist, führt die IF-Anweisung nichts aus.

2 IF-THEN-ELSE-Anweisung

IF statement fügt das Schlüsselwort hinzu ELSEgefolgt von einer alternativen Abfolge von Anweisungen. Wenn die Bedingung falsch oder NULL ist, wird nur die alternative Folge von Anweisungen ausgeführt. Es stellt sicher, dass eine der Anweisungen ausgeführt wird.

3 IF-THEN-ELSIF-Anweisung

Sie können zwischen mehreren Alternativen wählen.

4 Fallbeschreibung

Wie die IF-Anweisung ist auch die CASE statement wählt eine Folge von Anweisungen aus, die ausgeführt werden sollen.

Zur Auswahl der Sequenz verwendet die CASE-Anweisung jedoch einen Selektor anstelle mehrerer boolescher Ausdrücke. Ein Selektor ist ein Ausdruck, mit dessen Wert eine von mehreren Alternativen ausgewählt wird.

5 Gesuchte CASE-Anweisung

Die gesuchte CASE-Anweisung has no selectorund es sind WHEN-Klauseln, die Suchbedingungen enthalten, die Boolesche Werte ergeben.

6 verschachtelt IF-THEN-ELSE

Sie können eine verwenden IF-THEN oder IF-THEN-ELSIF Aussage in einem anderen IF-THEN oder IF-THEN-ELSIF Aussage (n).

In diesem Kapitel werden wir Schleifen in PL / SQL behandeln. Es kann vorkommen, dass Sie einen Codeblock mehrmals ausführen müssen. Im Allgemeinen werden Anweisungen nacheinander ausgeführt: Die erste Anweisung in einer Funktion wird zuerst ausgeführt, gefolgt von der zweiten usw.

Programmiersprachen bieten verschiedene Steuerungsstrukturen, die kompliziertere Ausführungspfade ermöglichen.

Mit einer Schleifenanweisung können wir eine Anweisung oder eine Gruppe von Anweisungen mehrmals ausführen. Im Folgenden wird die allgemeine Form einer Schleifenanweisung in den meisten Programmiersprachen beschrieben:

PL / SQL bietet die folgenden Schleifentypen, um die Schleifenanforderungen zu erfüllen. Klicken Sie auf die folgenden Links, um deren Details zu überprüfen.

S.No. Schleifentyp & Beschreibung
1 PL / SQL Basic LOOP

In dieser Schleifenstruktur ist eine Folge von Anweisungen zwischen den Anweisungen LOOP und END LOOP eingeschlossen. Bei jeder Iteration wird die Folge von Anweisungen ausgeführt, und die Steuerung wird am oberen Rand der Schleife fortgesetzt.

2 PL / SQL WHILE LOOP

Wiederholt eine Anweisung oder eine Gruppe von Anweisungen, während eine bestimmte Bedingung erfüllt ist. Es testet die Bedingung, bevor der Schleifenkörper ausgeführt wird.

3 PL / SQL FOR LOOP

Führen Sie eine Folge von Anweisungen mehrmals aus und kürzen Sie den Code ab, der die Schleifenvariable verwaltet.

4 Verschachtelte Schleifen in PL / SQL

Sie können eine oder mehrere Schleifen in jeder anderen Basisschleife verwenden, while oder for loop.

Beschriften einer PL / SQL-Schleife

PL / SQL-Schleifen können beschriftet werden. Die Beschriftung sollte in doppelte spitze Klammern (<< und >>) eingeschlossen sein und am Anfang der LOOP-Anweisung erscheinen. Der Labelname kann auch am Ende der LOOP-Anweisung erscheinen. Sie können die Bezeichnung in der EXIT-Anweisung verwenden, um die Schleife zu verlassen.

Das folgende Programm veranschaulicht das Konzept -

DECLARE 
   i number(1); 
   j number(1); 
BEGIN 
   << outer_loop >> 
   FOR i IN 1..3 LOOP 
      << inner_loop >> 
      FOR j IN 1..3 LOOP 
         dbms_output.put_line('i is: '|| i || ' and j is: ' || j); 
      END loop inner_loop; 
   END loop outer_loop; 
END; 
/

Wenn der obige Code an der SQL-Eingabeaufforderung ausgeführt wird, wird das folgende Ergebnis ausgegeben:

i is: 1 and j is: 1 
i is: 1 and j is: 2 
i is: 1 and j is: 3 
i is: 2 and j is: 1 
i is: 2 and j is: 2 
i is: 2 and j is: 3 
i is: 3 and j is: 1 
i is: 3 and j is: 2 
i is: 3 and j is: 3  

PL/SQL procedure successfully completed.

Die Schleifensteuerungsanweisungen

Schleifensteueranweisungen ändern die Ausführung von ihrer normalen Reihenfolge. Wenn die Ausführung einen Bereich verlässt, werden alle automatischen Objekte, die in diesem Bereich erstellt wurden, zerstört.

PL / SQL unterstützt die folgenden Steueranweisungen. Beschriftungsschleifen helfen auch dabei, die Steuerung außerhalb einer Schleife zu übernehmen. Klicken Sie auf die folgenden Links, um deren Details zu überprüfen.

S.No. Steueranweisung & Beschreibung
1 EXIT-Anweisung

Die Exit-Anweisung vervollständigt die Schleife und die Steuerung wird unmittelbar nach der END LOOP an die Anweisung übergeben.

2 CONTINUE-Anweisung

Bewirkt, dass die Schleife den Rest ihres Körpers überspringt und ihren Zustand sofort erneut testet, bevor sie wiederholt wird.

3 GOTO-Anweisung

Überträgt die Kontrolle auf die beschriftete Anweisung. Es wird jedoch nicht empfohlen, die GOTO-Anweisung in Ihrem Programm zu verwenden.

Die Zeichenfolge in PL / SQL ist eine Folge von Zeichen mit einer optionalen Größenangabe. Die Zeichen können numerisch, Buchstaben, Leerzeichen, Sonderzeichen oder eine Kombination aus allen sein. PL / SQL bietet drei Arten von Zeichenfolgen:

  • Fixed-length strings- In solchen Zeichenfolgen geben Programmierer die Länge an, während sie die Zeichenfolge deklarieren. Die Zeichenfolge ist mit Leerzeichen auf die angegebene Länge rechts aufgefüllt.

  • Variable-length strings - In solchen Zeichenfolgen wird eine maximale Länge von bis zu 32.767 für die Zeichenfolge angegeben, und es findet keine Auffüllung statt.

  • Character large objects (CLOBs) - Dies sind Zeichenfolgen variabler Länge, die bis zu 128 Terabyte betragen können.

PL / SQL-Zeichenfolgen können entweder Variablen oder Literale sein. Ein Zeichenfolgenliteral wird in Anführungszeichen gesetzt. Zum Beispiel,

'This is a string literal.' Or 'hello world'

Um ein einfaches Anführungszeichen in ein Zeichenfolgenliteral aufzunehmen, müssen Sie zwei einfache Anführungszeichen nebeneinander eingeben. Zum Beispiel,

'this isn''t what it looks like'

Zeichenfolgenvariablen deklarieren

Die Oracle-Datenbank bietet zahlreiche Zeichenfolgendatentypen wie CHAR, NCHAR, VARCHAR2, NVARCHAR2, CLOB und NCLOB. Den Datentypen wird ein vorangestellt'N' sind 'national character set' Datentypen, die Unicode-Zeichendaten speichern.

Wenn Sie eine Zeichenfolge mit variabler Länge deklarieren müssen, müssen Sie die maximale Länge dieser Zeichenfolge angeben. Zum Beispiel der Datentyp VARCHAR2. Das folgende Beispiel zeigt das Deklarieren und Verwenden einiger Zeichenfolgenvariablen.

DECLARE 
   name varchar2(20); 
   company varchar2(30); 
   introduction clob; 
   choice char(1); 
BEGIN 
   name := 'John Smith'; 
   company := 'Infotech'; 
   introduction := ' Hello! I''m John Smith from Infotech.'; 
   choice := 'y'; 
   IF choice = 'y' THEN 
      dbms_output.put_line(name); 
      dbms_output.put_line(company); 
      dbms_output.put_line(introduction); 
   END IF; 
END; 
/

Wenn der obige Code an der SQL-Eingabeaufforderung ausgeführt wird, wird das folgende Ergebnis ausgegeben:

John Smith 
Infotech
Hello! I'm John Smith from Infotech.  

PL/SQL procedure successfully completed

Verwenden Sie den Datentyp CHAR, um eine Zeichenfolge mit fester Länge zu deklarieren. Hier müssen Sie keine maximale Länge für eine Variable mit fester Länge angeben. Wenn Sie die Längenbeschränkung weglassen, verwendet Oracle Database automatisch die maximal erforderliche Länge. Die folgenden zwei Erklärungen sind identisch -

red_flag CHAR(1) := 'Y'; 
 red_flag CHAR   := 'Y';

PL / SQL-Zeichenfolgenfunktionen und -operatoren

PL / SQL bietet den Verkettungsoperator (||)zum Verbinden von zwei Saiten. Die folgende Tabelle enthält die von PL / SQL bereitgestellten Zeichenfolgenfunktionen -

S.No. Funktion & Zweck
1

ASCII(x);

Gibt den ASCII-Wert des Zeichens x zurück.

2

CHR(x);

Gibt das Zeichen mit dem ASCII-Wert x zurück.

3

CONCAT(x, y);

Verkettet die Zeichenfolgen x und y und gibt die angehängte Zeichenfolge zurück.

4

INITCAP(x);

Konvertiert den Anfangsbuchstaben jedes Wortes in x in Großbuchstaben und gibt diese Zeichenfolge zurück.

5

INSTR(x, find_string [, start] [, occurrence]);

Sucht nach find_string in x und gibt die Position zurück, an der es auftritt.

6

INSTRB(x);

Gibt die Position einer Zeichenfolge innerhalb einer anderen Zeichenfolge zurück, gibt jedoch den Wert in Byte zurück.

7

LENGTH(x);

Gibt die Anzahl der Zeichen in x zurück.

8

LENGTHB(x);

Gibt die Länge einer Zeichenfolge in Bytes für einen Einzelbyte-Zeichensatz zurück.

9

LOWER(x);

Konvertiert die Buchstaben in x in Kleinbuchstaben und gibt diese Zeichenfolge zurück.

10

LPAD(x, width [, pad_string]) ;

Pads x mit Leerzeichen nach links, um die Gesamtlänge der Zeichenfolge auf die Breite der Zeichen zu bringen.

11

LTRIM(x [, trim_string]);

Trimmt Zeichen von links von x.

12

NANVL(x, value);

Gibt den Wert zurück, wenn x mit dem NaN-Sonderwert (keine Zahl) übereinstimmt, andernfalls x ist zurück gekommen.

13

NLS_INITCAP(x);

Entspricht der INITCAP-Funktion, kann jedoch eine andere von NLSSORT angegebene Sortiermethode verwenden.

14

NLS_LOWER(x) ;

Entspricht der LOWER-Funktion, außer dass eine andere Sortiermethode verwendet werden kann, wie von NLSSORT angegeben.

15

NLS_UPPER(x);

Entspricht der UPPER-Funktion, außer dass eine andere Sortiermethode verwendet werden kann, wie von NLSSORT angegeben.

16

NLSSORT(x);

Ändert die Methode zum Sortieren der Zeichen. Muss vor jeder NLS-Funktion angegeben werden. Andernfalls wird die Standardsortierung verwendet.

17

NVL(x, value);

Gibt den Wert zurück, wenn xist Null; Andernfalls wird x zurückgegeben.

18

NVL2(x, value1, value2);

Gibt value1 zurück, wenn x nicht null ist. Wenn x null ist, wird value2 zurückgegeben.

19

REPLACE(x, search_string, replace_string);

Suchen x für search_string und ersetzt es durch replace_string.

20

RPAD(x, width [, pad_string]);

Pads x auf der rechten Seite.

21

RTRIM(x [, trim_string]);

Borten x von rechts.

22

SOUNDEX(x) ;

Gibt eine Zeichenfolge zurück, die die phonetische Darstellung von enthält x.

23

SUBSTR(x, start [, length]);

Gibt einen Teilstring von zurück xdas beginnt an der durch start angegebenen Position. Eine optionale Länge für den Teilstring kann angegeben werden.

24

SUBSTRB(x);

Entspricht SUBSTR, außer dass die Parameter für die Einzelbyte-Zeichensysteme in Bytes anstelle von Zeichen ausgedrückt werden.

25

TRIM([trim_char FROM) x);

Trimmt Zeichen von links und rechts von x.

26

UPPER(x);

Konvertiert die Buchstaben in x in Großbuchstaben und gibt diese Zeichenfolge zurück.

Lassen Sie uns nun einige Beispiele erarbeiten, um das Konzept zu verstehen -

Beispiel 1

DECLARE 
   greetings varchar2(11) := 'hello world'; 
BEGIN 
   dbms_output.put_line(UPPER(greetings)); 
    
   dbms_output.put_line(LOWER(greetings)); 
    
   dbms_output.put_line(INITCAP(greetings)); 
    
   /* retrieve the first character in the string */ 
   dbms_output.put_line ( SUBSTR (greetings, 1, 1)); 
    
   /* retrieve the last character in the string */ 
   dbms_output.put_line ( SUBSTR (greetings, -1, 1)); 
    
   /* retrieve five characters,  
      starting from the seventh position. */ 
   dbms_output.put_line ( SUBSTR (greetings, 7, 5)); 
    
   /* retrieve the remainder of the string, 
      starting from the second position. */ 
   dbms_output.put_line ( SUBSTR (greetings, 2)); 
     
   /* find the location of the first "e" */ 
   dbms_output.put_line ( INSTR (greetings, 'e')); 
END; 
/

Wenn der obige Code an der SQL-Eingabeaufforderung ausgeführt wird, wird das folgende Ergebnis ausgegeben:

HELLO WORLD 
hello world 
Hello World 
h 
d 
World 
ello World 
2  

PL/SQL procedure successfully completed.

Beispiel 2

DECLARE 
   greetings varchar2(30) := '......Hello World.....'; 
BEGIN 
   dbms_output.put_line(RTRIM(greetings,'.')); 
   dbms_output.put_line(LTRIM(greetings, '.')); 
   dbms_output.put_line(TRIM( '.' from greetings)); 
END; 
/

Wenn der obige Code an der SQL-Eingabeaufforderung ausgeführt wird, wird das folgende Ergebnis ausgegeben:

......Hello World  
Hello World..... 
Hello World  

PL/SQL procedure successfully completed.

In diesem Kapitel werden Arrays in PL / SQL erläutert. Die PL / SQL-Programmiersprache bietet eine Datenstruktur namensVARRAY, die eine sequentielle Sammlung von Elementen desselben Typs mit fester Größe speichern kann. Ein Varray wird zum Speichern einer geordneten Sammlung von Daten verwendet. Oft ist es jedoch besser, sich ein Array als eine Sammlung von Variablen desselben Typs vorzustellen.

Alle Varrays bestehen aus zusammenhängenden Speicherstellen. Die niedrigste Adresse entspricht dem ersten Element und die höchste Adresse dem letzten Element.

Ein Array ist Teil von Auflistungstypdaten und steht für Arrays variabler Größe. Wir werden in einem späteren Kapitel andere Sammlungstypen untersuchen'PL/SQL Collections'.

Jedes Element in a varrayist ein Index zugeordnet. Es hat auch eine maximale Größe, die dynamisch geändert werden kann.

Erstellen eines Varray-Typs

Mit dem wird ein Varray-Typ erstellt CREATE TYPEErklärung. Sie müssen die maximale Größe und den Typ der im Varray gespeicherten Elemente angeben.

Die grundlegende Syntax zum Erstellen eines VARRAY-Typs auf Schemaebene lautet:

CREATE OR REPLACE TYPE varray_type_name IS VARRAY(n) of <element_type>

Wo,

  • varray_type_name ist ein gültiger Attributname.
  • n ist die Anzahl der Elemente (maximal) im Varray,
  • element_type ist der Datentyp der Elemente des Arrays.

Die maximale Größe eines Varrays kann mit dem geändert werden ALTER TYPE Erklärung.

Zum Beispiel,

CREATE Or REPLACE TYPE namearray AS VARRAY(3) OF VARCHAR2(10); 
/ 

Type created.

Die grundlegende Syntax zum Erstellen eines VARRAY-Typs innerhalb eines PL / SQL-Blocks lautet:

TYPE varray_type_name IS VARRAY(n) of <element_type>

Zum Beispiel -

TYPE namearray IS VARRAY(5) OF VARCHAR2(10); 
Type grades IS VARRAY(5) OF INTEGER;

Lassen Sie uns nun einige Beispiele erarbeiten, um das Konzept zu verstehen -

Beispiel 1

Das folgende Programm veranschaulicht die Verwendung von Varrays -

DECLARE 
   type namesarray IS VARRAY(5) OF VARCHAR2(10); 
   type grades IS VARRAY(5) OF INTEGER; 
   names namesarray; 
   marks grades; 
   total integer; 
BEGIN 
   names := namesarray('Kavita', 'Pritam', 'Ayan', 'Rishav', 'Aziz'); 
   marks:= grades(98, 97, 78, 87, 92); 
   total := names.count; 
   dbms_output.put_line('Total '|| total || ' Students'); 
   FOR i in 1 .. total LOOP 
      dbms_output.put_line('Student: ' || names(i) || ' 
      Marks: ' || marks(i)); 
   END LOOP; 
END; 
/

Wenn der obige Code an der SQL-Eingabeaufforderung ausgeführt wird, wird das folgende Ergebnis ausgegeben:

Total 5 Students 
Student: Kavita  Marks: 98 
Student: Pritam  Marks: 97 
Student: Ayan  Marks: 78 
Student: Rishav  Marks: 87 
Student: Aziz  Marks: 92 

PL/SQL procedure successfully completed.

Please note - -

  • In der Oracle-Umgebung ist der Startindex für Varrays immer 1.

  • Sie können die Varray-Elemente mit der Konstruktormethode des Varray-Typs initialisieren, die denselben Namen wie das Varray hat.

  • Varrays sind eindimensionale Arrays.

  • Ein Varray ist beim Deklarieren automatisch NULL und muss initialisiert werden, bevor auf seine Elemente verwiesen werden kann.

Beispiel 2

Elemente eines Varrays können auch% ROWTYPE einer beliebigen Datenbanktabelle oder% TYPE eines beliebigen Datenbanktabellenfelds sein. Das folgende Beispiel veranschaulicht das Konzept.

Wir verwenden die in unserer Datenbank gespeicherte Tabelle CUSTOMERS als -

Select * from customers;  

+----+----------+-----+-----------+----------+ 
| ID | NAME     | AGE | ADDRESS   | SALARY   | 
+----+----------+-----+-----------+----------+ 
|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 | 
|  2 | Khilan   |  25 | Delhi     |  1500.00 | 
|  3 | kaushik  |  23 | Kota      |  2000.00 | 
|  4 | Chaitali |  25 | Mumbai    |  6500.00 | 
|  5 | Hardik   |  27 | Bhopal    |  8500.00 | 
|  6 | Komal    |  22 | MP        |  4500.00 | 
+----+----------+-----+-----------+----------+

Das folgende Beispiel verwendet cursor, die Sie in einem separaten Kapitel ausführlich behandeln werden.

DECLARE 
   CURSOR c_customers is 
   SELECT  name FROM customers; 
   type c_list is varray (6) of customers.name%type; 
   name_list c_list := c_list(); 
   counter integer :=0; 
BEGIN 
   FOR n IN c_customers LOOP 
      counter := counter + 1; 
      name_list.extend; 
      name_list(counter)  := n.name; 
      dbms_output.put_line('Customer('||counter ||'):'||name_list(counter)); 
   END LOOP; 
END; 
/

Wenn der obige Code an der SQL-Eingabeaufforderung ausgeführt wird, wird das folgende Ergebnis ausgegeben:

Customer(1): Ramesh  
Customer(2): Khilan  
Customer(3): kaushik     
Customer(4): Chaitali  
Customer(5): Hardik  
Customer(6): Komal  

PL/SQL procedure successfully completed.

In diesem Kapitel werden Prozeduren in PL / SQL erläutert. EINsubprogramist eine Programmeinheit / ein Programmmodul, das bzw. das eine bestimmte Aufgabe ausführt. Diese Unterprogramme werden zu größeren Programmen zusammengefasst. Dies wird im Grunde als "modularer Aufbau" bezeichnet. Ein Unterprogramm kann von einem anderen Unterprogramm oder Programm aufgerufen werden, das als bezeichnet wirdcalling program.

Ein Unterprogramm kann erstellt werden -

  • Auf Schemaebene
  • In einem Paket
  • Innerhalb eines PL / SQL-Blocks

Auf der Schemaebene ist das Unterprogramm a standalone subprogram. Es wird mit der Anweisung CREATE PROCEDURE oder CREATE FUNCTION erstellt. Es wird in der Datenbank gespeichert und kann mit der Anweisung DROP PROCEDURE oder DROP FUNCTION gelöscht werden.

Ein in einem Paket erstelltes Unterprogramm ist a packaged subprogram. Es wird in der Datenbank gespeichert und kann nur gelöscht werden, wenn das Paket mit der Anweisung DROP PACKAGE gelöscht wird. Wir werden Pakete in diesem Kapitel besprechen'PL/SQL - Packages'.

PL / SQL-Unterprogramme werden als PL / SQL-Blöcke bezeichnet, die mit einer Reihe von Parametern aufgerufen werden können. PL / SQL bietet zwei Arten von Unterprogrammen:

  • Functions- Diese Unterprogramme geben einen einzelnen Wert zurück. Wird hauptsächlich zum Berechnen und Zurückgeben eines Werts verwendet.

  • Procedures- Diese Unterprogramme geben keinen Wert direkt zurück; hauptsächlich verwendet, um eine Aktion auszuführen.

Dieses Kapitel behandelt wichtige Aspekte von a PL/SQL procedure. Wir werden diskutierenPL/SQL function im nächsten Kapitel.

Teile eines PL / SQL-Unterprogramms

Jedes PL / SQL-Unterprogramm hat einen Namen und kann auch eine Parameterliste haben. Wie anonyme PL / SQL-Blöcke bestehen auch die genannten Blöcke aus den folgenden drei Teilen:

S.No. Teile & Beschreibung
1

Declarative Part

Es ist ein optionales Teil. Der deklarative Teil für ein Unterprogramm beginnt jedoch nicht mit dem Schlüsselwort DECLARE. Es enthält Deklarationen von Typen, Cursorn, Konstanten, Variablen, Ausnahmen und verschachtelten Unterprogrammen. Diese Elemente sind lokal für das Unterprogramm und hören auf zu existieren, wenn das Unterprogramm die Ausführung abgeschlossen hat.

2

Executable Part

Dies ist ein obligatorischer Teil und enthält Anweisungen, die die angegebene Aktion ausführen.

3

Exception-handling

Dies ist wieder ein optionaler Teil. Es enthält den Code, der Laufzeitfehler behandelt.

Prozedur erstellen

Eine Prozedur wird mit dem erstellt CREATE OR REPLACE PROCEDUREErklärung. Die vereinfachte Syntax für die Anweisung CREATE OR REPLACE PROCEDURE lautet wie folgt:

CREATE [OR REPLACE] PROCEDURE procedure_name 
[(parameter_name [IN | OUT | IN OUT] type [, ...])] 
{IS | AS} 
BEGIN 
  < procedure_body > 
END procedure_name;

Wo,

  • Prozedurname gibt den Namen der Prozedur an.

  • Mit der Option [ODER ERSETZEN] können Sie eine vorhandene Prozedur ändern.

  • Die optionale Parameterliste enthält Name, Modus und Typ der Parameter. IN stellt den Wert dar, der von außen übergeben wird, und OUT stellt den Parameter dar, der verwendet wird, um einen Wert außerhalb der Prozedur zurückzugeben.

  • Der Prozedurkörper enthält den ausführbaren Teil.

  • Das AS-Schlüsselwort wird anstelle des IS-Schlüsselworts zum Erstellen einer eigenständigen Prozedur verwendet.

Beispiel

Im folgenden Beispiel wird eine einfache Prozedur erstellt, in der die Zeichenfolge "Hallo Welt!" Angezeigt wird. auf dem Bildschirm, wenn ausgeführt.

CREATE OR REPLACE PROCEDURE greetings 
AS 
BEGIN 
   dbms_output.put_line('Hello World!'); 
END; 
/

Wenn der obige Code über die SQL-Eingabeaufforderung ausgeführt wird, wird das folgende Ergebnis angezeigt:

Procedure created.

Ausführen einer eigenständigen Prozedur

Eine eigenständige Prozedur kann auf zwei Arten aufgerufen werden:

  • Verwendung der EXECUTE Stichwort

  • Aufrufen des Namens der Prozedur aus einem PL / SQL-Block

Das oben genannte Verfahren wird benannt 'greetings' kann mit dem Schlüsselwort EXECUTE als - aufgerufen werden

EXECUTE greetings;

Der obige Aufruf wird angezeigt -

Hello World

PL/SQL procedure successfully completed.

Die Prozedur kann auch von einem anderen PL / SQL-Block aufgerufen werden -

BEGIN 
   greetings; 
END; 
/

Der obige Aufruf wird angezeigt -

Hello World  

PL/SQL procedure successfully completed.

Löschen einer eigenständigen Prozedur

Eine eigenständige Prozedur wird mit dem gelöscht DROP PROCEDUREErklärung. Die Syntax zum Löschen einer Prozedur lautet -

DROP PROCEDURE procedure-name;

Sie können die Begrüßungsprozedur mit der folgenden Anweisung löschen:

DROP PROCEDURE greetings;

Parametermodi in PL / SQL-Unterprogrammen

In der folgenden Tabelle sind die Parametermodi in PL / SQL-Unterprogrammen aufgeführt.

S.No. Parametermodus & Beschreibung
1

IN

Mit einem IN-Parameter können Sie einen Wert an das Unterprogramm übergeben. It is a read-only parameter. Innerhalb des Unterprogramms wirkt ein IN-Parameter wie eine Konstante. Es kann kein Wert zugewiesen werden. Sie können eine Konstante, ein Literal, eine initialisierte Variable oder einen Ausdruck als IN-Parameter übergeben. Sie können es auch auf einen Standardwert initialisieren. In diesem Fall wird es jedoch im Unterprogrammaufruf weggelassen.It is the default mode of parameter passing. Parameters are passed by reference.

2

OUT

Ein OUT-Parameter gibt einen Wert an das aufrufende Programm zurück. Innerhalb des Unterprogramms verhält sich ein OUT-Parameter wie eine Variable. Sie können den Wert ändern und auf den Wert verweisen, nachdem Sie ihn zugewiesen haben.The actual parameter must be variable and it is passed by value.

3

IN OUT

Ein IN OUTDer Parameter übergibt einen Anfangswert an ein Unterprogramm und gibt einen aktualisierten Wert an den Aufrufer zurück. Es kann ein Wert zugewiesen und der Wert gelesen werden.

Der tatsächliche Parameter, der einem IN OUT-Formalparameter entspricht, muss eine Variable sein, keine Konstante oder ein Ausdruck. Dem formalen Parameter muss ein Wert zugewiesen werden.Actual parameter is passed by value.

Beispiel 1 für den IN & OUT-Modus

Dieses Programm findet das Minimum von zwei Werten. Hier nimmt die Prozedur zwei Zahlen im IN-Modus und gibt ihr Minimum unter Verwendung der OUT-Parameter zurück.

DECLARE 
   a number; 
   b number; 
   c number;
PROCEDURE findMin(x IN number, y IN number, z OUT number) IS 
BEGIN 
   IF x < y THEN 
      z:= x; 
   ELSE 
      z:= y; 
   END IF; 
END;   
BEGIN 
   a:= 23; 
   b:= 45; 
   findMin(a, b, c); 
   dbms_output.put_line(' Minimum of (23, 45) : ' || c); 
END; 
/

Wenn der obige Code an der SQL-Eingabeaufforderung ausgeführt wird, wird das folgende Ergebnis ausgegeben:

Minimum of (23, 45) : 23  

PL/SQL procedure successfully completed.

Beispiel 2 für den IN & OUT-Modus

Diese Prozedur berechnet das Wertquadrat eines übergebenen Werts. Dieses Beispiel zeigt, wie wir denselben Parameter verwenden können, um einen Wert zu akzeptieren und dann ein anderes Ergebnis zurückzugeben.

DECLARE 
   a number; 
PROCEDURE squareNum(x IN OUT number) IS 
BEGIN 
  x := x * x; 
END;  
BEGIN 
   a:= 23; 
   squareNum(a); 
   dbms_output.put_line(' Square of (23): ' || a); 
END; 
/

Wenn der obige Code an der SQL-Eingabeaufforderung ausgeführt wird, wird das folgende Ergebnis ausgegeben:

Square of (23): 529 

PL/SQL procedure successfully completed.

Methoden zum Übergeben von Parametern

Die tatsächlichen Parameter können auf drei Arten übergeben werden:

  • Positionsnotation
  • Benannte Notation
  • Gemischte Notation

Positionsnotation

In Positionsnotation können Sie die Prozedur als - aufrufen

findMin(a, b, c, d);

In der Positionsnotation wird der erste formale Parameter durch den ersten tatsächlichen Parameter ersetzt. Der zweite Aktualparameter wird durch den zweiten Aktualparameter ersetzt und so weiter. Damit,a wird ersetzt x, b wird ersetzt y, c wird ersetzt z und d wird ersetzt m.

Benannte Notation

In der benannten Notation wird der Aktualparameter mit dem Formalparameter unter Verwendung der verknüpft arrow symbol ( => ). Der Prozeduraufruf sieht wie folgt aus:

findMin(x => a, y => b, z => c, m => d);

Gemischte Notation

In gemischter Notation können Sie beide Notationen im Prozeduraufruf mischen. Die Positionsnotation sollte jedoch vor der benannten Notation stehen.

Der folgende Aufruf ist legal -

findMin(a, b, c, m => d);

Dies ist jedoch nicht legal:

findMin(x => a, b, c, d);

In diesem Kapitel werden die Funktionen in PL / SQL erläutert. Eine Funktion ist mit einer Prozedur identisch, gibt jedoch einen Wert zurück. Daher gelten alle Diskussionen des vorherigen Kapitels auch für Funktionen.

Eine Funktion erstellen

Eine eigenständige Funktion wird mit dem erstellt CREATE FUNCTIONErklärung. Die vereinfachte Syntax für dieCREATE OR REPLACE PROCEDURE Aussage ist wie folgt -

CREATE [OR REPLACE] FUNCTION function_name 
[(parameter_name [IN | OUT | IN OUT] type [, ...])] 
RETURN return_datatype 
{IS | AS} 
BEGIN 
   < function_body > 
END [function_name];

Wo,

  • Funktionsname gibt den Namen der Funktion an.

  • Mit der Option [ODER ERSETZEN] können Sie eine vorhandene Funktion ändern.

  • Die optionale Parameterliste enthält Name, Modus und Typ der Parameter. IN stellt den Wert dar, der von außen übergeben wird, und OUT stellt den Parameter dar, mit dem ein Wert außerhalb der Prozedur zurückgegeben wird.

  • Die Funktion muss a enthalten return Erklärung.

  • Die RETURN- Klausel gibt den Datentyp an, den Sie von der Funktion zurückgeben möchten.

  • Funktionskörper enthält den ausführbaren Teil.

  • Das AS-Schlüsselwort wird anstelle des IS-Schlüsselworts zum Erstellen einer eigenständigen Funktion verwendet.

Beispiel

Das folgende Beispiel zeigt, wie Sie eine eigenständige Funktion erstellen und aufrufen. Diese Funktion gibt die Gesamtzahl der KUNDEN in der Kundentabelle zurück.

Wir werden die Tabelle CUSTOMERS verwenden, die wir im Kapitel PL / SQL-Variablen erstellt haben.

Select * from customers; 
 
+----+----------+-----+-----------+----------+ 
| ID | NAME     | AGE | ADDRESS   | SALARY   | 
+----+----------+-----+-----------+----------+ 
|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 | 
|  2 | Khilan   |  25 | Delhi     |  1500.00 | 
|  3 | kaushik  |  23 | Kota      |  2000.00 | 
|  4 | Chaitali |  25 | Mumbai    |  6500.00 | 
|  5 | Hardik   |  27 | Bhopal    |  8500.00 | 
|  6 | Komal    |  22 | MP        |  4500.00 | 
+----+----------+-----+-----------+----------+
CREATE OR REPLACE FUNCTION totalCustomers 
RETURN number IS 
   total number(2) := 0; 
BEGIN 
   SELECT count(*) into total 
   FROM customers; 
    
   RETURN total; 
END; 
/

Wenn der obige Code über die SQL-Eingabeaufforderung ausgeführt wird, wird das folgende Ergebnis angezeigt:

Function created.

Eine Funktion aufrufen

Beim Erstellen einer Funktion definieren Sie, was die Funktion zu tun hat. Um eine Funktion zu verwenden, müssen Sie diese Funktion aufrufen, um die definierte Aufgabe auszuführen. Wenn ein Programm eine Funktion aufruft, wird die Programmsteuerung auf die aufgerufene Funktion übertragen.

Eine aufgerufene Funktion führt die definierte Aufgabe aus und wann ihre return-Anweisung ausgeführt wird oder wann die last end statement erreicht ist, kehrt die Programmsteuerung zum Hauptprogramm zurück.

Um eine Funktion aufzurufen, müssen Sie lediglich die erforderlichen Parameter zusammen mit dem Funktionsnamen übergeben. Wenn die Funktion einen Wert zurückgibt, können Sie den zurückgegebenen Wert speichern. Das folgende Programm ruft die Funktion auftotalCustomers aus einem anonymen Block -

DECLARE 
   c number(2); 
BEGIN 
   c := totalCustomers(); 
   dbms_output.put_line('Total no. of Customers: ' || c); 
END; 
/

Wenn der obige Code an der SQL-Eingabeaufforderung ausgeführt wird, wird das folgende Ergebnis ausgegeben:

Total no. of Customers: 6  

PL/SQL procedure successfully completed.

Beispiel

Das folgende Beispiel zeigt das Deklarieren, Definieren und Aufrufen einer einfachen PL / SQL-Funktion, die das Maximum von zwei Werten berechnet und zurückgibt.

DECLARE 
   a number; 
   b number; 
   c number; 
FUNCTION findMax(x IN number, y IN number)  
RETURN number 
IS 
    z number; 
BEGIN 
   IF x > y THEN 
      z:= x; 
   ELSE 
      Z:= y; 
   END IF;  
   RETURN z; 
END; 
BEGIN 
   a:= 23; 
   b:= 45;  
   c := findMax(a, b); 
   dbms_output.put_line(' Maximum of (23,45): ' || c); 
END; 
/

Wenn der obige Code an der SQL-Eingabeaufforderung ausgeführt wird, wird das folgende Ergebnis ausgegeben:

Maximum of (23,45): 45   

PL/SQL procedure successfully completed.

PL / SQL-rekursive Funktionen

Wir haben gesehen, dass ein Programm oder Unterprogramm ein anderes Unterprogramm aufrufen kann. Wenn sich ein Unterprogramm selbst aufruft, wird es als rekursiver Aufruf bezeichnet und der Prozess wird als bezeichnetrecursion.

Um das Konzept zu veranschaulichen, berechnen wir die Fakultät einer Zahl. Faktor einer Zahl n ist definiert als -

n! = n*(n-1)! 
   = n*(n-1)*(n-2)! 
      ... 
   = n*(n-1)*(n-2)*(n-3)... 1

Das folgende Programm berechnet die Fakultät einer bestimmten Zahl, indem es sich rekursiv aufruft -

DECLARE 
   num number; 
   factorial number;  
   
FUNCTION fact(x number) 
RETURN number  
IS 
   f number; 
BEGIN 
   IF x=0 THEN 
      f := 1; 
   ELSE 
      f := x * fact(x-1); 
   END IF; 
RETURN f; 
END;  

BEGIN 
   num:= 6; 
   factorial := fact(num); 
   dbms_output.put_line(' Factorial '|| num || ' is ' || factorial); 
END; 
/

Wenn der obige Code an der SQL-Eingabeaufforderung ausgeführt wird, wird das folgende Ergebnis ausgegeben:

Factorial 6 is 720 
  
PL/SQL procedure successfully completed.

In diesem Kapitel werden die Cursor in PL / SQL erläutert. Oracle erstellt einen Speicherbereich, den so genannten Kontextbereich, für die Verarbeitung einer SQL-Anweisung, der alle für die Verarbeitung der Anweisung erforderlichen Informationen enthält. Zum Beispiel die Anzahl der verarbeiteten Zeilen usw.

EIN cursorist ein Zeiger auf diesen Kontextbereich. PL / SQL steuert den Kontextbereich über einen Cursor. Ein Cursor enthält die Zeilen (eine oder mehrere), die von einer SQL-Anweisung zurückgegeben werden. Der Satz von Zeilen, den der Cursor enthält, wird als bezeichnetactive set.

Sie können einen Cursor so benennen, dass in einem Programm auf ihn verwiesen werden kann, um die von der SQL-Anweisung zurückgegebenen Zeilen einzeln abzurufen und zu verarbeiten. Es gibt zwei Arten von Cursorn -

  • Implizite Cursor
  • Explizite Cursor

Implizite Cursor

Implizite Cursor werden von Oracle automatisch erstellt, wenn eine SQL-Anweisung ausgeführt wird, wenn kein expliziter Cursor für die Anweisung vorhanden ist. Programmierer können die impliziten Cursor und die darin enthaltenen Informationen nicht steuern.

Immer wenn eine DML-Anweisung (INSERT, UPDATE und DELETE) ausgegeben wird, ist dieser Anweisung ein impliziter Cursor zugeordnet. Bei INSERT-Operationen enthält der Cursor die Daten, die eingefügt werden müssen. Bei UPDATE- und DELETE-Operationen identifiziert der Cursor die Zeilen, die betroffen wären.

In PL / SQL können Sie den neuesten impliziten Cursor als den bezeichnen SQL cursor, die immer Attribute wie hat %FOUND, %ISOPEN, %NOTFOUND, und %ROWCOUNT. Der SQL-Cursor verfügt über zusätzliche Attribute:%BULK_ROWCOUNT und %BULK_EXCEPTIONS, zur Verwendung mit dem FORALLErklärung. Die folgende Tabelle enthält die Beschreibung der am häufigsten verwendeten Attribute -

S.No. Attribut & Beschreibung
1

%FOUND

Gibt TRUE zurück, wenn eine INSERT-, UPDATE- oder DELETE-Anweisung eine oder mehrere Zeilen betroffen hat oder eine SELECT INTO-Anweisung eine oder mehrere Zeilen zurückgegeben hat. Andernfalls wird FALSE zurückgegeben.

2

%NOTFOUND

Das logische Gegenteil von% FOUND. Es gibt TRUE zurück, wenn eine INSERT-, UPDATE- oder DELETE-Anweisung keine Zeilen beeinflusst hat oder eine SELECT INTO-Anweisung keine Zeilen zurückgegeben hat. Andernfalls wird FALSE zurückgegeben.

3

%ISOPEN

Gibt für implizite Cursor immer FALSE zurück, da Oracle den SQL-Cursor nach Ausführung der zugehörigen SQL-Anweisung automatisch schließt.

4

%ROWCOUNT

Gibt die Anzahl der Zeilen zurück, die von einer INSERT-, UPDATE- oder DELETE-Anweisung betroffen sind oder von einer SELECT INTO-Anweisung zurückgegeben werden.

Auf jedes SQL-Cursorattribut wird als zugegriffen sql%attribute_name wie unten im Beispiel gezeigt.

Beispiel

Wir werden die CUSTOMERS-Tabelle verwenden, die wir in den vorherigen Kapiteln erstellt und verwendet haben.

Select * from customers;  

+----+----------+-----+-----------+----------+ 
| ID | NAME     | AGE | ADDRESS   | SALARY   | 
+----+----------+-----+-----------+----------+ 
|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 | 
|  2 | Khilan   |  25 | Delhi     |  1500.00 | 
|  3 | kaushik  |  23 | Kota      |  2000.00 | 
|  4 | Chaitali |  25 | Mumbai    |  6500.00 | 
|  5 | Hardik   |  27 | Bhopal    |  8500.00 | 
|  6 | Komal    |  22 | MP        |  4500.00 | 
+----+----------+-----+-----------+----------+

Das folgende Programm aktualisiert die Tabelle und erhöht das Gehalt jedes Kunden um 500 und verwendet die SQL%ROWCOUNT Attribut zur Bestimmung der Anzahl der betroffenen Zeilen -

DECLARE  
   total_rows number(2); 
BEGIN 
   UPDATE customers 
   SET salary = salary + 500; 
   IF sql%notfound THEN 
      dbms_output.put_line('no customers selected'); 
   ELSIF sql%found THEN 
      total_rows := sql%rowcount;
      dbms_output.put_line( total_rows || ' customers selected '); 
   END IF;  
END; 
/

Wenn der obige Code an der SQL-Eingabeaufforderung ausgeführt wird, wird das folgende Ergebnis ausgegeben:

6 customers selected  

PL/SQL procedure successfully completed.

Wenn Sie die Datensätze in der Kundentabelle überprüfen, werden Sie feststellen, dass die Zeilen aktualisiert wurden -

Select * from customers;  

+----+----------+-----+-----------+----------+ 
| ID | NAME     | AGE | ADDRESS   | SALARY   | 
+----+----------+-----+-----------+----------+ 
|  1 | Ramesh   |  32 | Ahmedabad |  2500.00 | 
|  2 | Khilan   |  25 | Delhi     |  2000.00 | 
|  3 | kaushik  |  23 | Kota      |  2500.00 | 
|  4 | Chaitali |  25 | Mumbai    |  7000.00 | 
|  5 | Hardik   |  27 | Bhopal    |  9000.00 | 
|  6 | Komal    |  22 | MP        |  5000.00 | 
+----+----------+-----+-----------+----------+

Explizite Cursor

Explizite Cursor sind vom Programmierer definierte Cursor, um mehr Kontrolle über die zu erlangen context area. Ein expliziter Cursor sollte im Deklarationsabschnitt des PL / SQL-Blocks definiert werden. Es wird in einer SELECT-Anweisung erstellt, die mehr als eine Zeile zurückgibt.

Die Syntax zum Erstellen eines expliziten Cursors lautet -

CURSOR cursor_name IS select_statement;

Das Arbeiten mit einem expliziten Cursor umfasst die folgenden Schritte:

  • Deklarieren des Cursors zum Initialisieren des Speichers
  • Öffnen des Cursors zum Zuweisen des Speichers
  • Abrufen des Cursors zum Abrufen der Daten
  • Schließen Sie den Cursor, um den zugewiesenen Speicher freizugeben

Cursor deklarieren

Durch Deklarieren des Cursors wird der Cursor mit einem Namen und der zugehörigen SELECT-Anweisung definiert. Zum Beispiel -

CURSOR c_customers IS 
   SELECT id, name, address FROM customers;

Cursor öffnen

Durch Öffnen des Cursors wird der Speicher für den Cursor reserviert und das Abrufen der von der SQL-Anweisung zurückgegebenen Zeilen vorbereitet. Zum Beispiel öffnen wir den oben definierten Cursor wie folgt:

OPEN c_customers;

Cursor holen

Zum Abrufen des Cursors muss jeweils auf eine Zeile zugegriffen werden. Zum Beispiel werden wir Zeilen vom oben geöffneten Cursor wie folgt abrufen:

FETCH c_customers INTO c_id, c_name, c_addr;

Cursor schließen

Wenn Sie den Cursor schließen, wird der zugewiesene Speicher freigegeben. Zum Beispiel schließen wir den oben geöffneten Cursor wie folgt:

CLOSE c_customers;

Beispiel

Das folgende Beispiel veranschaulicht die Konzepte expliziter Cursor & minua;

DECLARE 
   c_id customers.id%type; 
   c_name customer.name%type; 
   c_addr customers.address%type; 
   CURSOR c_customers is 
      SELECT id, name, address FROM customers; 
BEGIN 
   OPEN c_customers; 
   LOOP 
   FETCH c_customers into c_id, c_name, c_addr; 
      EXIT WHEN c_customers%notfound; 
      dbms_output.put_line(c_id || ' ' || c_name || ' ' || c_addr); 
   END LOOP; 
   CLOSE c_customers; 
END; 
/

Wenn der obige Code an der SQL-Eingabeaufforderung ausgeführt wird, wird das folgende Ergebnis ausgegeben:

1 Ramesh Ahmedabad  
2 Khilan Delhi  
3 kaushik Kota     
4 Chaitali Mumbai  
5 Hardik Bhopal   
6 Komal MP  
  
PL/SQL procedure successfully completed.

In diesem Kapitel werden Datensätze in PL / SQL erläutert. EINrecordist eine Datenstruktur, die Datenelemente verschiedener Art enthalten kann. Datensätze bestehen aus verschiedenen Feldern, ähnlich einer Zeile einer Datenbanktabelle.

Sie möchten beispielsweise Ihre Bücher in einer Bibliothek verfolgen. Möglicherweise möchten Sie die folgenden Attribute für jedes Buch verfolgen, z. B. Titel, Autor, Betreff, Buch-ID. Ein Datensatz, der ein Feld für jedes dieser Elemente enthält, ermöglicht es, ein BUCH als logische Einheit zu behandeln und seine Informationen besser zu organisieren und darzustellen.

PL / SQL kann die folgenden Arten von Datensätzen verarbeiten:

  • Table-based
  • Cursor-basierte Datensätze
  • Benutzerdefinierte Datensätze

Tabellenbasierte Datensätze

Mit dem Attribut% ROWTYPE kann ein Programmierer erstellen table-based und cursorbased Aufzeichnungen.

Das folgende Beispiel veranschaulicht das Konzept von table-basedAufzeichnungen. Wir werden die CUSTOMERS-Tabelle verwenden, die wir in den vorherigen Kapiteln erstellt und verwendet haben -

DECLARE 
   customer_rec customers%rowtype; 
BEGIN 
   SELECT * into customer_rec 
   FROM customers 
   WHERE id = 5;  
   dbms_output.put_line('Customer ID: ' || customer_rec.id); 
   dbms_output.put_line('Customer Name: ' || customer_rec.name); 
   dbms_output.put_line('Customer Address: ' || customer_rec.address); 
   dbms_output.put_line('Customer Salary: ' || customer_rec.salary); 
END; 
/

Wenn der obige Code an der SQL-Eingabeaufforderung ausgeführt wird, wird das folgende Ergebnis ausgegeben:

Customer ID: 5 
Customer Name: Hardik 
Customer Address: Bhopal 
Customer Salary: 9000 
 
PL/SQL procedure successfully completed.

Cursor-basierte Datensätze

Das folgende Beispiel veranschaulicht das Konzept von cursor-basedAufzeichnungen. Wir werden die CUSTOMERS-Tabelle verwenden, die wir in den vorherigen Kapiteln erstellt und verwendet haben -

DECLARE 
   CURSOR customer_cur is 
      SELECT id, name, address  
      FROM customers; 
   customer_rec customer_cur%rowtype; 
BEGIN 
   OPEN customer_cur; 
   LOOP 
      FETCH customer_cur into customer_rec; 
      EXIT WHEN customer_cur%notfound; 
      DBMS_OUTPUT.put_line(customer_rec.id || ' ' || customer_rec.name); 
   END LOOP; 
END; 
/

Wenn der obige Code an der SQL-Eingabeaufforderung ausgeführt wird, wird das folgende Ergebnis ausgegeben:

1 Ramesh 
2 Khilan 
3 kaushik 
4 Chaitali 
5 Hardik 
6 Komal  

PL/SQL procedure successfully completed.

Benutzerdefinierte Datensätze

PL / SQL bietet einen benutzerdefinierten Datensatztyp, mit dem Sie die verschiedenen Datensatzstrukturen definieren können. Diese Datensätze bestehen aus verschiedenen Feldern. Angenommen, Sie möchten Ihre Bücher in einer Bibliothek verfolgen. Möglicherweise möchten Sie die folgenden Attribute für jedes Buch verfolgen:

  • Title
  • Author
  • Subject
  • Buch-ID

Datensatz definieren

Der Datensatztyp ist definiert als -

TYPE 
type_name IS RECORD 
  ( field_name1  datatype1  [NOT NULL]  [:= DEFAULT EXPRESSION], 
   field_name2   datatype2   [NOT NULL]  [:= DEFAULT EXPRESSION], 
   ... 
   field_nameN  datatypeN  [NOT NULL]  [:= DEFAULT EXPRESSION); 
record-name  type_name;

Der Buchdatensatz wird folgendermaßen deklariert:

DECLARE 
TYPE books IS RECORD 
(title  varchar(50), 
   author  varchar(50), 
   subject varchar(100), 
   book_id   number); 
book1 books; 
book2 books;

Zugriff auf Felder

Um auf ein Feld eines Datensatzes zuzugreifen, verwenden wir den Punkt (.)Operator. Der Mitgliedszugriffsoperator wird als Punkt zwischen dem Namen der Datensatzvariablen und dem Feld codiert, auf das wir zugreifen möchten. Im Folgenden finden Sie ein Beispiel zur Erläuterung der Verwendung von Datensätzen.

DECLARE 
   type books is record 
      (title varchar(50), 
      author varchar(50), 
      subject varchar(100), 
      book_id number); 
   book1 books; 
   book2 books; 
BEGIN 
   -- Book 1 specification 
   book1.title  := 'C Programming'; 
   book1.author := 'Nuha Ali ';  
   book1.subject := 'C Programming Tutorial'; 
   book1.book_id := 6495407;  
   -- Book 2 specification 
   book2.title := 'Telecom Billing'; 
   book2.author := 'Zara Ali'; 
   book2.subject := 'Telecom Billing Tutorial'; 
   book2.book_id := 6495700;  
  
  -- Print book 1 record 
   dbms_output.put_line('Book 1 title : '|| book1.title); 
   dbms_output.put_line('Book 1 author : '|| book1.author); 
   dbms_output.put_line('Book 1 subject : '|| book1.subject); 
   dbms_output.put_line('Book 1 book_id : ' || book1.book_id); 
   
   -- Print book 2 record 
   dbms_output.put_line('Book 2 title : '|| book2.title); 
   dbms_output.put_line('Book 2 author : '|| book2.author); 
   dbms_output.put_line('Book 2 subject : '|| book2.subject); 
   dbms_output.put_line('Book 2 book_id : '|| book2.book_id); 
END; 
/

Wenn der obige Code an der SQL-Eingabeaufforderung ausgeführt wird, wird das folgende Ergebnis ausgegeben:

Book 1 title : C Programming 
Book 1 author : Nuha Ali 
Book 1 subject : C Programming Tutorial 
Book 1 book_id : 6495407 
Book 2 title : Telecom Billing 
Book 2 author : Zara Ali 
Book 2 subject : Telecom Billing Tutorial 
Book 2 book_id : 6495700  

PL/SQL procedure successfully completed.

Datensätze als Unterprogrammparameter

Sie können einen Datensatz als Unterprogrammparameter übergeben, genau wie Sie eine andere Variable übergeben. Sie können auf die Datensatzfelder auch auf dieselbe Weise zugreifen wie im obigen Beispiel -

DECLARE 
   type books is record 
      (title  varchar(50), 
      author  varchar(50), 
      subject varchar(100), 
      book_id   number); 
   book1 books; 
   book2 books;  
PROCEDURE printbook (book books) IS 
BEGIN 
   dbms_output.put_line ('Book  title :  ' || book.title); 
   dbms_output.put_line('Book  author : ' || book.author); 
   dbms_output.put_line( 'Book  subject : ' || book.subject); 
   dbms_output.put_line( 'Book book_id : ' || book.book_id); 
END; 
   
BEGIN 
   -- Book 1 specification 
   book1.title  := 'C Programming'; 
   book1.author := 'Nuha Ali ';  
   book1.subject := 'C Programming Tutorial'; 
   book1.book_id := 6495407;
   
   -- Book 2 specification 
   book2.title := 'Telecom Billing'; 
   book2.author := 'Zara Ali'; 
   book2.subject := 'Telecom Billing Tutorial'; 
   book2.book_id := 6495700;  
   
   -- Use procedure to print book info 
   printbook(book1); 
   printbook(book2); 
END; 
/

Wenn der obige Code an der SQL-Eingabeaufforderung ausgeführt wird, wird das folgende Ergebnis ausgegeben:

Book  title : C Programming 
Book  author : Nuha Ali 
Book subject : C Programming Tutorial 
Book  book_id : 6495407 
Book title : Telecom Billing 
Book author : Zara Ali 
Book subject : Telecom Billing Tutorial 
Book book_id : 6495700  

PL/SQL procedure successfully completed.

In diesem Kapitel werden Ausnahmen in PL / SQL erläutert. Eine Ausnahme ist eine Fehlerbedingung während einer Programmausführung. PL / SQL unterstützt Programmierer dabei, solche Bedingungen mit zu erfassenEXCEPTIONBlock im Programm und eine entsprechende Aktion wird gegen die Fehlerbedingung ergriffen. Es gibt zwei Arten von Ausnahmen:

  • Systemdefinierte Ausnahmen
  • Benutzerdefinierte Ausnahmen

Syntax für die Ausnahmebehandlung

Die allgemeine Syntax für die Ausnahmebehandlung lautet wie folgt. Hier können Sie so viele Ausnahmen auflisten, wie Sie behandeln können. Die Standardausnahme wird mit behandeltWHEN others THEN - -

DECLARE 
   <declarations section> 
BEGIN 
   <executable command(s)> 
EXCEPTION 
   <exception handling goes here > 
   WHEN exception1 THEN  
      exception1-handling-statements  
   WHEN exception2  THEN  
      exception2-handling-statements  
   WHEN exception3 THEN  
      exception3-handling-statements 
   ........ 
   WHEN others THEN 
      exception3-handling-statements 
END;

Beispiel

Schreiben wir einen Code, um das Konzept zu veranschaulichen. Wir werden die CUSTOMERS-Tabelle verwenden, die wir in den vorherigen Kapiteln erstellt und verwendet haben -

DECLARE 
   c_id customers.id%type := 8; 
   c_name customerS.Name%type; 
   c_addr customers.address%type; 
BEGIN 
   SELECT  name, address INTO  c_name, c_addr 
   FROM customers 
   WHERE id = c_id;  
   DBMS_OUTPUT.PUT_LINE ('Name: '||  c_name); 
   DBMS_OUTPUT.PUT_LINE ('Address: ' || c_addr); 

EXCEPTION 
   WHEN no_data_found THEN 
      dbms_output.put_line('No such customer!'); 
   WHEN others THEN 
      dbms_output.put_line('Error!'); 
END; 
/

Wenn der obige Code an der SQL-Eingabeaufforderung ausgeführt wird, wird das folgende Ergebnis ausgegeben:

No such customer!  

PL/SQL procedure successfully completed.

Das obige Programm zeigt den Namen und die Adresse eines Kunden an, dessen ID angegeben ist. Da sich in unserer Datenbank kein Kunde mit dem ID-Wert 8 befindet, löst das Programm die Laufzeitausnahme ausNO_DATA_FOUND, die in der erfasst wird EXCEPTION block.

Ausnahmen auslösen

Ausnahmen werden vom Datenbankserver automatisch ausgelöst, wenn ein interner Datenbankfehler vorliegt. Ausnahmen können jedoch vom Programmierer mithilfe des Befehls explizit ausgelöst werden RAISE. Es folgt die einfache Syntax zum Auslösen einer Ausnahme:

DECLARE 
   exception_name EXCEPTION; 
BEGIN 
   IF condition THEN 
      RAISE exception_name; 
   END IF; 
EXCEPTION 
   WHEN exception_name THEN 
   statement; 
END;

Sie können die obige Syntax verwenden, um die Oracle-Standardausnahme oder eine benutzerdefinierte Ausnahme auszulösen. Im nächsten Abschnitt geben wir Ihnen ein Beispiel zum Auslösen einer benutzerdefinierten Ausnahme. Sie können die Oracle-Standardausnahmen auf ähnliche Weise auslösen.

Benutzerdefinierte Ausnahmen

Mit PL / SQL können Sie Ihre eigenen Ausnahmen entsprechend den Anforderungen Ihres Programms definieren. Eine benutzerdefinierte Ausnahme muss deklariert und dann explizit ausgelöst werden, entweder mithilfe einer RAISE-Anweisung oder der ProzedurDBMS_STANDARD.RAISE_APPLICATION_ERROR.

Die Syntax zum Deklarieren einer Ausnahme lautet -

DECLARE 
   my-exception EXCEPTION;

Beispiel

Das folgende Beispiel veranschaulicht das Konzept. Dieses Programm fragt nach einer Kunden-ID, wenn der Benutzer eine ungültige ID eingibt, die Ausnahmeinvalid_id wird angehoben.

DECLARE 
   c_id customers.id%type := &cc_id; 
   c_name customerS.Name%type; 
   c_addr customers.address%type;  
   -- user defined exception 
   ex_invalid_id  EXCEPTION; 
BEGIN 
   IF c_id <= 0 THEN 
      RAISE ex_invalid_id; 
   ELSE 
      SELECT  name, address INTO  c_name, c_addr 
      FROM customers 
      WHERE id = c_id;
      DBMS_OUTPUT.PUT_LINE ('Name: '||  c_name);  
      DBMS_OUTPUT.PUT_LINE ('Address: ' || c_addr); 
   END IF; 

EXCEPTION 
   WHEN ex_invalid_id THEN 
      dbms_output.put_line('ID must be greater than zero!'); 
   WHEN no_data_found THEN 
      dbms_output.put_line('No such customer!'); 
   WHEN others THEN 
      dbms_output.put_line('Error!');  
END; 
/

Wenn der obige Code an der SQL-Eingabeaufforderung ausgeführt wird, wird das folgende Ergebnis ausgegeben:

Enter value for cc_id: -6 (let's enter a value -6) 
old  2: c_id customers.id%type := &cc_id; 
new  2: c_id customers.id%type := -6; 
ID must be greater than zero! 
 
PL/SQL procedure successfully completed.

Vordefinierte Ausnahmen

PL / SQL bietet viele vordefinierte Ausnahmen, die ausgeführt werden, wenn eine Datenbankregel von einem Programm verletzt wird. Beispielsweise wird die vordefinierte Ausnahme NO_DATA_FOUND ausgelöst, wenn eine SELECT INTO-Anweisung keine Zeilen zurückgibt. In der folgenden Tabelle sind einige der wichtigen vordefinierten Ausnahmen aufgeführt:

Ausnahme Oracle-Fehler SQLCODE Beschreibung
ACCESS_INTO_NULL 06530 -6530 Es wird ausgelöst, wenn einem Nullobjekt automatisch ein Wert zugewiesen wird.
CASE_NOT_FOUND 06592 -6592 Es wird ausgelöst, wenn keine der Auswahlmöglichkeiten in der WHEN-Klausel einer CASE-Anweisung ausgewählt ist und keine ELSE-Klausel vorhanden ist.
COLLECTION_IS_NULL 06531 -6531 Es wird ausgelöst, wenn ein Programm versucht, andere Erfassungsmethoden als EXISTS auf eine nicht initialisierte verschachtelte Tabelle oder ein nicht initialisiertes Varray anzuwenden, oder wenn das Programm versucht, den Elementen einer nicht initialisierten verschachtelten Tabelle oder Varray Werte zuzuweisen.
DUP_VAL_ON_INDEX 00001 -1 Es wird ausgelöst, wenn versucht wird, doppelte Werte in einer Spalte mit eindeutigem Index zu speichern.
INVALID_CURSOR 01001 -1001 Es wird ausgelöst, wenn versucht wird, eine Cursoroperation auszuführen, die nicht zulässig ist, z. B. das Schließen eines ungeöffneten Cursors.
UNGÜLTIGE NUMMER 01722 -1722 Es wird ausgelöst, wenn die Konvertierung einer Zeichenfolge in eine Zahl fehlschlägt, da die Zeichenfolge keine gültige Zahl darstellt.
LOGIN_DENIED 01017 -1017 Es wird ausgelöst, wenn ein Programm versucht, sich mit einem ungültigen Benutzernamen oder Kennwort bei der Datenbank anzumelden.
KEINE DATEN GEFUNDEN 01403 +100 Es wird ausgelöst, wenn eine SELECT INTO-Anweisung keine Zeilen zurückgibt.
NOT_LOGGED_ON 01012 -1012 Es wird ausgelöst, wenn ein Datenbankaufruf ausgegeben wird, ohne mit der Datenbank verbunden zu sein.
PROGRAM_ERROR 06501 -6501 Es wird ausgelöst, wenn PL / SQL ein internes Problem hat.
ROWTYPE_MISMATCH 06504 -6504 Es wird ausgelöst, wenn ein Cursor einen Wert in einer Variablen mit inkompatiblem Datentyp abruft.
SELF_IS_NULL 30625 -30625 Es wird ausgelöst, wenn eine Mitgliedsmethode aufgerufen wird, die Instanz des Objekttyps jedoch nicht initialisiert wurde.
STORAGE_ERROR 06500 -6500 Es wird ausgelöst, wenn PL / SQL nicht genügend Speicher hat oder der Speicher beschädigt wurde.
TOO_MANY_ROWS 01422 -1422 Es wird ausgelöst, wenn eine SELECT INTO-Anweisung mehr als eine Zeile zurückgibt.
VALUE_ERROR 06502 -6502 Es wird ausgelöst, wenn ein Arithmetik-, Konvertierungs-, Kürzungs- oder Größenbeschränkungsfehler auftritt.
ZERO_DIVIDE 01476 1476 Es wird ausgelöst, wenn versucht wird, eine Zahl durch Null zu teilen.

In diesem Kapitel werden Trigger in PL / SQL erläutert. Trigger sind gespeicherte Programme, die bei bestimmten Ereignissen automatisch ausgeführt oder ausgelöst werden. Trigger werden tatsächlich so geschrieben, dass sie als Reaktion auf eines der folgenden Ereignisse ausgeführt werden:

  • EIN database manipulation (DML) Anweisung (DELETE, INSERT oder UPDATE)

  • EIN database definition (DDL) Anweisung (CREATE, ALTER oder DROP).

  • EIN database operation (SERVERERROR, LOGON, LOGOFF, STARTUP oder SHUTDOWN).

Trigger können für die Tabelle, Ansicht, das Schema oder die Datenbank definiert werden, mit denen das Ereignis verknüpft ist.

Vorteile von Triggern

Trigger können für folgende Zwecke geschrieben werden:

  • Einige abgeleitete Spaltenwerte werden automatisch generiert
  • Durchsetzen der referenziellen Integrität
  • Ereignisprotokollierung und Speichern von Informationen zum Tabellenzugriff
  • Auditing
  • Synchrone Replikation von Tabellen
  • Auferlegen von Sicherheitsberechtigungen
  • Ungültige Transaktionen verhindern

Trigger erstellen

Die Syntax zum Erstellen eines Triggers lautet -

CREATE [OR REPLACE ] TRIGGER trigger_name  
{BEFORE | AFTER | INSTEAD OF }  
{INSERT [OR] | UPDATE [OR] | DELETE}  
[OF col_name]  
ON table_name  
[REFERENCING OLD AS o NEW AS n]  
[FOR EACH ROW]  
WHEN (condition)   
DECLARE 
   Declaration-statements 
BEGIN  
   Executable-statements 
EXCEPTION 
   Exception-handling-statements 
END;

Wo,

  • CREATE [OR REPLACE] TRIGGER Triggername - Erstellt oder ersetzt einen vorhandenen Trigger durch den Triggernamen .

  • {VOR | NACH | STATT} - Dies gibt an, wann der Trigger ausgeführt wird. Die INSTEAD OF-Klausel wird zum Erstellen eines Triggers für eine Ansicht verwendet.

  • {INSERT [OR] | UPDATE [ODER] | DELETE} - Gibt die DML-Operation an.

  • [OF col_name] - Gibt den Spaltennamen an, der aktualisiert wird.

  • [ON table_name] - Gibt den Namen der Tabelle an, die dem Trigger zugeordnet ist.

  • [ALT WIE NEU WIE NEU VERWEISEN] - Hiermit können Sie neue und alte Werte für verschiedene DML-Anweisungen wie INSERT, UPDATE und DELETE referenzieren.

  • [FÜR JEDE REIHE] - Dies gibt einen Trigger auf Zeilenebene an, dh der Trigger wird für jede betroffene Zeile ausgeführt. Andernfalls wird der Trigger nur einmal ausgeführt, wenn die SQL-Anweisung ausgeführt wird, die als Trigger auf Tabellenebene bezeichnet wird.

  • WHEN (Bedingung) - Dies stellt eine Bedingung für Zeilen bereit, für die der Trigger ausgelöst werden würde. Diese Klausel gilt nur für Trigger auf Zeilenebene.

Beispiel

Zunächst verwenden wir die CUSTOMERS-Tabelle, die wir in den vorherigen Kapiteln erstellt und verwendet haben.

Select * from customers;  

+----+----------+-----+-----------+----------+ 
| ID | NAME     | AGE | ADDRESS   | SALARY   | 
+----+----------+-----+-----------+----------+ 
|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 | 
|  2 | Khilan   |  25 | Delhi     |  1500.00 | 
|  3 | kaushik  |  23 | Kota      |  2000.00 | 
|  4 | Chaitali |  25 | Mumbai    |  6500.00 | 
|  5 | Hardik   |  27 | Bhopal    |  8500.00 | 
|  6 | Komal    |  22 | MP        |  4500.00 | 
+----+----------+-----+-----------+----------+

Das folgende Programm erstellt eine row-levelAuslöser für die Kundentabelle, die für INSERT- oder UPDATE- oder DELETE-Operationen ausgelöst wird, die für die CUSTOMERS-Tabelle ausgeführt werden. Dieser Auslöser zeigt die Gehaltsdifferenz zwischen den alten und den neuen Werten an -

CREATE OR REPLACE TRIGGER display_salary_changes 
BEFORE DELETE OR INSERT OR UPDATE ON customers 
FOR EACH ROW 
WHEN (NEW.ID > 0) 
DECLARE 
   sal_diff number; 
BEGIN 
   sal_diff := :NEW.salary  - :OLD.salary; 
   dbms_output.put_line('Old salary: ' || :OLD.salary); 
   dbms_output.put_line('New salary: ' || :NEW.salary); 
   dbms_output.put_line('Salary difference: ' || sal_diff); 
END; 
/

Wenn der obige Code an der SQL-Eingabeaufforderung ausgeführt wird, wird das folgende Ergebnis ausgegeben:

Trigger created.

Die folgenden Punkte müssen hier berücksichtigt werden -

  • ALTE und NEUE Referenzen sind nicht für Trigger auf Tabellenebene verfügbar, sondern können für Trigger auf Datensatzebene verwendet werden.

  • Wenn Sie die Tabelle im selben Trigger abfragen möchten, sollten Sie das Schlüsselwort AFTER verwenden, da Trigger die Tabelle erst abfragen oder erneut ändern können, nachdem die ersten Änderungen angewendet wurden und die Tabelle wieder in einem konsistenten Zustand ist.

  • Der obige Trigger wurde so geschrieben, dass er vor jeder DELETE-, INSERT- oder UPDATE-Operation in der Tabelle ausgelöst wird. Sie können Ihren Trigger jedoch auch für eine einzelne oder mehrere Operationen schreiben, z. B. BEFORE DELETE, die bei jedem Datensatz ausgelöst werden wird mit der Operation DELETE in der Tabelle gelöscht.

Auslöser auslösen

Lassen Sie uns einige DML-Operationen für die Tabelle CUSTOMERS ausführen. Hier ist eine INSERT-Anweisung, mit der ein neuer Datensatz in der Tabelle erstellt wird:

INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) 
VALUES (7, 'Kriti', 22, 'HP', 7500.00 );

Wenn ein Datensatz in der Tabelle CUSTOMERS erstellt wird, wird der oben genannte Erstellungsauslöser: display_salary_changes wird ausgelöst und es wird das folgende Ergebnis angezeigt -

Old salary: 
New salary: 7500 
Salary difference:

Da dies ein neuer Rekord ist, ist das alte Gehalt nicht verfügbar und das obige Ergebnis ist null. Lassen Sie uns nun eine weitere DML-Operation für die Tabelle CUSTOMERS ausführen. Die UPDATE-Anweisung aktualisiert einen vorhandenen Datensatz in der Tabelle.

UPDATE customers 
SET salary = salary + 500 
WHERE id = 2;

Wenn ein Datensatz in der Tabelle CUSTOMERS aktualisiert wird, wird der oben genannte Erstellungsauslöser: display_salary_changes wird ausgelöst und es wird das folgende Ergebnis angezeigt -

Old salary: 1500 
New salary: 2000 
Salary difference: 500

In diesem Kapitel werden die Pakete in PL / SQL erläutert. Pakete sind Schemaobjekte, die logisch verwandte PL / SQL-Typen, Variablen und Unterprogramme gruppieren.

Ein Paket besteht aus zwei obligatorischen Teilen -

  • Paketspezifikation
  • Paketkörper oder Definition

Paketspezifikation

Die Spezifikation ist die Schnittstelle zum Paket. Es geradeDECLARESdie Typen, Variablen, Konstanten, Ausnahmen, Cursor und Unterprogramme, auf die von außerhalb des Pakets verwiesen werden kann. Mit anderen Worten, es enthält alle Informationen zum Inhalt des Pakets, schließt jedoch den Code für die Unterprogramme aus.

Alle in der Spezifikation platzierten Objekte werden aufgerufen publicObjekte. Jedes Unterprogramm, das nicht in der Paketspezifikation enthalten ist, sondern im Paketkörper codiert ist, wird als a bezeichnetprivate Objekt.

Das folgende Codeausschnitt zeigt eine Paketspezifikation mit einer einzelnen Prozedur. Sie können viele globale Variablen und mehrere Prozeduren oder Funktionen in einem Paket definieren.

CREATE PACKAGE cust_sal AS 
   PROCEDURE find_sal(c_id customers.id%type); 
END cust_sal; 
/

Wenn der obige Code an der SQL-Eingabeaufforderung ausgeführt wird, wird das folgende Ergebnis ausgegeben:

Package created.

Paketkörper

Der Paketkörper verfügt über die Codes für verschiedene in der Paketspezifikation deklarierte Methoden und andere private Deklarationen, die außerhalb des Pakets vor dem Code verborgen sind.

Das CREATE PACKAGE BODYDie Anweisung wird zum Erstellen des Paketkörpers verwendet. Das folgende Codeausschnitt zeigt die Paketkörperdeklaration für dascust_salPaket oben erstellt. Ich ging davon aus, dass wir bereits eine CUSTOMERS-Tabelle in unserer Datenbank erstellt haben, wie im Kapitel PL / SQL - Variablen erwähnt .

CREATE OR REPLACE PACKAGE BODY cust_sal AS  
   
   PROCEDURE find_sal(c_id customers.id%TYPE) IS 
   c_sal customers.salary%TYPE; 
   BEGIN 
      SELECT salary INTO c_sal 
      FROM customers 
      WHERE id = c_id; 
      dbms_output.put_line('Salary: '|| c_sal); 
   END find_sal; 
END cust_sal; 
/

Wenn der obige Code an der SQL-Eingabeaufforderung ausgeführt wird, wird das folgende Ergebnis ausgegeben:

Package body created.

Verwenden der Paketelemente

Auf die Paketelemente (Variablen, Prozeduren oder Funktionen) wird mit der folgenden Syntax zugegriffen:

package_name.element_name;

Bedenken Sie, dass wir das obige Paket bereits in unserem Datenbankschema erstellt haben. Das folgende Programm verwendet das find_sal Methode der cust_sal Paket -

DECLARE 
   code customers.id%type := &cc_id; 
BEGIN 
   cust_sal.find_sal(code); 
END; 
/

Wenn der obige Code an der SQL-Eingabeaufforderung ausgeführt wird, werden Sie zur Eingabe der Kunden-ID aufgefordert. Wenn Sie eine ID eingeben, wird das entsprechende Gehalt wie folgt angezeigt:

Enter value for cc_id: 1 
Salary: 3000 

PL/SQL procedure successfully completed.

Beispiel

Das folgende Programm bietet ein vollständigeres Paket. Wir werden die in unserer Datenbank gespeicherte Tabelle CUSTOMERS mit den folgenden Datensätzen verwenden:

Select * from customers;  

+----+----------+-----+-----------+----------+ 
| ID | NAME     | AGE | ADDRESS   | SALARY   | 
+----+----------+-----+-----------+----------+ 
|  1 | Ramesh   |  32 | Ahmedabad |  3000.00 | 
|  2 | Khilan   |  25 | Delhi     |  3000.00 | 
|  3 | kaushik  |  23 | Kota      |  3000.00 | 
|  4 | Chaitali |  25 | Mumbai    |  7500.00 | 
|  5 | Hardik   |  27 | Bhopal    |  9500.00 | 
|  6 | Komal    |  22 | MP        |  5500.00 | 
+----+----------+-----+-----------+----------+

Die Paketspezifikation

CREATE OR REPLACE PACKAGE c_package AS 
   -- Adds a customer 
   PROCEDURE addCustomer(c_id   customers.id%type, 
   c_name  customerS.No.ame%type, 
   c_age  customers.age%type, 
   c_addr customers.address%type,  
   c_sal  customers.salary%type); 
   
   -- Removes a customer 
   PROCEDURE delCustomer(c_id  customers.id%TYPE); 
   --Lists all customers 
   PROCEDURE listCustomer; 
  
END c_package; 
/

Wenn der obige Code an der SQL-Eingabeaufforderung ausgeführt wird, wird das obige Paket erstellt und das folgende Ergebnis angezeigt:

Package created.

Erstellen des Paketkörpers

CREATE OR REPLACE PACKAGE BODY c_package AS 
   PROCEDURE addCustomer(c_id  customers.id%type, 
      c_name customerS.No.ame%type, 
      c_age  customers.age%type, 
      c_addr  customers.address%type,  
      c_sal   customers.salary%type) 
   IS 
   BEGIN 
      INSERT INTO customers (id,name,age,address,salary) 
         VALUES(c_id, c_name, c_age, c_addr, c_sal); 
   END addCustomer; 
   
   PROCEDURE delCustomer(c_id   customers.id%type) IS 
   BEGIN 
      DELETE FROM customers 
      WHERE id = c_id; 
   END delCustomer;  
   
   PROCEDURE listCustomer IS 
   CURSOR c_customers is 
      SELECT  name FROM customers; 
   TYPE c_list is TABLE OF customers.Name%type;  
   name_list c_list := c_list(); 
   counter integer :=0; 
   BEGIN 
      FOR n IN c_customers LOOP 
      counter := counter +1; 
      name_list.extend; 
      name_list(counter) := n.name; 
      dbms_output.put_line('Customer(' ||counter|| ')'||name_list(counter)); 
      END LOOP; 
   END listCustomer;
   
END c_package; 
/

Das obige Beispiel verwendet die nested table. Wir werden das Konzept der verschachtelten Tabelle im nächsten Kapitel diskutieren.

Wenn der obige Code an der SQL-Eingabeaufforderung ausgeführt wird, wird das folgende Ergebnis ausgegeben:

Package body created.

Verwenden des Pakets

Das folgende Programm verwendet die im Paket c_package deklarierten und definierten Methoden .

DECLARE 
   code customers.id%type:= 8; 
BEGIN 
   c_package.addcustomer(7, 'Rajnish', 25, 'Chennai', 3500); 
   c_package.addcustomer(8, 'Subham', 32, 'Delhi', 7500); 
   c_package.listcustomer; 
   c_package.delcustomer(code); 
   c_package.listcustomer; 
END; 
/

Wenn der obige Code an der SQL-Eingabeaufforderung ausgeführt wird, wird das folgende Ergebnis ausgegeben:

Customer(1): Ramesh  
Customer(2): Khilan  
Customer(3): kaushik     
Customer(4): Chaitali  
Customer(5): Hardik  
Customer(6): Komal 
Customer(7): Rajnish 
Customer(8): Subham 
Customer(1): Ramesh  
Customer(2): Khilan  
Customer(3): kaushik     
Customer(4): Chaitali  
Customer(5): Hardik  
Customer(6): Komal
Customer(7): Rajnish 

PL/SQL procedure successfully completed

In diesem Kapitel werden die Sammlungen in PL / SQL erläutert. Eine Sammlung ist eine geordnete Gruppe von Elementen mit demselben Datentyp. Jedes Element wird durch einen eindeutigen Index identifiziert, der seine Position in der Sammlung darstellt.

PL / SQL bietet drei Sammlungstypen:

  • Index-by-Tabellen oder assoziatives Array
  • Verschachtelte Tabelle
  • Array mit variabler Größe oder Varray

Die Oracle-Dokumentation bietet die folgenden Merkmale für jeden Sammlungstyp:

Sammlungsart Anzahl der Elemente Indexart Dicht oder spärlich Wo erstellt Kann ein Objekttypattribut sein
Assoziatives Array (oder Index-by-Tabelle) Ungebunden Zeichenfolge oder Ganzzahl Entweder Nur im PL / SQL-Block Nein
Verschachtelte Tabelle Ungebunden Ganze Zahl Fängt dicht an, kann spärlich werden Entweder im PL / SQL-Block oder auf Schemaebene Ja
Array mit variabler Größe (Varray) Eingeschränkt Ganze Zahl Immer dicht Entweder im PL / SQL-Block oder auf Schemaebene Ja

Wir haben Varray bereits in diesem Kapitel besprochen 'PL/SQL arrays'. In diesem Kapitel werden die PL / SQL-Tabellen erläutert.

Beide Arten von PL / SQL-Tabellen, dh die Index-by-Tabellen und die verschachtelten Tabellen, haben dieselbe Struktur und auf ihre Zeilen wird mit der tiefgestellten Notation zugegriffen. Diese beiden Arten von Tabellen unterscheiden sich jedoch in einem Aspekt. Die verschachtelten Tabellen können in einer Datenbankspalte gespeichert werden und die Index-by-Tabellen nicht.

Index-By-Tabelle

Ein index-by Tabelle (auch als associative array) ist eine Menge von key-valuePaare. Jeder Schlüssel ist eindeutig und wird verwendet, um den entsprechenden Wert zu lokalisieren. Der Schlüssel kann entweder eine Ganzzahl oder eine Zeichenfolge sein.

Eine Index-by-Tabelle wird mit der folgenden Syntax erstellt. Hier schaffen wir eineindex-by Tabelle benannt table_nameDie Schlüssel sind vom Typ subscript_type und die zugehörigen Werte vom Typ element_type

TYPE type_name IS TABLE OF element_type [NOT NULL] INDEX BY subscript_type; 
 
table_name type_name;

Beispiel

Das folgende Beispiel zeigt, wie Sie eine Tabelle zum Speichern von Ganzzahlwerten zusammen mit Namen erstellen und später dieselbe Liste von Namen drucken.

DECLARE 
   TYPE salary IS TABLE OF NUMBER INDEX BY VARCHAR2(20); 
   salary_list salary; 
   name   VARCHAR2(20); 
BEGIN 
   -- adding elements to the table 
   salary_list('Rajnish') := 62000; 
   salary_list('Minakshi') := 75000; 
   salary_list('Martin') := 100000; 
   salary_list('James') := 78000;  
   
   -- printing the table 
   name := salary_list.FIRST; 
   WHILE name IS NOT null LOOP 
      dbms_output.put_line 
      ('Salary of ' || name || ' is ' || TO_CHAR(salary_list(name))); 
      name := salary_list.NEXT(name); 
   END LOOP; 
END; 
/

Wenn der obige Code an der SQL-Eingabeaufforderung ausgeführt wird, wird das folgende Ergebnis ausgegeben:

Salary of James is 78000 
Salary of Martin is 100000 
Salary of Minakshi is 75000 
Salary of Rajnish is 62000  

PL/SQL procedure successfully completed.

Beispiel

Elemente einer Index-by-Tabelle können auch a sein %ROWTYPE einer beliebigen Datenbanktabelle oder %TYPEeines beliebigen Datenbanktabellenfeldes. Das folgende Beispiel veranschaulicht das Konzept. Wir werden die verwendenCUSTOMERS Tabelle in unserer Datenbank gespeichert als -

Select * from customers;  

+----+----------+-----+-----------+----------+ 
| ID | NAME     | AGE | ADDRESS   | SALARY   | 
+----+----------+-----+-----------+----------+ 
|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 | 
|  2 | Khilan   |  25 | Delhi     |  1500.00 | 
|  3 | kaushik  |  23 | Kota      |  2000.00 | 
|  4 | Chaitali |  25 | Mumbai    |  6500.00 | 
|  5 | Hardik   |  27 | Bhopal    |  8500.00 | 
|  6 | Komal    |  22 | MP        |  4500.00 | 
+----+----------+-----+-----------+----------+

DECLARE 
   CURSOR c_customers is 
      select name from customers; 

   TYPE c_list IS TABLE of customers.Name%type INDEX BY binary_integer; 
   name_list c_list; 
   counter integer :=0; 
BEGIN 
   FOR n IN c_customers LOOP 
      counter := counter +1; 
      name_list(counter) := n.name; 
      dbms_output.put_line('Customer('||counter||'):'||name_lis t(counter)); 
   END LOOP; 
END; 
/

Wenn der obige Code an der SQL-Eingabeaufforderung ausgeführt wird, wird das folgende Ergebnis ausgegeben:

Customer(1): Ramesh  
Customer(2): Khilan  
Customer(3): kaushik     
Customer(4): Chaitali  
Customer(5): Hardik  
Customer(6): Komal  

PL/SQL procedure successfully completed

Verschachtelte Tabellen

EIN nested tableist wie ein eindimensionales Array mit einer beliebigen Anzahl von Elementen. Eine verschachtelte Tabelle unterscheidet sich jedoch in folgenden Aspekten von einem Array:

  • Ein Array hat eine deklarierte Anzahl von Elementen, eine verschachtelte Tabelle jedoch nicht. Die Größe einer verschachtelten Tabelle kann sich dynamisch erhöhen.

  • Ein Array ist immer dicht, dh es hat immer aufeinanderfolgende Indizes. Ein verschachteltes Array ist anfangs dicht, kann jedoch spärlich werden, wenn Elemente daraus gelöscht werden.

Eine verschachtelte Tabelle wird mit der folgenden Syntax erstellt:

TYPE type_name IS TABLE OF element_type [NOT NULL]; 
 
table_name type_name;

Diese Erklärung ähnelt der Erklärung von a index-by Tisch, aber es gibt keine INDEX BY Klausel.

Eine verschachtelte Tabelle kann in einer Datenbankspalte gespeichert werden. Es kann außerdem zur Vereinfachung von SQL-Vorgängen verwendet werden, bei denen Sie eine einspaltige Tabelle mit einer größeren Tabelle verknüpfen. Ein assoziatives Array kann nicht in der Datenbank gespeichert werden.

Beispiel

Die folgenden Beispiele veranschaulichen die Verwendung verschachtelter Tabellen -

DECLARE 
   TYPE names_table IS TABLE OF VARCHAR2(10); 
   TYPE grades IS TABLE OF INTEGER;  
   names names_table; 
   marks grades; 
   total integer; 
BEGIN 
   names := names_table('Kavita', 'Pritam', 'Ayan', 'Rishav', 'Aziz'); 
   marks:= grades(98, 97, 78, 87, 92); 
   total := names.count; 
   dbms_output.put_line('Total '|| total || ' Students'); 
   FOR i IN 1 .. total LOOP 
      dbms_output.put_line('Student:'||names(i)||', Marks:' || marks(i)); 
   end loop; 
END; 
/

Wenn der obige Code an der SQL-Eingabeaufforderung ausgeführt wird, wird das folgende Ergebnis ausgegeben:

Total 5 Students 
Student:Kavita, Marks:98 
Student:Pritam, Marks:97 
Student:Ayan, Marks:78 
Student:Rishav, Marks:87 
Student:Aziz, Marks:92  

PL/SQL procedure successfully completed.

Beispiel

Elemente von a nested table kann auch ein sein %ROWTYPEeiner beliebigen Datenbanktabelle oder% TYPE eines beliebigen Datenbanktabellenfeldes. Das folgende Beispiel veranschaulicht das Konzept. Wir verwenden die in unserer Datenbank gespeicherte Tabelle CUSTOMERS als -

Select * from customers;  

+----+----------+-----+-----------+----------+ 
| ID | NAME     | AGE | ADDRESS   | SALARY   | 
+----+----------+-----+-----------+----------+ 
|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 | 
|  2 | Khilan   |  25 | Delhi     |  1500.00 | 
|  3 | kaushik  |  23 | Kota      |  2000.00 | 
|  4 | Chaitali |  25 | Mumbai    |  6500.00 | 
|  5 | Hardik   |  27 | Bhopal    |  8500.00 | 
|  6 | Komal    |  22 | MP        |  4500.00 | 
+----+----------+-----+-----------+----------+

DECLARE 
   CURSOR c_customers is  
      SELECT  name FROM customers;  
   TYPE c_list IS TABLE of customerS.No.ame%type; 
   name_list c_list := c_list(); 
   counter integer :=0; 
BEGIN 
   FOR n IN c_customers LOOP 
      counter := counter +1; 
      name_list.extend; 
      name_list(counter)  := n.name; 
      dbms_output.put_line('Customer('||counter||'):'||name_list(counter)); 
   END LOOP; 
END; 
/

Wenn der obige Code an der SQL-Eingabeaufforderung ausgeführt wird, wird das folgende Ergebnis ausgegeben:

Customer(1): Ramesh  
Customer(2): Khilan  
Customer(3): kaushik     
Customer(4): Chaitali  
Customer(5): Hardik  
Customer(6): Komal  

PL/SQL procedure successfully completed.

Sammelmethoden

PL / SQL bietet die integrierten Erfassungsmethoden, die die Verwendung von Sammlungen vereinfachen. In der folgenden Tabelle sind die Methoden und ihr Zweck aufgeführt:

S.No. Methodenname & Zweck
1

EXISTS(n)

Gibt TRUE zurück, wenn das n-te Element in einer Sammlung vorhanden ist. Andernfalls wird FALSE zurückgegeben.

2

COUNT

Gibt die Anzahl der Elemente zurück, die eine Sammlung derzeit enthält.

3

LIMIT

Überprüft die maximale Größe einer Sammlung.

4

FIRST

Gibt die ersten (kleinsten) Indexnummern in einer Sammlung zurück, die die ganzzahligen Indizes verwendet.

5

LAST

Gibt die letzten (größten) Indexnummern in einer Sammlung zurück, die die ganzzahligen Indizes verwendet.

6

PRIOR(n)

Gibt die Indexnummer vor dem Index n in einer Sammlung zurück.

7

NEXT(n)

Gibt die Indexnummer zurück, die auf Index n folgt.

8

EXTEND

Hängt ein Nullelement an eine Sammlung an.

9

EXTEND(n)

Hängt n Nullelemente an eine Sammlung an.

10

EXTEND(n,i)

Hängt an nKopien des i- ten Elements zu einer Sammlung.

11

TRIM

Entfernt ein Element vom Ende einer Sammlung.

12

TRIM(n)

Entfernt n Elemente aus dem Ende einer Sammlung.

13

DELETE

Entfernt alle Elemente aus einer Sammlung und setzt COUNT auf 0.

14

DELETE(n)

Entfernt die nthElement aus einem assoziativen Array mit einem numerischen Schlüssel oder einer verschachtelten Tabelle. Wenn das assoziative Array einen Zeichenfolgenschlüssel hat, wird das dem Schlüsselwert entsprechende Element gelöscht. Wennn ist Null, DELETE(n) tut nichts.

15

DELETE(m,n)

Entfernt alle Elemente im Bereich m..naus einem assoziativen Array oder einer verschachtelten Tabelle. Wennm ist größer als n oder wenn m oder n ist Null, DELETE(m,n) tut nichts.

Sammlungsausnahmen

Die folgende Tabelle enthält die Sammlungsausnahmen und wann sie ausgelöst werden -

Sammlungsausnahme In Situationen aufgewachsen
COLLECTION_IS_NULL Sie versuchen, eine atomar null Sammlung zu bearbeiten.
KEINE DATEN GEFUNDEN Ein Index bezeichnet ein Element, das gelöscht wurde, oder ein nicht vorhandenes Element eines assoziativen Arrays.
SUBSCRIPT_BEYOND_COUNT Ein Index überschreitet die Anzahl der Elemente in einer Sammlung.
SUBSCRIPT_OUTSIDE_LIMIT Ein Index liegt außerhalb des zulässigen Bereichs.
VALUE_ERROR Ein Index ist null oder nicht in den Schlüsseltyp konvertierbar. Diese Ausnahme kann auftreten, wenn der Schlüssel als definiert istPLS_INTEGER Bereich, und der Index liegt außerhalb dieses Bereichs.

In diesem Kapitel werden die Transaktionen in PL / SQL erläutert. Eine Datenbanktransactionist eine atomare Arbeitseinheit, die aus einer oder mehreren verwandten SQL-Anweisungen bestehen kann. Es wird als atomar bezeichnet, da die durch die SQL-Anweisungen, die eine Transaktion darstellen, vorgenommenen Datenbankänderungen gemeinsam entweder festgeschrieben, dh dauerhaft in der Datenbank gespeichert oder aus der Datenbank zurückgesetzt (rückgängig gemacht) werden können.

Eine erfolgreich ausgeführte SQL-Anweisung und eine festgeschriebene Transaktion sind nicht identisch. Selbst wenn eine SQL-Anweisung erfolgreich ausgeführt wird, kann sie rückgängig gemacht werden, sofern die Transaktion, die die Anweisung enthält, nicht festgeschrieben wird, und alle von den Anweisungen vorgenommenen Änderungen können rückgängig gemacht werden.

Starten und Beenden einer Transaktion

Eine Transaktion hat eine beginning und ein end. Eine Transaktion beginnt, wenn eines der folgenden Ereignisse stattfindet:

  • Die erste SQL-Anweisung wird ausgeführt, nachdem eine Verbindung zur Datenbank hergestellt wurde.

  • Bei jeder neuen SQL-Anweisung, die nach Abschluss einer Transaktion ausgegeben wird.

Eine Transaktion endet, wenn eines der folgenden Ereignisse stattfindet:

  • EIN COMMIT oder ein ROLLBACK Erklärung wird ausgegeben.

  • EIN DDL Aussage, wie z CREATE TABLEErklärung, wird ausgestellt; denn in diesem Fall wird automatisch ein COMMIT ausgeführt.

  • EIN DCL Aussage, wie a GRANTErklärung, wird ausgestellt; denn in diesem Fall wird automatisch ein COMMIT ausgeführt.

  • Benutzer trennt sich von der Datenbank.

  • Benutzer beendet von SQL*PLUS durch die Ausgabe der EXIT Befehl wird automatisch ein COMMIT ausgeführt.

  • SQL * Plus wird abnormal beendet, a ROLLBACK wird automatisch durchgeführt.

  • EIN DMLAnweisung schlägt fehl; In diesem Fall wird automatisch ein ROLLBACK ausgeführt, um diese DML-Anweisung rückgängig zu machen.

Festschreiben einer Transaktion

Eine Transaktion wird durch Ausgabe des SQL-Befehls COMMIT permanent gemacht. Die allgemeine Syntax für den Befehl COMMIT lautet -

COMMIT;

Zum Beispiel,

INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) 
VALUES (1, 'Ramesh', 32, 'Ahmedabad', 2000.00 ); 

INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) 
VALUES (2, 'Khilan', 25, 'Delhi', 1500.00 ); 

INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) 
VALUES (3, 'kaushik', 23, 'Kota', 2000.00 ); 

INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) 
VALUES (4, 'Chaitali', 25, 'Mumbai', 6500.00 ); 

INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) 
VALUES (5, 'Hardik', 27, 'Bhopal', 8500.00 ); 

INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) 
VALUES (6, 'Komal', 22, 'MP', 4500.00 ); 

COMMIT;

Rollback von Transaktionen

Änderungen, die ohne COMMIT an der Datenbank vorgenommen wurden, können mit dem Befehl ROLLBACK rückgängig gemacht werden.

Die allgemeine Syntax für den Befehl ROLLBACK lautet -

ROLLBACK [TO SAVEPOINT < savepoint_name>];

Wenn eine Transaktion aufgrund einer beispiellosen Situation wie einem Systemausfall abgebrochen wird, wird die gesamte Transaktion seit einem Commit automatisch zurückgesetzt. Wenn Sie nicht verwendensavepointVerwenden Sie dann einfach die folgende Anweisung, um alle Änderungen rückgängig zu machen:

ROLLBACK;

Sicherungspunkte

Sicherungspunkte sind eine Art Markierung, mit deren Hilfe eine lange Transaktion in kleinere Einheiten aufgeteilt werden kann, indem einige Prüfpunkte festgelegt werden. Durch Festlegen von Sicherungspunkten innerhalb einer langen Transaktion können Sie bei Bedarf einen Rollback auf einen Prüfpunkt durchführen. Dies erfolgt durch Ausgabe desSAVEPOINT Befehl.

Die allgemeine Syntax für den Befehl SAVEPOINT lautet -

SAVEPOINT < savepoint_name >;

Zum Beispiel

INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) 
VALUES (7, 'Rajnish', 27, 'HP', 9500.00 ); 

INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) 
VALUES (8, 'Riddhi', 21, 'WB', 4500.00 ); 
SAVEPOINT sav1;
  
UPDATE CUSTOMERS 
SET SALARY = SALARY + 1000; 
ROLLBACK TO sav1;
  
UPDATE CUSTOMERS 
SET SALARY = SALARY + 1000 
WHERE ID = 7; 
UPDATE CUSTOMERS 
SET SALARY = SALARY + 1000 
WHERE ID = 8; 

COMMIT;

ROLLBACK TO sav1 - Diese Anweisung setzt alle Änderungen bis zu dem Punkt zurück, an dem Sie savepoint sav1 markiert haben.

Danach beginnen die neuen Änderungen, die Sie vornehmen.

Automatische Transaktionssteuerung

Um a COMMIT automatisch wann immer ein INSERT, UPDATE oder DELETE Befehl ausgeführt wird, können Sie die einstellen AUTOCOMMIT Umgebungsvariable als -

SET AUTOCOMMIT ON;

Sie können den Auto-Commit-Modus mit dem folgenden Befehl deaktivieren:

SET AUTOCOMMIT OFF;

In diesem Kapitel werden Datum und Uhrzeit in PL / SQL erläutert. In PL / SQL gibt es zwei Klassen von datums- und zeitbezogenen Datentypen:

  • Datetime-Datentypen
  • Intervalldatentypen

Die Datetime-Datentypen sind -

  • DATE
  • TIMESTAMP
  • Zeitstempel mit Zeitzone
  • Zeitstempel mit lokaler Zeitzone

Die Intervalldatentypen sind -

  • INTERVALL JAHR BIS MONAT
  • Intervalltag bis zum zweiten

Feldwerte für Datetime- und Intervalldatentypen

Beide datetime und interval Datentypen bestehen aus fields. Die Werte dieser Felder bestimmen den Wert des Datentyps. In der folgenden Tabelle sind die Felder und ihre möglichen Werte für Datenzeiten und Intervalle aufgeführt.

Feldname Gültige Datetime-Werte Gültige Intervallwerte
JAHR -4712 bis 9999 (ohne Jahr 0) Beliebige Ganzzahl ungleich Null
MONAT 01 bis 12 0 bis 11
TAG 01 bis 31 (begrenzt durch die Werte von MONAT und JAHR gemäß den Regeln des Kalenders für das Gebietsschema) Beliebige Ganzzahl ungleich Null
STUNDE 00 bis 23 0 bis 23
MINUTE 00 bis 59 0 bis 59
ZWEITE

00 bis 59,9 (n), wobei 9 (n) die Genauigkeit der Zeitbruchsekunden ist

Der 9 (n) -Teil gilt nicht für DATE.

0 bis 59,9 (n), wobei 9 (n) die Genauigkeit der Intervallbruchsekunden ist
TIMEZONE_HOUR

-12 bis 14 (Bereich berücksichtigt Änderungen der Sommerzeit)

Gilt nicht für DATE oder TIMESTAMP.

Unzutreffend
TIMEZONE_MINUTE

00 bis 59

Gilt nicht für DATE oder TIMESTAMP.

Unzutreffend
TIMEZONE_REGION Gilt nicht für DATE oder TIMESTAMP. Unzutreffend
TIMEZONE_ABBR Gilt nicht für DATE oder TIMESTAMP. Unzutreffend

Die Datetime-Datentypen und -Funktionen

Im Folgenden sind die Datetime-Datentypen aufgeführt:

DATUM

Es speichert Datums- und Uhrzeitinformationen sowohl in Zeichen- als auch in Zahlendatentypen. Es besteht aus Informationen zu Jahrhundert, Jahr, Monat, Datum, Stunde, Minute und Sekunde. Es wird angegeben als -

TIMESTAMP

Es ist eine Erweiterung des Datentyps DATE. Es speichert das Jahr, den Monat und den Tag des Datentyps DATE sowie die Werte für Stunde, Minute und Sekunde. Es ist nützlich, um genaue Zeitwerte zu speichern.

Zeitstempel mit Zeitzone

Es handelt sich um eine Variante von TIMESTAMP, deren Wert einen Zeitzonenregionsnamen oder einen Zeitzonenversatz enthält. Der Zeitzonenversatz ist die Differenz (in Stunden und Minuten) zwischen Ortszeit und UTC. Dieser Datentyp ist nützlich zum Sammeln und Auswerten von Datumsinformationen in verschiedenen geografischen Regionen.

Zeitstempel mit lokaler Zeitzone

Es ist eine andere Variante von TIMESTAMP, deren Wert einen Zeitzonenversatz enthält.

Die folgende Tabelle enthält die Datetime-Funktionen (wobei x den Datetime-Wert hat) -

S.No. Funktionsname & Beschreibung
1

ADD_MONTHS(x, y);

Fügt hinzu y Monate bis x.

2

LAST_DAY(x);

Gibt den letzten Tag des Monats zurück.

3

MONTHS_BETWEEN(x, y);

Gibt die Anzahl der Monate zwischen zurück x und y.

4

NEXT_DAY(x, day);

Gibt die Datums- und Uhrzeitangabe des nächsten Tages zurückx.

5

NEW_TIME;

Gibt den Zeit- / Tageswert aus einer vom Benutzer angegebenen Zeitzone zurück.

6

ROUND(x [, unit]);

Runden x.

7

SYSDATE();

Gibt die aktuelle Datum / Uhrzeit zurück.

8

TRUNC(x [, unit]);

Abschneidet x.

Zeitstempelfunktionen (wobei x einen Zeitstempelwert hat) -

S.No. Funktionsname & Beschreibung
1

CURRENT_TIMESTAMP();

Gibt einen TIMESTAMP WITH TIME ZONE zurück, der die aktuelle Sitzungszeit zusammen mit der Sitzungszeitzone enthält.

2

EXTRACT({ YEAR | MONTH | DAY | HOUR | MINUTE | SECOND } | { TIMEZONE_HOUR | TIMEZONE_MINUTE } | { TIMEZONE_REGION | } TIMEZONE_ABBR ) FROM x)

Extrahiert und gibt ein Jahr, einen Monat, einen Tag, eine Stunde, eine Minute, eine Sekunde oder eine Zeitzone aus zurück x.

3

FROM_TZ(x, time_zone);

Konvertiert den TIMESTAMP x und die durch time_zone angegebene Zeitzone in einen TIMESTAMP WITH TIMEZONE.

4

LOCALTIMESTAMP();

Gibt einen TIMESTAMP zurück, der die Ortszeit in der Sitzungszeitzone enthält.

5

SYSTIMESTAMP();

Gibt einen TIMESTAMP WITH TIME ZONE zurück, der die aktuelle Datenbankzeit zusammen mit der Datenbankzeitzone enthält.

6

SYS_EXTRACT_UTC(x);

Konvertiert den TIMESTAMP WITH TIMEZONE x in einen TIMESTAMP, der Datum und Uhrzeit in UTC enthält.

7

TO_TIMESTAMP(x, [format]);

Konvertiert die Zeichenfolge x in einen TIMESTAMP.

8

TO_TIMESTAMP_TZ(x, [format]);

Konvertiert den String x in einen TIMESTAMP WITH TIMEZONE.

Beispiele

Die folgenden Codeausschnitte veranschaulichen die Verwendung der oben genannten Funktionen:

Example 1

SELECT SYSDATE FROM DUAL;

Output - -

08/31/2012 5:25:34 PM

Example 2

SELECT TO_CHAR(CURRENT_DATE, 'DD-MM-YYYY HH:MI:SS') FROM DUAL;

Output - -

31-08-2012 05:26:14

Example 3

SELECT ADD_MONTHS(SYSDATE, 5) FROM DUAL;

Output - -

01/31/2013 5:26:31 PM

Example 4

SELECT LOCALTIMESTAMP FROM DUAL;

Output - -

8/31/2012 5:26:55.347000 PM

Die Intervalldatentypen und -funktionen

Im Folgenden sind die Intervalldatentypen aufgeführt:

  • IINTERVALES JAHR BIS MONAT - Speichert einen Zeitraum mithilfe der Datums- / Uhrzeitfelder JAHR und MONAT.

  • INTERVALLTAG ZUM ZWEITEN - Es wird ein Zeitraum in Tagen, Stunden, Minuten und Sekunden gespeichert.

Intervallfunktionen

S.No. Funktionsname & Beschreibung
1

NUMTODSINTERVAL(x, interval_unit);

Konvertiert die Zahl x in einen INTERVALLTAG IN ZWEITEN.

2

NUMTOYMINTERVAL(x, interval_unit);

Konvertiert die Zahl x in ein INTERVALLJAHR IN MONAT.

3

TO_DSINTERVAL(x);

Konvertiert die Zeichenfolge x in einen INTERVALLTAG IN ZWEITEN.

4

TO_YMINTERVAL(x);

Konvertiert die Zeichenfolge x in ein INTERVALLJAHR IN MONAT.

In diesem Kapitel werden wir die DBMS-Ausgabe in PL / SQL diskutieren. DasDBMS_OUTPUTist ein integriertes Paket, mit dem Sie Ausgaben anzeigen, Informationen debuggen und Nachrichten von PL / SQL-Blöcken, Unterprogrammen, Paketen und Triggern senden können. Wir haben dieses Paket bereits in unserem Tutorial verwendet.

Schauen wir uns ein kleines Code-Snippet an, das alle Benutzertabellen in der Datenbank anzeigt. Versuchen Sie es in Ihrer Datenbank, um alle Tabellennamen aufzulisten -

BEGIN 
   dbms_output.put_line  (user || ' Tables in the database:'); 
   FOR t IN (SELECT table_name FROM user_tables) 
   LOOP 
      dbms_output.put_line(t.table_name); 
   END LOOP; 
END; 
/

DBMS_OUTPUT-Unterprogramme

Das DBMS_OUTPUT-Paket enthält die folgenden Unterprogramme:

S.No. Unterprogramm & Zweck
1

DBMS_OUTPUT.DISABLE;

Deaktiviert die Nachrichtenausgabe.

2

DBMS_OUTPUT.ENABLE(buffer_size IN INTEGER DEFAULT 20000);

Aktiviert die Nachrichtenausgabe. Ein NULL-Wert vonbuffer_size steht für unbegrenzte Puffergröße.

3

DBMS_OUTPUT.GET_LINE (line OUT VARCHAR2, status OUT INTEGER);

Ruft eine einzelne Zeile gepufferter Informationen ab.

4

DBMS_OUTPUT.GET_LINES (lines OUT CHARARR, numlines IN OUT INTEGER);

Ruft ein Array von Zeilen aus dem Puffer ab.

5

DBMS_OUTPUT.NEW_LINE;

Setzt eine Zeilenende-Markierung.

6

DBMS_OUTPUT.PUT(item IN VARCHAR2);

Platziert eine Teilzeile im Puffer.

7

DBMS_OUTPUT.PUT_LINE(item IN VARCHAR2);

Platziert eine Zeile im Puffer.

Beispiel

DECLARE 
   lines dbms_output.chararr; 
   num_lines number; 
BEGIN 
   -- enable the buffer with default size 20000 
   dbms_output.enable; 
   
   dbms_output.put_line('Hello Reader!'); 
   dbms_output.put_line('Hope you have enjoyed the tutorials!'); 
   dbms_output.put_line('Have a great time exploring pl/sql!'); 
  
   num_lines := 3; 
  
   dbms_output.get_lines(lines, num_lines); 
  
   FOR i IN 1..num_lines LOOP 
      dbms_output.put_line(lines(i)); 
   END LOOP; 
END; 
/

Wenn der obige Code an der SQL-Eingabeaufforderung ausgeführt wird, wird das folgende Ergebnis ausgegeben:

Hello Reader! 
Hope you have enjoyed the tutorials! 
Have a great time exploring pl/sql!  

PL/SQL procedure successfully completed.

In diesem Kapitel werden wir objektorientiertes PL / SQL diskutieren. Mit PL / SQL können Sie einen Objekttyp definieren, der beim Entwerfen einer objektorientierten Datenbank in Oracle hilfreich ist. Mit einem Objekttyp können Sie zusammengesetzte Typen erstellen. Durch die Verwendung von Objekten können Sie reale Objekte mit einer bestimmten Datenstruktur und Methoden für deren Betrieb implementieren. Objekte haben Attribute und Methoden. Attribute sind Eigenschaften eines Objekts und werden zum Speichern des Status eines Objekts verwendet. und Methoden werden zur Modellierung seines Verhaltens verwendet.

Objekte werden mit der Anweisung CREATE [OR REPLACE] TYPE erstellt. Im Folgenden finden Sie ein Beispiel zum Erstellen eines einfachenaddress Objekt bestehend aus wenigen Attributen -

CREATE OR REPLACE TYPE address AS OBJECT 
(house_no varchar2(10), 
 street varchar2(30), 
 city varchar2(20), 
 state varchar2(10), 
 pincode varchar2(10) 
); 
/

Wenn der obige Code an der SQL-Eingabeaufforderung ausgeführt wird, wird das folgende Ergebnis ausgegeben:

Type created.

Lassen Sie uns noch ein Objekt erstellen customer wo wir wickeln werden attributes und methods zusammen ein objektorientiertes Gefühl zu haben -

CREATE OR REPLACE TYPE customer AS OBJECT 
(code number(5), 
 name varchar2(30), 
 contact_no varchar2(12), 
 addr address, 
 member procedure display 
); 
/

Wenn der obige Code an der SQL-Eingabeaufforderung ausgeführt wird, wird das folgende Ergebnis ausgegeben:

Type created.

Ein Objekt instanziieren

Das Definieren eines Objekttyps liefert eine Blaupause für das Objekt. Um dieses Objekt zu verwenden, müssen Sie Instanzen dieses Objekts erstellen. Sie können auf die Attribute und Methoden des Objekts mit dem Instanznamen und zugreifenthe access operator (.) wie folgt -

DECLARE 
   residence address; 
BEGIN 
   residence := address('103A', 'M.G.Road', 'Jaipur', 'Rajasthan','201301'); 
   dbms_output.put_line('House No: '|| residence.house_no); 
   dbms_output.put_line('Street: '|| residence.street); 
   dbms_output.put_line('City: '|| residence.city); 
   dbms_output.put_line('State: '|| residence.state); 
   dbms_output.put_line('Pincode: '|| residence.pincode); 
END; 
/

Wenn der obige Code an der SQL-Eingabeaufforderung ausgeführt wird, wird das folgende Ergebnis ausgegeben:

House No: 103A 
Street: M.G.Road 
City: Jaipur 
State: Rajasthan 
Pincode: 201301  

PL/SQL procedure successfully completed.

Mitgliedsmethoden

Member methods werden zur Manipulation der verwendet attributesdes Objekts. Sie geben die Deklaration einer Mitgliedsmethode an, während Sie den Objekttyp deklarieren. Der Objektkörper definiert den Code für die Elementmethoden. Der Objektkörper wird mit der Anweisung CREATE TYPE BODY erstellt.

Constructorssind Funktionen, die ein neues Objekt als Wert zurückgeben. Jedes Objekt verfügt über eine systemdefinierte Konstruktormethode. Der Name des Konstruktors entspricht dem Objekttyp. Zum Beispiel -

residence := address('103A', 'M.G.Road', 'Jaipur', 'Rajasthan','201301');

Das comparison methodswerden zum Vergleichen von Objekten verwendet. Es gibt zwei Möglichkeiten, Objekte zu vergleichen:

Kartenmethode

Das Map methodist eine Funktion, die so implementiert ist, dass ihr Wert vom Wert der Attribute abhängt. Wenn beispielsweise für ein Kundenobjekt der Kundencode für zwei Kunden gleich ist, können beide Kunden gleich sein. Die Beziehung zwischen diesen beiden Objekten würde also vom Wert des Codes abhängen.

Bestellmethode

Das Order methodimplementiert eine interne Logik zum Vergleichen von zwei Objekten. Beispielsweise ist für ein Rechteckobjekt ein Rechteck größer als ein anderes Rechteck, wenn beide Seiten größer sind.

Verwenden der Kartenmethode

Versuchen wir, die obigen Konzepte anhand des folgenden Rechteckobjekts zu verstehen:

CREATE OR REPLACE TYPE rectangle AS OBJECT 
(length number, 
 width number, 
 member function enlarge( inc number) return rectangle, 
 member procedure display, 
 map member function measure return number 
); 
/

Wenn der obige Code an der SQL-Eingabeaufforderung ausgeführt wird, wird das folgende Ergebnis ausgegeben:

Type created.

Erstellen des Typkörpers -

CREATE OR REPLACE TYPE BODY rectangle AS 
   MEMBER FUNCTION enlarge(inc number) return rectangle IS 
   BEGIN 
      return rectangle(self.length + inc, self.width + inc); 
   END enlarge;  
   MEMBER PROCEDURE display IS 
   BEGIN  
      dbms_output.put_line('Length: '|| length); 
      dbms_output.put_line('Width: '|| width); 
   END display;  
   MAP MEMBER FUNCTION measure return number IS 
   BEGIN 
      return (sqrt(length*length + width*width)); 
   END measure; 
END; 
/

Wenn der obige Code an der SQL-Eingabeaufforderung ausgeführt wird, wird das folgende Ergebnis ausgegeben:

Type body created.

Verwenden Sie nun das Rechteckobjekt und seine Elementfunktionen -

DECLARE 
   r1 rectangle; 
   r2 rectangle; 
   r3 rectangle; 
   inc_factor number := 5; 
BEGIN 
   r1 := rectangle(3, 4); 
   r2 := rectangle(5, 7); 
   r3 := r1.enlarge(inc_factor); 
   r3.display;  
   IF (r1 > r2) THEN -- calling measure function 
      r1.display; 
   ELSE 
      r2.display; 
   END IF; 
END; 
/

Wenn der obige Code an der SQL-Eingabeaufforderung ausgeführt wird, wird das folgende Ergebnis ausgegeben:

Length: 8 
Width: 9 
Length: 5 
Width: 7  

PL/SQL procedure successfully completed.

Verwenden der Bestellmethode

Jetzt die same effect could be achieved using an order method. Lassen Sie uns das Rechteckobjekt mit einer Bestellmethode neu erstellen -

CREATE OR REPLACE TYPE rectangle AS OBJECT 
(length number, 
 width number, 
 member procedure display, 
 order member function measure(r rectangle) return number 
); 
/

Wenn der obige Code an der SQL-Eingabeaufforderung ausgeführt wird, wird das folgende Ergebnis ausgegeben:

Type created.

Erstellen des Typkörpers -

CREATE OR REPLACE TYPE BODY rectangle AS 
   MEMBER PROCEDURE display IS 
   BEGIN 
      dbms_output.put_line('Length: '|| length); 
      dbms_output.put_line('Width: '|| width); 
   END display;  
   ORDER MEMBER FUNCTION measure(r rectangle) return number IS 
   BEGIN 
      IF(sqrt(self.length*self.length + self.width*self.width)> 
         sqrt(r.length*r.length + r.width*r.width)) then 
         return(1); 
      ELSE 
         return(-1); 
      END IF; 
   END measure; 
END; 
/

Wenn der obige Code an der SQL-Eingabeaufforderung ausgeführt wird, wird das folgende Ergebnis ausgegeben:

Type body created.

Verwenden des Rechteckobjekts und seiner Elementfunktionen -

DECLARE 
   r1 rectangle; 
   r2 rectangle; 
BEGIN 
   r1 := rectangle(23, 44); 
   r2 := rectangle(15, 17); 
   r1.display; 
   r2.display; 
   IF (r1 > r2) THEN -- calling measure function 
      r1.display; 
   ELSE 
      r2.display; 
   END IF; 
END; 
/

Wenn der obige Code an der SQL-Eingabeaufforderung ausgeführt wird, wird das folgende Ergebnis ausgegeben:

Length: 23 
Width: 44 
Length: 15 
Width: 17 
Length: 23 
Width: 44 

PL/SQL procedure successfully completed.

Vererbung für PL / SQL-Objekte

PL / SQL ermöglicht das Erstellen von Objekten aus den vorhandenen Basisobjekten. Um die Vererbung zu implementieren, sollten die Basisobjekte als deklariert werdenNOT FINAL. Der Standardwert istFINAL.

Die folgenden Programme veranschaulichen die Vererbung in PL / SQL-Objekten. Lassen Sie uns ein anderes Objekt mit dem Namen erstellenTableTopwird dies vom Rechteck-Objekt geerbt. Dazu müssen wir die Basis schaffen Rechteck Objekt -

CREATE OR REPLACE TYPE rectangle AS OBJECT 
(length number, 
 width number, 
 member function enlarge( inc number) return rectangle, 
 NOT FINAL member procedure display) NOT FINAL 
/

Wenn der obige Code an der SQL-Eingabeaufforderung ausgeführt wird, wird das folgende Ergebnis ausgegeben:

Type created.

Erstellen des Basistypkörpers -

CREATE OR REPLACE TYPE BODY rectangle AS 
   MEMBER FUNCTION enlarge(inc number) return rectangle IS 
   BEGIN 
      return rectangle(self.length + inc, self.width + inc); 
   END enlarge;  
   MEMBER PROCEDURE display IS 
   BEGIN 
      dbms_output.put_line('Length: '|| length); 
      dbms_output.put_line('Width: '|| width); 
   END display; 
END; 
/

Wenn der obige Code an der SQL-Eingabeaufforderung ausgeführt wird, wird das folgende Ergebnis ausgegeben:

Type body created.

Erstellen der untergeordneten Objekt tabletop -

CREATE OR REPLACE TYPE tabletop UNDER rectangle 
(   
   material varchar2(20), 
   OVERRIDING member procedure display 
) 
/

Wenn der obige Code an der SQL-Eingabeaufforderung ausgeführt wird, wird das folgende Ergebnis ausgegeben:

Type created.

Erstellen des Typs Körper für das Kind Objekt Tisch

CREATE OR REPLACE TYPE BODY tabletop AS 
OVERRIDING MEMBER PROCEDURE display IS 
BEGIN 
   dbms_output.put_line('Length: '|| length); 
   dbms_output.put_line('Width: '|| width); 
   dbms_output.put_line('Material: '|| material); 
END display; 
/

Wenn der obige Code an der SQL-Eingabeaufforderung ausgeführt wird, wird das folgende Ergebnis ausgegeben:

Type body created.

Verwenden des Tabletop- Objekts und seiner Elementfunktionen -

DECLARE 
   t1 tabletop; 
   t2 tabletop; 
BEGIN 
   t1:= tabletop(20, 10, 'Wood'); 
   t2 := tabletop(50, 30, 'Steel'); 
   t1.display; 
   t2.display; 
END;
/

Wenn der obige Code an der SQL-Eingabeaufforderung ausgeführt wird, wird das folgende Ergebnis ausgegeben:

Length: 20 
Width: 10 
Material: Wood 
Length: 50 
Width: 30 
Material: Steel  

PL/SQL procedure successfully completed.

Abstrakte Objekte in PL / SQL

Das NOT INSTANTIABLEMit dieser Klausel können Sie ein abstraktes Objekt deklarieren. Sie können ein abstraktes Objekt nicht so verwenden, wie es ist. Sie müssen einen Subtyp oder einen untergeordneten Typ solcher Objekte erstellen, um deren Funktionen nutzen zu können.

Zum Beispiel,

CREATE OR REPLACE TYPE rectangle AS OBJECT 
(length number, 
 width number, 
 NOT INSTANTIABLE NOT FINAL MEMBER PROCEDURE display)  
 NOT INSTANTIABLE NOT FINAL 
/

Wenn der obige Code an der SQL-Eingabeaufforderung ausgeführt wird, wird das folgende Ergebnis ausgegeben:

Type created.