Title: PLSQL EDB Fragenkatalog

PLSQL EDB Fragenkatalog

Feedback shared by this category's questions, if right: Die Antwort ist richtig.
Feedback shared by this category's questions, if partly right: Die Antwort ist teilweise richtig.
Feedback shared by this category's questions, if wrong: Die Antwort ist falsch.

Q: Frage 864
In welcher Reihenfolge erscheinen die folgenden Komponenten eines PL/SQL-Cursors? Tragen Sie die Zahlen 1-4 ein!
OPEN [...]
CLOSE [...]
FETCH [...]
DECLARE [...]
A: 2; 4; 3; 1
Feedback: DECLARE: Als erstes wird der CURSOR im Deklarationsteil des PL/SQL-Blocksdefiniert, das heißt, er bekommt einen Namen und eine SELECT-Anweisung, diebeliebig komplex sein kann. Eine INTO-Klausel ist weder erlaubt noch notwendig.Damit verbunden ist intern das Anlegen eines benannten Zwischenspeicherbereichsfür die Aufnahme der Ergebnismenge. Alle weiteren Schritte werden imAusführungsteil durchgeführt. OPEN: Beim Öffnen eines CURSOR wird die zugehörige SELECT-Anfrage an das Datenbankmanagementsystem geschickt und dort ausgewertet. Von dort wird die Ergebnismenge in den benannten Speicherbereich geladen, was heißt, dass während der gesamten Zeit der CURSOR-Verarbeitung die Ergebnisdatenmenge unverändert bleibt. Nach der OPEN-Anweisung parallel von anderen Transaktionen durchgeführte Manipulationen haben keinen Einfluss mehr auf die Ergebnisdaten, die ja bereits als Kopie im Zwischenspeicherbereich vorliegen. FETCH: In PL/SQL ist ein Zeiger (CURSOR) nach dem Öffnen sofort auf den ersten Datensatz dieser Ergebnismenge positioniert, so dass mit einer FETCH-Anweisung dieser Satz aus dem benannten Speicherbereich in die lokalen PL/SQL-Variablen hinein ausgelesen werden kann. Als zusätzliche Funktion positioniert die FETCH-Anweisung den Zeiger auch noch auf den nächsten Datensatz im Zwischenspeicher. CLOSE: War der letzte FETCH nicht erfolgreich, d.h., sind die lokalen Variablen leer, dann heißt dass, dass alle Datensätze abgearbeitet sind und die Schleife verlassen werden kann. Beim Schließen des CURSOR wird der damit verbundene Zwischenspeicherbereich wieder freigegeben.

Q: Frage 865
Welches Cursor-Attribut liefert die Gesamtanzahl der bisher gelesenen Zeilen?
Das ist [...]
A: %ROWCOUNT
Feedback: Ein Cursor hat folgende Attribute: %ISOPEN Boolesches Attribut, das TRUE ist, wenn der CURSOR geöffnet ist %NOTFOUND Boolesches Attribut, das TRUE ist, wenn die letzte FETCH-Anweisung keine Zeile mehr liefert %FOUND Gegenteil von %NOTFOUND %ROWCOUNT Gesamtanzahl der bisher gelesenen Zeilen

Q: Frage 867
Womit fragt man ab, ob die Fetch-Anweisung schon die letzte Zeile eines Cursors erreicht hat?
Mit dem Cursor-Attribut [...]
A: %NOTFOUND
Feedback: Ein Cursor hat folgende Attribute: %ISOPEN Boolesches Attribut, das TRUE ist, wenn der CURSOR geöffnet ist %NOTFOUND Boolesches Attribut, das TRUE ist, wenn die letzte FETCH-Anweisung keine Zeile mehr liefert %FOUND Gegenteil von %NOTFOUND %ROWCOUNT Gesamtanzahl der bisher gelesenen Zeilen

Q: Frage 869
Welche EXCEPTION wird unter PL/SQL geworfen, wenn ein SELECT kein Ergebnis liefert?
Das ist: [...]
A: NO_DATA_FOUND
Feedback: IN PL/SQL verursacht eine SELECT-Anweisung, die nicht in einem Cursor definiert ist, die EXCEPTION NO_DATA_FOUND, wenn der SELECT keine Zeilen liefert. Ausweg ist die Verwendung eines Cursors.

Q: Frage 1034
Welche Exception wird bei einem SELECT ... INTO; geworfen, wenn die Spalte einer Tabelle und eine Variable nicht den gleichen Datentyp haben?
Das ist [...]
A: ROWTYPE_MISMATCH
Feedback: ROWTYPE_MISMATCH wird in PL/SQL geworfen, wenn Spalte und Variable nicht den gleichen Datentyp haben. Mit der Angabe tabellenname%ROWTYPE für den Datentyp erhält die Variable denselben Datentyp wie er in der Tabelle tabellenname definiert ist.

Q: Frage 1046
Mit welchem PL/SQL-Paket können LOB-Werte bearbeitet werden?
Das ist [...]
A: DBMS_LOB
Feedback: DBMS_LOB bietet Funktionen zum Bearveiten von großen Binärdatentypen, die als BLOB, CLOB und NCLOB in der Oracle-Datenbank abgespeichert sind. Dazu gehören APPEND, CLOSE, COPY ERASE, GETLENGTH , FILEOPEN und andere. Eine ausführliche Beschreibung ist in Oracle Dokumentation zu finden.

Q: Frage 1114
Mit welchem Cursor-Attribut fragt man ab, ob ein Cursor geöffnet ist?
Das ist [...]
A: %ISOPEN
Feedback: Ein Cursor hat folgende Attribute: %ISOPEN Boolesches Attribut, das TRUE ist, wenn der CURSOR geöffnet ist %NOTFOUND Boolesches Attribut, das TRUE ist, wenn die letzte FETCH-Anweisung keine Zeile mehr liefert %FOUND Gegenteil von %NOTFOUND %ROWCOUNT Gesamtanzahl der bisher gelesenen Zeilen

Q: Frage 1361
Mit welchem Befehl erteilen Sie dem Benutzer "Hugo" das Recht, die PL/SQL-Prozedur "Test" auszuführen, die ihm nicht selber gehört?
Der SQL-Befehl lautet (ohne Semikolon am Schluß) [...]
A: GRANT EXECUTE ON Test TO Hugo
Feedback: Mit dem Befehl GRANT EXECUTE ON Prozedurname TO Benutzername; können Sie unter PL/SQL Ausführungsrechte an einzelne Benutzer vergeben, mit dem Befehl GRANT EXECUTE ON Prozedurname TO PUBLIC; räumen Sie diese Ausführungsrechte allen Benutzern ein.

Q: Frage 2197
Womit kann man in PL/SQL einen Record definieren, dessen Datentyp sich auf eine Tabellendefinition bezieht und der bei Änderungen der Tabellendefinition entsprechend aktualisiert wird?
Das ist [...]
A: %ROWTYPE
Feedback: Mit Tabellenname%ROWTYPeE wird die Attributstruktur einer Tabelle komplett übertragen, mit Tabellenname.Spaltenname%TYPE nur die Spaltendefinition einer einzigen Spalte der Tabelle.

Q: Frage 2198
Womit kann man in PL/SQL eine Variable definieren, deren Datentyp sich auf eine einzelne Spaltendefinition bezieht und die bei Änderungen der Tabellendefinition entsprechend aktualisiert wird?
Das ist [...]
A: %TYPE
Feedback: Mit Tabellenname%ROWTYPE wird die Attributstruktur einer Tabelle komplett übertragen, mit Tabellenname.Spaltenname%TYPE nur die Spaltendefinition einer einzigen Spalte der Tabelle.

Q: Frage 2223

Wie lautet das Ergebnis der Berechnung im folgenden PL/SQL-Block?

DECLARE
    v1 NUMBER := 5;
    v2 NUMBER := NULL;
BEGIN
    v1 := v1 + v2;
END;
v1: [...]
v2: [...]
A: NULL; NULL
Feedback: Die Summe aus einer Zahl und einem NULL-Wert ist NULL.

Q: Frage 2260
Mit welchem Befehl kann man unter PL/SQL eine Meldung anzeigen lassen und gleichzeitig das Programm fehlerhaft abbrechen lassen?
Das ist: [...]
A: RAISE_APPLICATION_ERROR
Feedback: RAISE und RAISE_APPLICATION_ERROR werfen einen Fehler, dem man eine eigene Fehlermeldung zuordnen kann. Damit wird das PL/SQL-Programm unterbrochen.

Q: Frage 2261
Welche Klausel kommt bei SELECT-Anweisungen unter PL/SQL neu hinzu?
Das ist: [...]
A: INTO
Feedback: SELECT INTO var übergibt genau einen Datensatz oder Wert an die INTO-Variable var, die nur genau einen Wert oder Datensatz aufnehmen kann.

Q: Frage 2263
Welche EXCEPTION wird geworfen, wenn eine SELECT-Anweisung unter PL/SQL mehrere Datensätze liefert?
Das ist: [...]
A: TOO_MANY_ROWS
Feedback: SELECT INTO übergibt genau einen Datensatz oder Wert an die INTO-Variable, die nur genau einen Wert oder Datensatz aufnehmen kann. Mehrere bzw. keine Datensätze als Ergebnis des SELECTS werfen die Exception TOO_MANY_ROWS bzw. NO_DATA_FOUND, wenn das Resultat des SELECTS leer ist. Eine Alternative ist die Verwendung eines Cursors, der auch mehrere Datensätze verarbeiten kann.

Q: Frage 1105
Unter PL/SQL gibt es öffentliche und private Prozeduren.
- Wahr
- Falsch
A: Wahr
Feedback: Je nach Platzierung eines Paketobjekts, wie Prozedur, Funktion, Variable, Konstante, Cursor etc., ist es entweder öffentlich oder privat. Alle Objekte, die in der Paketspezifikation deklariert sind, sind öffentlich und können damit von außerhalb des Pakets mit Paketname.Objektname aufgerufen werden. Alle Objekte, die nur im Paketrumpf definiert sind, sind privat und können damit nur innerhalb des Pakets von den Paketroutinen aufgerufen werden.

Q: Frage 1107
Wo deklariert man eine öffentliche Prozedur unter PL/SQL?
- im Package Header einer Paketdefinition
- im Package Body einer Paketdefinition
- solch einen Typ gibt es unter PL/SQL nicht
A: im Package Header einer Paketdefinition
Feedback: Je nach Platzierung eines Paketobjekts, wie Prozedur, Funktion, Variable, Konstante, Cursor etc., ist es entweder öffentlich oder privat. Alle Objekte, die in der Paketspezifikation deklariert sind, sind öffentlich und können damit von außerhalb des Pakets mit Paketname.Objektname aufgerufen werden. Alle Objekte, die nur im Paketrumpf definiert sind, sind privat und können damit nur innerhalb des Pakets von den Paketroutinen aufgerufen werden.

Q: Frage 1110
Wie viele Datensätze darf eine SELECT-Anweisung ohne CURSOR mit der INTO-Klausel unter PL/SQL liefern, ohne dass eine Exception erzeugt wird?
- keinen Datensatz
- einen Datensatz
- mehrere Datensätze
A: einen Datensatz
Feedback: SELECT INTO übergibt genau einen Datensatz oder Wert an die INTO-Variable, die nur genau einen Wert oder Datensatz aufnehmen kann. Mehrere bzw. keine Datensätze als Ergebnis des SELECTS werfen die Exception TOO_MANY_ROWS bzw. NO_DATA_FOUND, wenn das Resultat des SELECTS leer ist. Eine Alternative ist die Verwendung eines Cursors, der auch mehrere Datensätze verarbeiten kann.

Q: Frage 1117
Welche Datentypen sind unter PL/SQL erlaubt?
- DATE
- BOOLEAN
- TIMESTAMP
- TYPE ... is RECORD OF ...
- TYPE ... is TABLE OF ...
- TYPE ... is VARRAY OF ...
A: DATE; BOOLEAN; TIMESTAMP; TYPE ... is RECORD OF ...; TYPE ... is TABLE OF ...; TYPE ... is VARRAY OF ...
Feedback: PL/SQL kennt neben den SQL-Datentypen die eigenen Typen BOOLEAN, BINARY_INTEGER, PLS_INTEGER und sogenannte zusammengesetzte Datentypen , die über TYPE ... is VARRAY OF ..., TYPE ... is TABLE OF ... oder TYPE ... is RECORD OF ... definiert werden.

Q: Frage 1242
Was versteht man unter "Impendence Mismatch" ?
- Das ist der grundsätzliche Widerspruch zwischen der mengenorientierten Verarbeitung in SQL und der Einzelverarbeitung von Datensätzen in einer prozeduralen Programmiersprache.
- Das sind Erweiterungen von prozeduralen Programmiersprachen um datenbankspezifische Sprachkonstrukte.
- Diesen Begriff gibt es im Zusammenhang mit Datenbanken nicht.
A: Das ist der grundsätzliche Widerspruch zwischen der mengenorientierten Verarbeitung in SQL und der Einzelverarbeitung von Datensätzen in einer prozeduralen Programmiersprache.
Feedback: Das ist der grundsätzliche Widerspruch zwischen der mengenorientierten Verarbeitung in SQL und der Einzelverarbeitung von Datensätzen in einer prozeduralen Programmiersprache wie JAVA auftritt. Während in SQL eine mengenorienterte Verarbeitung erfolgt, bei der alle ausgewählten Tupelo gleichzeitig bearbeitet werden können, muss prozedural über Konstrukte wie Schleife (LOOP) und Cursor gearbeitet werden.

Q: Frage 1271
Welcher Code zum Aufruf einer PL/SQL-Funktion Gehaltssumme ist korrekt?
- EXECUTE :Gehaltssumme:= Gehaltssumme();
- CALL :Gehaltssumme:= Gehaltssumme();
- Gehaltssumme();
- SELECT Gehaltssumme() FROM dual;
A: EXECUTE :Gehaltssumme:= Gehaltssumme();; SELECT Gehaltssumme() FROM dual;
Feedback: call läßt sich nicht als Funktionsaufruf verwenden und Gehaltssumme(); ist falsch, da Gehaltssumme als Funktion, nicht als Prozedur, definiert ist.

Q: Frage 1363
Wo werden in PL/SQL-Packages private Methoden definiert?
- im Package-Header
- im Package-Body
A: im Package-Body
Feedback: Je nach Platzierung eines Paketobjekts, wie Prozedur, Funktion, Variable, Konstante, Cursor etc., ist es entweder öffentlich oder privat. Alle Objekte, die in der Paketspezifikation des Package-Headers deklariert sind, sind öffentlich und können damit von außerhalb des Pakets mit Paketname.Objektname aufgerufen werden. Alle Objekte, die nur im Paketrumpf des Package-Body definiert sind, sind privat und können damit nur innerhalb des Pakets von den Paketroutinen aufgerufen werden.

Q: Frage 1462
Wie überlädt man Prozeduren unter PL/SQL?
- Durch das zusätzliche Schlüßelwort "OVERLOADING" hinter "CREATE PROCEDURE" platziert.
- Gleichnamige Prozeduren werden durch eine unterschiedliche Anzahl von Parametern oder durch unterschiedliche Datentypen der Parameter unterschieden.
- überladen von Prozeduren ist unter PL/SQL nicht möglich.
A: Gleichnamige Prozeduren werden durch eine unterschiedliche Anzahl von Parametern oder durch unterschiedliche Datentypen der Parameter unterschieden.
Feedback: Ein expliziter OVELOADING-Befehl ist unter PL/SQL nicht notwendig. Gleichnamige Prozeduren werden durch eine unterschiedliche Anzahl von Parametern und/ oder durch unterschiedliche Datentypen der Parameter unterschieden.

Q: Frage 1491
Wie viele Datensätze darf unter PL/SQL ein expliziter CURSOR mit "SELECT ...INTO .." liefern, ohne dass ein Fehler ausgelöst wird?
- keinen Datensatz
- einen Datensatz
- viele Datensätze
A: einen Datensatz
Feedback: SELECT INTO übergibt genau einen Datensatz oder Wert an die INTO-Variable, die nur genau einen Wert oder Datensatz aufnehmen kann. Mehrere bzw. keine Datensätze als Ergebnis des SELECTS werfen die Exception TOO_MANY_ROWS bzw. NO_DATA_FOUND, wenn das Resultat des SELECTS leer ist. Eine Alternative ist die Verwendung eines Cursors, der auch mehrere Datensätze verarbeiten kann.

Q: Frage 1754
Welche CURSOR-Attribute sind korrekt?
- %FOUND
- %ROWTYPE
- %ISSTARTED
- %NOTFOUND
- %ISROW
- %ISOPEN
A: %FOUND; %NOTFOUND; %ISOPEN
Feedback: Ein Cursor hat folgende Attribute: %ISOPEN Boolesches Attribut, das TRUE ist, wenn der CURSOR geöffnet ist %NOTFOUND Boolesches Attribut, das TRUE ist, wenn die letzte FETCH-Anweisung keine Zeile mehr liefert %FOUND Gegenteil von %NOTFOUND %ROWCOUNT Gesamtanzahl der bisher gelesenen Zeilen

Q: Frage 1756
Welche Aussagen über PL/SQL-Programmierkonstrukte sind wahr?
- Anonyme Blöcke können beliebig geschachtelt werden.
- Für eine Funktion wird, anders als bei Prozeduren, der Datentyp eines Rückgabewertes definiert.
- Eine Funktion muss immer mit einer RETURN-Anweisung beendet werden, die den Rückgabewert zurück liefert
- Bei Prozeduren gibt es keine Möglichkeit, Werte zurückzugeben an die aufrufende Umgebung.
- Selbstprogrammierte Funktionen können in einer SELECT-Anweisung aufgerufen werden.
- In PL/SQL-Blöcken ist immer die direkte Verwendung von SQL-DML- und -DDL-Anweisungen wie SELECT, INSERT, UPDATE, DELETE bzw. CREATE, DROP, ALTER erlaubt.
- Transaktionen können innerhalb von PL/SQL-Blöcken nicht mittels Befehlen wie COMMIT und ROLLBACK gesteuert werden.
A: Anonyme Blöcke können beliebig geschachtelt werden.; Für eine Funktion wird, anders als bei Prozeduren, der Datentyp eines Rückgabewertes definiert.; Eine Funktion muss immer mit einer RETURN-Anweisung beendet werden, die den Rückgabewert zurück liefert; Selbstprogrammierte Funktionen können in einer SELECT-Anweisung aufgerufen werden.
Feedback: Prozeduren können über die Parametertypen IN OUT und OUT Werte an das aufrufende Programm zurückgeben werden.

Q: Frage 1760
Welche Aussagen über LOBs bei Oracle sind wahr?
- LOB-Datentypen werden zur Speicherung von umfangreichen, strukturierten Daten benötigt.
- LOBs können nur in der Datenbank gespeichert werden. Eine Speicherung im Dateisystem ist nicht möglich.
- Die maximale Größenbeschränkung für LOBs liegt bei 4 GB pro Datensatz.
- Mittels der SELECT-Anweisung können die Inhalte von LOB-Daten ausgelesen und angezeigt werden.
- LOBs, die in der Datenbank gespeichert werden, unterliegen dem Transaktionskonzept sowie dem Recovery.
A: Die maximale Größenbeschränkung für LOBs liegt bei 4 GB pro Datensatz.; LOBs, die in der Datenbank gespeichert werden, unterliegen dem Transaktionskonzept sowie dem Recovery.
Feedback: Für strukturierte Datentypen verwendet man keine LOBS, sondern benutzerdefinierte Typen, die mit CREATE TYPE ... angelegt werden. Eine SELECT-Anweisung an LOBS selektiert nur den LOB-Locator, nicht die eigentlichen LOB-Werte. LOBS können als BFILE auch im Dateisystem gespeichert werden.

Q: Frage 1932
Tabellenname%ROWTYPE definiert in PL/SQL einen RECORD.
- Wahr
- Falsch
A: Wahr
Feedback: Mit Tabellenname%ROWTYPE wird die Attributstruktur einer Tabelle komplett an einen PL/SQL-Rekord übertragen und dynamisch angepasst. wenn sich dien Tabellendefinition ändert. Mit Tabellenname.Spaltenname%TYPE kann man eine Variable entsprechend der Spalte einer Tabelle definieren.

Q: Frage 1978
Wie gibt man unter PL/SQL Übersetzungsfehler aus?
- keine von allen
- RAISE_APPLICATION_ERROR (.....)
- RAISE (.....)
- SHOW ERRORS
- SELECT * FROM USER_ERRORS
A: SHOW ERRORS; SELECT * FROM USER_ERRORS
Feedback: RAISE und RAISE_APPLICATION_ERROR werfen einen Fehler, dem man eine eigene Fehlermeldung zuordnen kann.

Q: Frage 2257
Mit welchem PL/SQL-Blocktyp ermittelt man immer einen Wert und gibt ihn zurück?
- Funktion
- Paket
- Anonymer Block
- Prozedur
- Trigger
A: Funktion
Feedback: PL/SQL unterscheidet vier Typen von Blöcken: Ein Anonymer Block ist ein unbenannter PL/SQL-Block, der in einer Anwendung (Prozedur, Funktion Â…) eingebettet ist oder interaktiv eingegeben wird. Eine Stored ist ein benannter PL/SQL-Block, der Parameter haben kann und als Prozedur oder Funktion definiert ist. Er wird im Datenbanksystem gespeichert und auf dem Server von der PL/SQL-Engine ausgeführt. Stored Functions geben über RETURN einen Wert an das aufrufende Programm zurück Ein PACKAGE ist ein benannter PL/SQL-Block, der logisch verwandte Prozeduren und Funktionen, Deklarationen etc. zu einer Bibliothek zusammenfasst. Ein Datenbanktrigger ist ein PL/SQL-Block, der zu einem definierten Ereignis (INSERT, UPDATE oder DELETE) automatisch vom Datenbankmanagementsystem aktiviert und ausgeführt wird.

Q: Frage 2709

Es sei eine Funktion
test_check(sp1 IN NUMBER) RETURN BOOLEAN …;
gegeben. Welche Aufrufe sind richtig?
- v_rueck := test_check(123);
- IF test_check(var_x) THEN … END IF;
- EXECUTE test_check(123);
- WHILE test_check(var_y) LOOP … ;
- SELECT test_check(sp1) FROM DUAL;
A: v_rueck := test_check(123);; IF test_check(var_x) THEN … END IF;; WHILE test_check(var_y) LOOP … ;
Feedback: Da der Rückgabewert (RETURN-Wert) vom Typ BOOLEAN ist, ist eine Verwendung innerhalb von Bedingungen z.B. von WHILE-Schleifen oder IF-Anweisungen sehr komfortabel möglich. Mit EXECUTE können Prozeduren ausgeführt werden und zwar nicht innerhalb von PL/SQL-Programmen (dort nur durch Verwendung des Prozedurnamens) sondern in Tools wie SQL-Developer. Bei Funktionen muss zusätzlich der Return-Wert verarbeitet werden. Die Anweisung "SELECT funktionsname FROM DUAL;" eignet sich hervorragend für den Aufruf von Funktionen mit nur IN-Parametern, solange für sie nicht BOOLEAN als RETURN-Wert definiert ist. Der Grund ist, im SQL-Kontext kennt Oracle leider immer noch nicht den Datentyp BOOLEAN sondern nur in PL/SQL-Programmen.

Q: Frage 2710
Es sei eine Funktion
test_check(sp1 IN NUMBER) RETURN NUMBER …;
gegeben. Welche Aufrufe sind richtig?
- WHILE ( test_check(var_y) < var_z ) LOOP … ;
- SELECT test_check(sp1) FROM DUAL;
- IF test_check(var_x) THEN … END IF;
- EXECUTE test_check(123);
A: WHILE ( test_check(var_y) < var_z ) LOOP … ;; SELECT test_check(sp1) FROM DUAL;
Feedback: Da der Rückgabewert (RETURN-Wert) vom Typ NUMBER ist, ist eine Verwendung wie innerhalb der Bedingung dieser IF-Anweisung unzulässig, da diese Syntax keine zu einem Wahrheitswert auswertbare Bedingung darstellt. Anders sieht es bei der Bedingung der WHILE-Schleifen aus. Aufgrund des Vergleichs ist dies eine auswertbare Bedingung mit einem Wahrheitswert. Mit EXECUTE können nur Prozeduren ausgeführt werden und das auch nicht innerhalb von PL/SQL-Programmen (dort nur durch Verwendung des Prozedurnamens) sondern in Tools wie SQL-Plus oder SQL-Developer etc. Die Anweisung "SELECT funktionsname FROM DUAL;" eignet sich hervorragend für den Aufruf von Funktionen mit nur IN-Parametern, solange für sie nicht BOOLEAN als RETURN-Wert definiert ist. Der Grund ist, im SQL-Kontext kennt Oracle leider immer noch nicht den Datentyp BOOLEAN sondern nur in PL/SQL-Programmen.

Q: Frage 3119

Betrachten Sie den folgenden anonymen PL-SQL-Block auf der Tabelle
Angestellte(ang_nr, Name, abt_nr, gehalt, ....)

SET SERVEROUTPUT ON;
DECLARE
    v_summe NUMBER;
    abt_nr angestellte.ang_nr%TYPE = 5;
BEGIN
    SELECT SUM(gehalt)
    FROM angestellte v_summe INTO v_summe
    WHERE abt_nr = abt_nr;
    DBMS_OUTPUT.PUT_LINE('Die Gehaltssumme in Abteilung 5 ist ' || to_char(v_summe);
END;

Welche Aussagen sind wahr?
- Der anonyme Block wird ausgeführt und gibt die Summe über alle Gehälter in Abteilung 5 aus.
- Der anonyme Block wirft einen Fehler, weil Gruppenfunktionen (SUM) nicht in anonymen Blöcken genutzt werden dürfen.
- Der anonyme Block wirft einen Fehler, weil der Variablenname in der SELECT-Anweisung gleich dem Spaltennamen ist.
- Der anonyme Block wird ausgeführt und gibt nicht die Summe über alle Gehälter in Abteilung 5 aus.
A: Der anonyme Block wird ausgeführt und gibt nicht die Summe über alle Gehälter in Abteilung 5 aus.
Feedback: Ein anonymer PL/SQL-Block ignoriert leider in SQL-Angeweisungen Variablenamen, die gleich Spaltennamen sind. Es wird die Bedingung "abt_nr = abt_nr" geprüft, die immer wahr ist. Es wird daher die Summe über alle Gehälter über alle Abteilungen berechnet.

Q: Frage 3128
Welche Aussagen über INDEX-By-Tabellen (assoziative Arrays) sind unter Oracle PL/SQL wahr?
- INDEX-By-Tabellen habe eine Größenbeschränkung
- INDEX BY-Tabellen sind Gruppen von Schlüsselwertpaaren
- INDEX-By-Tabellen habe keine Größenbeschränkung
- Die Schlüssel INDEX BY-Tabellen können nur vom Typ BINARY_INTEGER oder PLS_INTEGER sein
- Die Schlüssel INDEX BY-Tabellen können vom Typ BINARY_INTEGER , PLS_INTEGER oder VARCHAR2-Typ sein
A: INDEX BY-Tabellen sind Gruppen von Schlüsselwertpaaren; INDEX-By-Tabellen habe keine Größenbeschränkung; Die Schlüssel INDEX BY-Tabellen können vom Typ BINARY_INTEGER , PLS_INTEGER oder VARCHAR2-Typ sein
Feedback: Kollektionen mit Größenbeschränkung heißen unter Oracle PL/SQL ARRAYS.ein. Bei INDEX BY-Tabellen sind die Schlüsseltypen BINARY_INTEGER , PLS_INTEGER und VARCHAR2-Typ vorgesehen.

Q: Frage 3129
Ein PL/SQL CURSOR enthält immer eine SELECT-Anweisung mit einer INTO-Klausel.
- Wahr
- Falsch
A: Falsch
Feedback: Ein CURSOR ersetzt gerade die INTO -Klausel einer SELECT-.Abweisung. SELECT mit INTO deklariert einen impliziten CURSOR. Der Grund dafür ist, dass Sie im deklarativen Bereich nur einen Cursor definieren, aber keine Zeilen in den Cursor abrufen.

Q: Frage 3130
Ein geöffneter CURSOR löst eine EXCEPTION aus, wenn eine FETCH- Anweisung keine Zeilen liefert.
- Wahr
- Falsch
A: Falsch
Feedback: Eine EXCEPTION wird nur bei einem impliziten CURSOR mit SELECT INTO... geworfen, wenn der SELECT keine Zeilen liefert. Es wird nur die CURSOR%NOTFOUND Variable gesetzt. Eine Exception würde ja bedeuten, dass die Programmausführung abbricht und in die Exception springt.

Q: Frage 3137

Betrachten Sie den folgenden PL/SQL-Block:

SET SERVEROUTPUT ON
DECLARE
   ang_rec angestellte%ROWTYPE
BEGIN
   SELECT * into ang_rec from angestellte where ang_nr = 12:
   IF SQL%NOTFOUND
   THEN
     DBMS_OUTPUT:PUT_LINE ('Keine Daten gefunden!');
   ELSE
     DBMS_OUTPUT:PUT_LINE (ang_rec.nachname);
   END IF;
END;

Welche Antwort(en) ist korrekt?
- Es wird ein Fehler geworfen, weil SELECT INTO keinen Record füllen kann
- Der Block wird ausgeführt und gibt NULL aus, wenn der Angestellte mit der ang_nr 12 nicht existiert.
- Der Block wird ausgeführt und gibt NO DATA FOUND aus.
- Der Block wirft einen Fehler, wenn der Angestellte mit der ang_nr 12 nicht existiert.
A: Der Block wirft einen Fehler, wenn der Angestellte mit der ang_nr 12 nicht existiert.
Feedback: PL/SQL-Blöcke werfen einen Fehler, wenn eine SELECT-Anweisung keine Datensätze liefert. Dieser Fehler muss mit NO_ROWS_FOUND abgefangen werden.

Q: Frage 3138

Welche Aussage ist wahr über Transaktionen in PL/SQL-Blöcken?
- Eine Transaktion kann mehrere Blocke umfassen..
- Mit dem Schlüsselwort END wird ein PL/SQL-Block nicht nur beendet, sondern auch automatisch die zugehörige Transaktion mit einem COMMIT abgeschlossen.
- Ein Block kann immer nur eine einzelne Transaktion enthalten
A: Eine Transaktion kann mehrere Blocke umfassen..
Feedback: PL/SQL-Blocke können als Bestandteil einer Transaktion geschrieben werden. Daher kann eine Transaktion auch mehrere Blöcke umfassen.

Q: Frage 3139
Betrachten Sie den folgenden anonymen PL/SQL-Block:
SET SERVEROUTPUT ON
DECLARE x NUMBER := 1000;
   y NUMBER;
BEGIN
   IF x = y THEN
     dbms_output.put_line('x=y');
   ELSIF x<>y THEN
     dbms_output.put_line('x<>y');
   ELSE
     dbms_output.put_line('nicht entscheidbar!');
   END IF;
END;

Welche Meldung gibt der Oracle-Server aus?
- x <> y
- x=y
- nicht entscheidbar!
A: nicht entscheidbar!
Feedback: Der Vergleich zwischen einem Wert und einer NULL-Variablen wird unter PL/SQL wegen der dreiwertigen Logik immer mit falsch bewertet..

Q: Frage 832
PL/SQL wird immer beim SERVER ausgeführt.
- Wahr
- Falsch
A: Falsch
Feedback: PL/SQL ist eine Oracle-spezifische prozedurale Erweiterung von SQL, die auf ADA basiert. Sie stellt somit eine Möglichkeit dar, die mengenorientierten SQL-DML-Anweisungen Datensatz für Datensatz zu verarbeiten. PL/SQL kann sowohl beim Server als auch beim Client ausgeführt werden. Findet die Ausführung auf dem Server statt, dann handelt es sich um in der Datenbank gespeicherte Prozeduren und Funktionen, die durch externe Aufrufe (RPC Remote Procedure Call) angestoßen werden oder über Datenbanktrigger. PL/SQL-Aufrufe können alternativ auch beim Client verarbeitet werden. In diesem Fall wird der PL/SQL-Programmcode auf der Client-Seite bearbeitet und das Ergebnis dem Oracle-Datenbank-Server übergeben.

Q: Frage 840
Welche Kategorien von PL/SQL-Blöcken gibt es?
- Funktionen
- Prozeduren
- Datenbanktrigger
- Anonyme Blöcke
- Pakete
A: Funktionen; Prozeduren; Datenbanktrigger; Anonyme Blöcke; Pakete
Feedback: PL/SQL unterscheidet vier Typen von Blöcken: Ein Anonymer Block ist ein unbenannter PL/SQL-Block, der in einer Anwendung (Prozedur, Funktion Â…) eingebettet ist oder interaktiv eingegeben wird. Eine Stored Routine ist ein benannter PL/SQL-Block, der Parameter haben kann und als Prozedur oder Funktion definiert ist. Er wird im Datenbanksystem gespeichert und auf dem Server von der PL/SQL-Engine ausgeführt. Ein PACKAGE ist ein benannter PL/SQL-Block, der logisch verwandte Prozeduren und Funktionen, Deklarationen etc. zu einer Bibliothek zusammenfasst. Ein Datenbanktrigger ist ein PL/SQL-Block, der zu einem definierten Ereignis (INSERT, UPDATE oder DELETE) automatisch vom Datenbankmanagementsystem aktiviert und ausgeführt wird.

Q: Frage 851
Mit welcher PL/SQL-Prozedur schreibt man Text in das Ausgabefenster?
- DBMS_OUTPUT.PUT_LINE(..)
- DBMS_OUTPUT.PUTLINE(..)
- DBMSOUTPUT.PUT_LINE(..)
- DBMSOUTPUT.PUTLINE(..)
A: DBMS_OUTPUT.PUT_LINE(..)
Feedback: Die umfangreiche Oracle-Bibliothek besteht aus einer ganzen Reihe mitgelieferter Pakete, zu denen auch DBMS_OUTPUT gehört. Die Funktion DBMS_OUTPUT.PUT_LINE(Text) nutzen wir sehr häufig zur Ausgabe in SQL*PLUS oder anderen Client-Applikationen und DBMS_OUTPUT.ENABLE(Buffergröße) zum Einstellen der Größe des Bildschirmbuffers.

Q: Frage 852
Welche Aussagen über PL/SQL-Funktionen sind wahr?
- Im SQL-Developer können PL/SQL-Funktionen direkt aufgerufen werden.
- PL/SQL-Funktionen können über Session-Variablen ausgeführt werden, deren Wert mit PRINT ausgegeben wird.
- PL/SQL-Funktionen können wie die Single-Row_Funktionen (SQRT, TO_Char, etc...), die zum Funktionsumfang von ORACLE-SQL-gehören, in SQL-Anweisungen eingebunden werden.
A: PL/SQL-Funktionen können über Session-Variablen ausgeführt werden, deren Wert mit PRINT ausgegeben wird.; PL/SQL-Funktionen können wie die Single-Row_Funktionen (SQRT, TO_Char, etc...), die zum Funktionsumfang von ORACLE-SQL-gehören, in SQL-Anweisungen eingebunden werden.
Feedback: Der Rückgabeparameter der Funktionen erfordert eine andere Aufrufart als die Prozeduren. Es gibt drei Möglichkeiten, Funktionen aufzurufen: 1. Möglichkeit: in SQL-Anweisungen Funktionen können grundsätzlich in jedem SQL-Anfrage- und Manipulationsbefehl aufgerufen und ausgeführt werden. Sie können überall dort aufgerufen werden, wo SINGLE ROW-Funktionen aufrufbar sind, z.B. SELECT function(...) FROM dual; 2. Möglichkeit: In PL/SQL-Anweisungen kann man iterativ die Funktion auch mittels eines geeigneten PL/SQL-Befehls ausführen. Geeignete Anweisungen sind z.B. Zuweisungen oder als Parameter eines Prozedur- oder Funktionsaufrufs. Eine andere Möglichkeit ist die Verwendung der Anzeigefunktion PUT_LINE aus dem Bibliothekspaket DBMS_OUTPUT. 3. Möglichkeit (mit SQL*PLUS-Variabeln): Dieser Aufruf funktioniert nur unter SQL*PLUS. Eine Sessionvariable wird definiert, mit dem Funktionswert über die EXECUTE-Anweisung gefüllt und über den PRINT-Befehl auf dem Bildschirm ausgegeben VARIABLE Gehaltssumme NUMBER; EXECUTE :Gehaltssumme:= Func_Gehaltssumme(); PRINT Gehaltssumme;

Q: Frage 859
Welche Schleifentypen gibt es in PL/SQL?
- FOR-Schleifen
- WHILE-Schleifen
- DO_NEXT-Schleifen
- LOOP-Schleifen
A: FOR-Schleifen; WHILE-Schleifen; LOOP-Schleifen
Feedback: In PL/SQL gibt es bedingte Verzweigungen mit IF und CASE, Basisschleifen ohne Bedingung mit LOOP, FOR-, WHILE- und CURSOR-Schleifen sowie eine EXIT-Anweisung zum Verlassen von Schleifen.

Q: Frage 861
In PL/SQL-Blöcken können Sie
- DML-Anweisungen wie INSERT, UPDATE und DELETE schreiben.
- COMMIT und ROLLBACK absetzen, falls es sich nicht um einen Trigger handelt.
- DDL-Anweisungen wie CREATE TABLE, DROP TABLE etc. schreiben.
A: DML-Anweisungen wie INSERT, UPDATE und DELETE schreiben.; COMMIT und ROLLBACK absetzen, falls es sich nicht um einen Trigger handelt.
Feedback: In PL/SQL-Blöcken sind aus Sicherheitsgründen keine DDL-Anweisungen zugelassen. Um diese Einschränkung zu umgehen, kann man allerdings dynamischen SQL mit EXECUTE IMMEDIATE '--DDL-ANWEISUNG--' nutzen.

Q: Frage 876
Welcher PL/SQL-Block ermittelt einen Wert und gibt ihn als RETURN-Wert zurück?
- eine Prozedur
- eine Funktion
- ein Paket
- ein Datenbanktrigger
A: eine Funktion
Feedback: PL/SQL unterscheidet vier Typen von Blöcken: Ein Anonymer Block ist ein unbenannter PL/SQL-Block, der in einer Anwendung (Prozedur, Funktion Â…) eingebettet ist oder interaktiv eingegeben wird. Eine Stored ist ein benannter PL/SQL-Block, der Parameter haben kann und als Prozedur oder Funktion definiert ist. Er wird im Datenbanksystem gespeichert und auf dem Server von der PL/SQL-Engine ausgeführt. Stored Functions geben über RETURN einen Wert an das aufrufende Programm zurück Ein PACKAGE ist ein benannter PL/SQL-Block, der logisch verwandte Prozeduren und Funktionen, Deklarationen etc. zu einer Bibliothek zusammenfasst. Ein Datenbanktrigger ist ein PL/SQL-Block, der zu einem definierten Ereignis (INSERT, UPDATE oder DELETE) automatisch vom Datenbankmanagementsystem aktiviert und ausgeführt wird.

Q: Frage 877
Benannte PL/SQL-Blöcke (anonyme ausgeschlossen) werden kompiliert in der Datenbank gespeichert.
- Wahr
- Falsch
A: Wahr
Feedback: Der in die Oracle-DB integrierte Compiler prüft die Syntax und sichert den übersetzten Code in der Datenbank ab, damit er bei Aufrufen direkt zur Verfügung steht.

Q: Frage 878
EXCEPTION-Handling unter PL/SQL ist
- optional
- obligatorisch
A: optional
Feedback: Die kleinste Einheit von PL/SQL ist ein sogenannter PL/SQL-Block, der aus bis zu drei PL/SQL-Abschnitten bestehen kann. Der Deklarationsabschnitt enthält Deklarationen von benutzerdefinierten Datentypen, Variablen, Konstanten, CURSOR und benutzerdefinierte EXCEPTIONS, Unterprozedurenund -funktionen und ist optional. Der Ausführungsabschnitt enthält PL/SQL-Anweisungen und bestimmte SQL-Anweisungen wie INSERT, UPDATE, DELETE, SELECT, COMMIT, ROLLBACK und ist obligatorisch. Der Fehlerbehandlungsabschnitt (EXCEPTION-Handling) gibt an, welche Aktionen ausgeführt werden sollen, wenn im Ausführungsabschnitt Fehler auftreten und ist optional.

Q: Frage 882

Unter PL/SQL gibt es den Datentyp BOOLEAN.
- Wahr
- Falsch
A: Wahr
Feedback: Während in PL/SQL und in Standard -SQL der Datentyp Boolean schon seit SQL2 existiert, ist dies in Oracle SQL leider nicht der Fall.

Q: Frage 884
Womit wird in PL/SQL ein Vektor fester Länge definiert?
- TYPE ... is TABLE OF ...
- TYPE ... is VARRAY OF ...
- TYPE ... is RECORD OF ...
A: TYPE ... is VARRAY OF ...
Feedback: VARRAY und TABLE gehören zu den Kollektionstypen, wobei varray definiert ist über: <CREATE TYPE Anweisung VARRAY> ::= CREATE OR REPLACE TYPE Typname AS VARRAY () OF ; Im Unterschied zum TABLE-Kollektionstypen hat VARRAY eine fest definierte Länge.

Q: Frage 983
Welche Korrelationsvariablen (Transitionsvariablen) werden in PL/SQL verwendet?
- :SMALL
- :OLD
- :NEW
- :BIG
A: :OLD; :NEW
Feedback: Korrelationsvariablen (Transitionstabellen, Referencing Variables: OLD [ROW], NEW [ROW]) sind nur in Zeilentriggern zugreifbar. Die Transitionstabellen beinhalten während der Triggerausführung den alten und den neuen Zustand der Triggertabelle. Um auf den neuen oder alten Wert eines Attributs zugreifen zu können, wird dem Attributnamen das Schlüsselwort NEW bzw. OLD in Punktnotation vorangestellt (z.B. OLD.Spalte). Liegt ein UPDATE-Ereignis vor, so sind die OLD wie auch die NEW-Variablen und -Tabellen mit den zugehörigen alten/neuen Werten gefüllt. Beim DELETE-Ereignis sind nur die OLD-Variablen und -Tabellen belegt. Beim INSERT sind es nur die NEW-Variablen und -Tabellen. Für BEFORE TRIGGER gilt die zusätzliche Restriktion, dass keine Transitionstabellen verfügbar sind. Der Geltungsbereich der Transitionsvariablen und -tabellen sind die Trigger, die für das zugehörige Ereignis gefeuert wurden. In der Referenzklausel besteht nun die Möglichkeit die Schlüsselwörter OLD bzw. NEW [ROW] sowie OLD und NEW TABLE umzubenennen in selbst gewählte Bezeichnungen, die Zeilenalias_alter/neuer_Wert und Tabellenalias_ alter/neuer_Wert. Der SQL-Standard definiert Transitionstabellen und Transitionsvariablen, DB2 kennt beide Typen, Oracle nur Transitionsvariablen.