DevGym_PLSQL_Quizzes Flashcards

1
Q

Was macht COALESCE?

A

Verwenden Sie COALESCE, um den ersten Nicht-NULL-Wert in einer Liste zu finden. Es wird kein Ausdruck in der Liste ausgewertet, es sei denn, die vorherigen Werte sind alle NULL.

DECLARE
  value1 VARCHAR2(50) := NULL;
  value2 VARCHAR2(50) := 'Hello, World!';
  result VARCHAR2(50);
BEGIN
  result := COALESCE(value1, value2, 'Default Value');
  DBMS_OUTPUT.PUT_LINE('Result: ' || result);
END;

Result: Hello, World!

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Worauf sollte ich beim FOR LOOP ITERATOR achten?

A
  • Deklarieren Sie niemals eine Variable mit dem gleichen Namen wie der Iterator der FOR-Schleife. Oracle deklariert sie implizit für Sie - aber nur zur Verwendung innerhalb des Schleifenkörpers.
  • Versuchen Sie niemals, den Wert des Iterators innerhalb der Schleife zu ändern.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Der Code für eine einfache Schleife, welche die Zahlen von 1 bis 5 ausgibt?

A
DECLARE
i INTEGER := 10;
BEGIN
FOR i IN 1 ... 5
LOOP
DBMS_OUTPUT.put_line(i);
END LOOP;

DBMS_OUTPUT.put_line(i);
END;
/
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Worauf muss ich bei EXCEPTION achten?

A

Verwenden Sie den EXCEPTION-Abschnitt, um Ausnahmen abzufangen, Fehler zu protokollieren und - falls Sie dies wünschen - eine Ausnahme erneut auszulösen, um den umschließenden Block anzuhalten.

Sie können mehrere WHEN-Klauseln haben und sogar mehrere Ausnahmen in einer einzigen WHEN-Klausel mit einem OR kombinieren. Die WHEN OTHERS-Klausel muss die letzte im EXCEPTION-Abschnitt sein.

BEGIN
     DBMS_OUTPUT.PUT_LINE(SYSDATE);
EXCEPTION
     WHEN OTHERS THEN
		      DBMS_OUTPUT.PUT_LINE(SQLCODE)
END;
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Gibt es implizite Konvertierungen in Oracle?

A

Oracle führt alle möglichen impliziten Konvertierungen für uns durch, was sehr nützlich sein kann, aber auch zu schlampiger Programmierung führt. Am besten ist es, TO_*-Funktionen (z.B. TO_CHAR oder TO_DATE) zu verwenden, um Konvertierungen wie gewünscht explizit durchzuführen.

Das folgende liefert übrigens das Ergebnis 200, ist durch die Konvertierungen allerdings unschön.

DECLARE
   l_number          NUMBER := 100;
   l_like_a_number   VARCHAR2 (10) := '100';
BEGIN
   DBMS_OUTPUT.put_line (
      TO_CHAR (l_number) + TO_NUMBER (l_like_a_number));
END;
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Mit welchen VIEWS kann ich mehr über die Spalten des aktuellen SCHEMAS herausfinden?

A

USER_TAB_COLUMNS - grundlegende Informationen über Spalten in einer Tabelle, Ansicht oder materialisierten Ansicht

USER_TAB_COLS - ähnlich wie USER_TAB_COLUMNS, unterscheidet jedoch zwischen physischen und virtuellen Spalten (virtuelle Spalten wurden in Oracle Database 11g hinzugefügt)

USER_TAB_COL_STATISTICS - verschiedene “Statistiken” über eine Spalte

Sie können USER auch durch “ALL” ersetzen, um Informationen über alle Datenbankschemas zu erhalten, die Datenbankobjekte enthalten, auf die Ihr aktuell verbundenes Schema Zugriffsrechte hat.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Ist die Aussage richtig oder falsch?
Ersetzen Sie alle hart kodierten literalen Werte durch benannte Konstanten oder Funktionsaufrufe.

A

Richtig
Es ist immer am besten, hart kodierte Literale in Ihrem Code zu vermeiden, und zwar aus zwei Hauptgründen:
1. Wenn sich diese Werte ändern müssen, müssen Sie sie wahrscheinlich an mehr als einer Stelle ändern. Wenn Sie den Wert hinter einem Namen “verstecken”, müssen Sie ihn nur an einer Stelle ändern.
2. Sie verbessern die Lesbarkeit Ihres Codes. In diesem Fall gibt es keinen Grund zu der Annahme, dass sich die Monate, die Januar und Dezember zugeordnet sind, ändern werden. Das Problem ist vielmehr, dass “1” und “12” viele Dinge bedeuten können, nicht unbedingt die Anzahl der Monate. Wenn Sie eine benannte Konstante verwenden, ist die Bedeutung klar, wie Sie in der folgenden Neuformulierung der Prozedur sehen können:

CREATE OR REPLACE PROCEDURE set_pct_of_sales (company_id_in IN INTEGER, percent_in IN NUMBER)
IS
   c_january    CONSTANT PLS_INTEGER := 1;
   c_december   CONSTANT PLS_INTEGER := 12;
BEGIN
   FOR month_index IN c_january .. c_december
   LOOP
      UPDATE monthly_sales
         SET pct_of_sales = percent_in
       WHERE company_id = company_id_in AND month_number = month_index;
   END LOOP;
END set_pct_of_sales;
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Welche Attribute gibt es für explizite Cursor?

A

Oracle bietet eine Reihe von Attributen für explizite Cursor, die Ihnen helfen, den Zustand des Cursors zu verstehen (ist er offen oder geschlossen, wie viele Zeilen wurden durch den Cursor geholt usw.).
%ROWCOUNT: Gibt die Anzahl der vom Cursor zu diesem Zeitpunkt verarbeiteten Zeilen zurück (diese Zahl kann die Anzahl der abgerufenen oder der geänderten - also gelöschten, aktualisierten oder eingefügten - Zeilen wiedergeben).
%ISOPEN: Ein boolesches Attribut, das TRUE zurückgibt, wenn ein Cursor geöffnet ist.
%FOUND:: Ein boolesches Attribut, das TRUE zurückgibt, wenn der letzte Abruf eine Zeile ergeben hat, und FALSE, wenn nicht.
%NOTFOUND: Ein boolesches Attribut, das TRUE zurückgibt, wenn der letzte Abruf keine Zeile zurückgegeben hat, und FALSE, wenn dies der Fall war.

Bei expliziten Cursors werden sie als Cursorname%Attribut angegeben; zum Beispiel CURS_GET_EMPS%FOUND. Bei impliziten Cursorn werden sie als SQL%Attribut angegeben, z.B. SQL%NOTFOUND.

DECLARE
  num_updated NUMBER;
BEGIN
  UPDATE employees SET salary = salary * 1.1 WHERE department = 'IT';
  num_updated := SQL%ROWCOUNT;
  DBMS_OUTPUT.PUT_LINE('Number of rows updated: ' || num_updated);
END;

Number of rows updated: 5

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Welche zwei FOR Schleifen gibt es in PL/SQL?

A
  1. Numerische FOR-Schleife - Sie geben die niedrigen und hohen ganzzahligen Werte in der IN-Klausel an, um die Anzahl der Ausführungen des Schleifenkörpers zu bestimmen.
  2. Cursor FOR-Schleife - Sie geben eine SELECT-Anweisung an und der Schleifenkörper wird für jede durch die Abfrage abgerufene Zeile ausgeführt.
CREATE TABLE plch_employees
(employee_id     INTEGER
 , last_name       VARCHAR2 (100)
 , salary          NUMBER)
BEGIN
   FOR emp_rec IN (SELECT last_name FROM plch_employees)
   LOOP
      DBMS_OUTPUT.put_line (emp_rec.last_name);
   END LOOP;
END;
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Eine Cursor FOR Schleife kann mit impliziten oder expliziten Cursorn verwendet werden.

A
BEGIN
  FOR item IN (
    SELECT last_name FROM employees
     WHERE job_id LIKE '%CLERK%'
    ORDER BY last_name
  )
  LOOP
    DBMS_OUTPUT.PUT_LINE ('Name = ' || item.last_name);
  END LOOP;
END;

Die obige Form der Cursor FOR LOOP-Anweisung verwendet einen impliziten Cursor und wird als implizite Cursor FOR LOOP-Anweisung bezeichnet.

Wenn Sie die SELECT-Anweisung mehr als einmal in derselben PL/SQL-Einheit verwenden, definieren Sie einen expliziten Cursor dafür und geben diesen Cursor in der Cursor FOR LOOP-Anweisung an (die dann explizite Cursor FOR LOOP-Anweisung genannt wird), wie unten gezeigt:

DECLARE
  CURSOR c1 IS
    SELECT last_name FROM employees
     WHERE job_id LIKE '%CLERK%'
     ORDER BY last_name;
BEGIN
  FOR item IN c1
  LOOP
    DBMS_OUTPUT.PUT_LINE ('Name = ' || item.last_name);
  END LOOP;
END;
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Ein paar Fakten zum Package UTL_FILE

A
  1. Sie können nicht wahllos auf Zeilen in einer Datei zugreifen. Sie müssen die Zeilen der Reihe nach ab der ersten Zeile der Datei lesen.
  2. Die maximale Größe (Anzahl der Bytes) einer Zeile in einer Datei, die gelesen werden kann, beträgt 32.767 Bytes.
  3. Dateien werden erst geschlossen, wenn Sie sie explizit mit einem Aufruf von UTL_FILE.FCLOSE oder UTL_FILE.FCLOSE_ALL schließen oder die Sitzung beenden.
  4. UTL_FILE gibt es schon seit Oracle 7.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Ein Beispiel für das Package UTL_FILE

A
DECLARE
 v_file UTL_FILE.FILE_TYPE;
 v_dir VARCHAR2(100) := 'MY_DIRECTORY'; -- replace with your directory name
 v_filename VARCHAR2(100) := 'MY_FILE.txt'; -- replace with your file name
BEGIN
 v_file := UTL_FILE.FOPEN(v_dir, v_filename, 'w');

 FOR i IN 1..10 LOOP
 UTL_FILE.PUT_LINE(v_file, 'This is line ' || i);
 END LOOP;

 UTL_FILE.FCLOSE(v_file);
END;

In diesem Beispiel deklarieren wir eine Variable v_file vom Typ UTL_FILE.FILE_TYPE, die die Datei darstellt, in die wir schreiben werden. Dann geben wir das Verzeichnis und den Dateinamen an, die wir verwenden wollen, indem wir den Variablen v_dir und v_filename Werte zuweisen.

Wir verwenden die Funktion UTL_FILE.FOPEN, um die Datei im Schreibmodus (‘w’) zu öffnen, und weisen v_file das entsprechende Dateimanöver zu. Dann gehen wir in einer Schleife durch einige Daten, in diesem Fall nur die Zahlen 1 bis 10, und verwenden die Funktion UTL_FILE.PUT_LINE, um jede Zeile in die Datei zu schreiben. Schließlich schließen wir die Datei mit UTL_FILE.FCLOSE.

Beachten Sie, dass Sie über die entsprechenden Rechte verfügen müssen, um das in v_dir angegebene Verzeichnis lesen und schreiben zu können. Beachten Sie auch, dass das UTL_FILE-Paket nicht in allen Versionen der Oracle-Datenbank verfügbar ist. Prüfen Sie daher die Dokumentation Ihrer Version.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Was kann ich bei hierarchischen Daten verwenden?

A

CONNECT BY PRIOR
In meinem Fall waren das die Unterstufen der Konstruktionsstückliste. Mit CONNECT BY PRIOR konnte ich alle jeweiligen Unterstufen bekommen.

SELECT *
   FROM   eng_part_structure_tab
   WHERE  structure_id = 'STD'
   START WITH part_no  = '6GF62003AA10'
   AND part_rev = 'R03'
   CONNECT BY PRIOR sub_part_no = part_no AND PRIOR sub_part_rev = part_rev;
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Wie oft wird der Hauptteil der folgenden Schleife ausgeführt?

BEGIN
   FOR year_index IN 1990 .. 1999
   LOOP
      IF MOD (year_index, 2) = 0
      THEN
         DBMS_OUTPUT.put_line (year_index);
      END IF;
   END LOOP;
END;
A

10
Es gibt 10 Jahre zwischen 1990 und 1999, einschließlich. Und eine numerische FOR-Schleife schließt die Endpunkte in ihre Iterationen ein.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Was wird nach der Ausführung dieses Blocks auf dem Bildschirm angezeigt:

DECLARE
   l_selection   VARCHAR2 (1) := 'C';
   l_value       VARCHAR2 (100) := 'Fruit';
BEGIN
   CASE l_selection
      WHEN 'A'
      THEN
         l_value := 'Apple';
      WHEN 'B'
      THEN
         l_value := 'Banana';
   END CASE;
   DBMS_OUTPUT.put_line (NVL (l_value, 'NULL'));
EXCEPTION
   WHEN OTHERS
   THEN
      DBMS_OUTPUT.put_line ('Error');
END;
A

Error

  • Wenn keine Übereinstimmung für WHEN-Klauseln in einer CASE-Anweisung gefunden wird und diese Anweisung keine ELSE-Klausel enthält, gibt Oracle die Fehlermeldung “ORA-06592: CASE not found while executing CASE statement” aus.
  • Sie müssen keine ELSE-Klausel für einen CASE-Ausdruck angeben. Wenn in den WHEN-Klauseln keine Übereinstimmung gefunden wird, gibt Oracle einen NULL-Wert für den Ausdruck zurück.
  • Wenn Sie eine CASE-Anweisung schreiben, sollten Sie immer eine ELSE-Klausel einfügen - es sei denn, Sie sind absolut sicher, dass eine der WHEN-Klauseln immer TRUE ergibt. Das ist eine große Annahme.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

Ich erstelle die folgende Tabelle

CREATE TABLE plch_stuff
(amount   NUMBER , rating   INTEGER)
BEGIN
   FOR indx IN 1 .. 20
   LOOP
      INSERT INTO plch_stuff
           VALUES (indx, indx * 10);
   END LOOP;
   COMMIT;
END;

Wie kann ich jetzt eine 10 anzeigen lassen?

BEGIN
   UPDATE plch_stuff
      SET rating = -1 * rating
    WHERE MOD (amount, 2) = 0;
   /*HOWMANY*/
END;
A
sys.DBMS_OUTPUT.put_line (SQL%ROWCOUNT);

SQL%ROWCOUNT zeigt Ihnen in der Tat an, wie viele Zeilen durch die zuletzt ausgeführte SQL-Anweisung in Ihrer Sitzung geändert wurden. Da 10 Zeilen geändert wurden, wird “10” angezeigt.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
17
Q

Was kann ich mit SAVEPOINT machen?

A

Verwenden Sie SAVEPOINT, um einen Punkt in der Transaktion Ihrer Sitzung zu definieren, zu dem Sie ein Rollback durchführen können. Mit dieser Funktion können Sie Änderungen in Ihrer Sitzung nur teilweise rückgängig machen.

DECLARE
  balance NUMBER := 1000;
  withdraw_amount NUMBER := 500;
BEGIN
  DBMS_OUTPUT.PUT_LINE('Starting balance: ' || balance);
  SAVEPOINT start_transaction;
  -- Withdraw 500 from the balance
  balance := balance - withdraw_amount; 
  -- Check if the balance is negative
  IF balance < 0 THEN
    DBMS_OUTPUT.PUT_LINE('Insufficient balance. Rolling back transaction.');
    -- Roll back to the savepoint
    ROLLBACK TO start_transaction;
  ELSE
    DBMS_OUTPUT.PUT_LINE('Withdrawal successful. New balance: ' || balance);
  END IF;
END;
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
18
Q

Sind Deklarationen in einem PL/SQL-Block optional?

A

Sie brauchen keine Deklaration (und auch keinen Deklarationsabschnitt) in einen Block aufzunehmen, es sei denn, Sie müssen eine lokale Variable, Konstante, einen Typ oder ein anderes Element deklarieren.
Sie können durchaus Blöcke schreiben und ausführen, die keine lokalen Elemente zu deklarieren haben und daher weder Deklarationen noch einen Deklarationsabschnitt enthalten.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
19
Q

Was ist Pragma Autonomous_Transaction und wo muss ich es im Code platzieren?

A
  • Wenn Sie das Pragma AUTONOMOUS_TRANSACTION in Pl/SQL verwenden, wird eine von der Transaktion, in der Sie gerade arbeiten, getrennte Transaktion erstellt.
  • Die PRAGMA-Anweisung, die eine Programmeinheit als eigenständige Transaktion definiert, kann an beliebiger Stelle im Deklarationsteil des Unterprogramms stehen. Sie darf nicht in den Kopf des Unterprogramms gestellt werden.
  • Seien Sie äußerst vorsichtig, dieses Pragma nicht zu missbrauchen, denn Sie sollten es nur für die Protokollierung verwenden. Wenn Sie ein AUTONOMOUS_TRANSACTION-Pragma nicht nur für die Protokollierung verwenden müssen, ist Ihr Datenbankdesign möglicherweise fehlerhaft.
CREATE OR REPLACE PROCEDURE plch_save_changes (
   keys_in IN DBMS_SQL.number_table)
IS
   PRAGMA AUTONOMOUS_TRANSACTION;
   l_value   plch_table.my_value%TYPE;
BEGIN
   FOR indx IN 1 .. keys_in.COUNT
   LOOP
      l_value := 'Value' || keys_in.count;
      UPDATE plch_table
         SET my_value = l_value
       WHERE my_key = keys_in (indx);
   END LOOP;
   COMMIT;
END;
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
20
Q

Was ist der Vorteil bei so einer Verwendung einer Prozedur?

DECLARE
   l_number   NUMBER;
   PROCEDURE initialize
   IS
   BEGIN
      l_number := 100;
   END;
BEGIN
   initialize;
   DBMS_OUTPUT.put_line (l_number);
END;
A

Bei dieser Wahl weise ich in der Deklaration keinen Standardwert zu. Stattdessen definiere ich ein verschachteltes Unterprogramm, das (daher der Name) “alle” Variablen in meinem Block initialisieren soll (in diesem Fall nur eine).

Dann rufe ich initialize als erste Zeile in meinem Ausführungsblock auf.

Für etwas so Triviales wie die Zuweisung von 100 an eine Zahl ist das ein Overkill. In komplexeren Programmen, in denen mehrere Schritte erforderlich sind, um den ausführbaren Teil für das richtige Verhalten “einzurichten”, empfehle ich dringend, ein verschachteltes Unterprogramm für die Initialisierung zu deklarieren und zu verwenden.

Dieser Ansatz hat zwei große Vorteile:

  1. Wenn die Zuweisung des Standardwerts eine Ausnahme auslöst (in der Regel VALUE_ERROR), können Sie diese innerhalb des Blocks behandeln (wenn die Zuweisung im Deklarationsabschnitt erfolgt, wird die Ausnahme immer unbehandelt weitergegeben).
  2. Der ausführbare Teil ist jetzt viel sauberer. Es ist einfacher, sich auf den Hauptzweck des Blocks zu konzentrieren und sich nicht von all den Einrichtungsschritten ablenken zu lassen.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
21
Q

Wie kann ich einer Variable den gleichen Datentyp einer Variablen aus einer bestimmten Tabelle geben?

PACKAGE types 
IS
   dollar_amount NUMBER(20,2);
END;
A

Das %TYPE-Attribut kann verwendet werden, um den Datentyp einer Variablen oder Konstanten mit einem anderen, zuvor definierten Element (einer Spalte in einer Tabelle, einem Ausdruck in einem Cursor oder einer PL/SQL-Variablen) zu “verankern”.

Einer der schönsten Aspekte verankerter Deklarationen, sowohl mit %TYPE als auch mit %ROWTYPE, besteht darin, dass, wenn sich die Deklaration des referenzierten Elements ändert, sich auch die Deklaration des referenzierenden Elements entsprechend ändert, wenn der Code, in dem es verwendet wird, das nächste Mal kompiliert wird.

DECLARE
   my_variable types.dollar_amount%TYPE;
BEGIN
   my_variable := 1;
END;
22
Q

Was ist ein Trigger?

A
  • Ein Trigger ist eine benannte Programmeinheit, die ausgeführt wird, wenn ein bestimmtes Ereignis in der Datenbank eintritt. Die häufigste Art von Trigger ist der DML-Trigger, der als Reaktion auf eine Update-, Insert- oder Delete-Operation in einer Tabelle ausgelöst wird.
  • Sie können jedoch auch Trigger auf Datenbank- und Schemaebene (Data Definition Language - DDL) definieren, so dass z.B. bei der Ausführung einer CREATE/TRUNCATE/DROP-Anweisung ein Trigger ausgelöst wird.
  • Ein Trigger kann ich z.B. so definieren
CREATE OR REPLACE TRIGGER plch_after_ddl
AFTER DDL
ON SCHEMA 
BEGIN
  DBMS_OUTPUT.put_line ('DDL executed!');
END;

Dadurch wird z.B. bei den folgenden Anweisungen der Trigger ausgelöst:

  1. CREATE TABLE plch_table (col1 NUMBER)
  2. TRUNCATE TABLE plch_table
  3. DROP TABLE plch_table
23
Q

Welche EXCEPTIONS gibt es?

A

Sie können eine Exception nach ihrem Namen abfangen oder mit WHEN OTHERS abfangen. Wenn Sie wissen, welche Exceptions ausgelöst werden könnten, ist es in der Regel besser, einen Handler für diese spezielle Exception einzubinden, damit Sie auch genauere Informationen darüber protokollieren können, was den Fehler verursacht haben könnte.

Wenn Ihre SELECT-INTO-Anweisung keine Zeilen identifiziert, löst Oracle die Ausnahme NO_DATA_FOUND aus. Sie können diese Ausnahme explizit durch den Namen abfangen:

WHEN NO_DATA_FOUND

oder Sie können sie zusammen mit anderen Fehlern abfangen, indem Sie

WHEN OTHERS

Sie können einen Ausnahmeabschnitt jedoch nicht an eine SQL-Anweisung anhängen, sondern nur an das Ende eines PL/SQL-Blocks.

24
Q

Was ist an diesem Code falsch?

DECLARE
   my_flavor   plch_ice_cream.fav_flavor%TYPE;
BEGIN
   SELECT fav_flavor
     INTO my_flavor
     FROM plch_ice_cream
    WHERE name = 'Steven Feuerstein'
    EXCEPTION
       WHEN NO_DATA_FOUND
       THEN
          DBMS_OUTPUT.put_line ('No favorite for you!');
END;
A

Sie können einen Exception-Abschnitt nicht zu einer Abfrage hinzufügen, sondern nur zu einem PL/SQL-Block.

25
Q

Was ist ein RECORD (Datensatz)?

A

Ein Datensatz (RECORD) ist ein zusammengesetzter Datentyp, der Werte speichert, die aus internen Komponenten bestehen. In einem Datensatz (RECORD) können die internen Komponenten unterschiedliche Datentypen haben und werden als Felder bezeichnet. Sie können auf jedes Feld einer Datensatzvariablen über seinen Namen zugreifen, und zwar mit folgender Syntax: Variablenname.Feldname. Um eine Datensatzvariable zu erstellen, definieren Sie entweder einen RECORD-Typ und erstellen dann eine Variable dieses Typs, oder Sie verwenden %ROWTYPE oder %TYPE - verankert in einer Tabelle, einer Ansicht, einem Cursor oder einem anderen bereits definierten Datensatztyp.

Sie können eine Datensatzvariable auf jede dieser Arten erstellen:

  • Definieren Sie einen RECORD-Typ und deklarieren Sie dann eine Variable dieses Typs.
  • Verwenden Sie %ROWTYPE, um eine Datensatzvariable zu deklarieren, die entweder eine ganze oder eine Teilzeile einer Datenbanktabelle oder eines Views darstellt.
  • Verwenden Sie %TYPE, um eine Datensatzvariable desselben Typs wie eine zuvor deklarierte Datensatzvariable zu deklarieren.
26
Q

Ein Beispiel für ein RECORD.

CREATE OR REPLACE PACKAGE favorites_pkg
IS  
   TYPE favorites_rt IS RECORD (
     ice_cream VARCHAR2(100),
     programming_language VARCHAR2(100)
   );
END favorites_pkg;
A

Mit dem folgenden Code kann “Chocolate PL/SQL” ausgegeben werden.

DECLARE
   l_favorites   favorites_pkg.favorites_rt;
BEGIN
   l_favorites.ice_cream := 'Chocolate';
   l_favorites.programming_language := 'PL/SQL';
   DBMS_OUTPUT.
    put_line (
      l_favorites.ice_cream || ' ' 
      || l_favorites.programming_language);
END;
27
Q

Mit welchen Funktionen kann ich Zeichen entfernen oder hinzufügen?

A

Oracle bietet mehrere Funktionen zur Durchführung von Auffüll- und Abschneideoperationen:

  • LPAD und RPAD - Auffüllen einer Zeichenkette auf der linken oder rechten Seite mit den angegebenen Zeichen.
  • LTRIM und RTRIM - Schneiden Sie von der linken oder rechten Seite die angegebenen Zeichen ab.
  • TRIM - der neueste Eintrag in der PL/SQL-Welt, TRIM kann verwendet werden, um führende Zeichen, nachgestellte Zeichen oder beides zu entfernen.

Die PL/SQL-Sprache implementiert die meisten der eingebauten SQL-Funktionen als native PL/SQL-Funktionen. Sie fügt dann einige eigene Funktionen hinzu. In jedem Fall sollten Sie mit diesen eingebauten Funktionen so vertraut wie möglich sein, damit Sie keine Programme schreiben müssen, um Berechnungen durchzuführen, die bereits für Sie erledigt sind (und wahrscheinlich viel schneller laufen, da die eingebauten Funktionen in C implementiert sind).

28
Q

Beispiele für LPAD, RPAD, LTRIM, RTRIM und TRIM

A
-- LPAD: Pads a string with a specified character on the left until it reaches a specified length
DECLARE
  padded_string VARCHAR2(20);
BEGIN
  padded_string := LPAD('123', 5, '0');
  DBMS_OUTPUT.PUT_LINE(padded_string);
END;
-- Output: 00123

-- RPAD: Pads a string with a specified character on the right until it reaches a specified length
DECLARE
  padded_string VARCHAR2(20);
BEGIN
  padded_string := RPAD('123', 5, '0');
  DBMS_OUTPUT.PUT_LINE(padded_string);
END;
-- Output: 12300

-- LTRIM: Removes leading spaces or characters from a string
DECLARE
  trimmed_string VARCHAR2(20);
BEGIN
  trimmed_string := LTRIM('    hello');
  DBMS_OUTPUT.PUT_LINE(trimmed_string);
END;
-- Output: hello

-- RTRIM: Removes trailing spaces or characters from a string
DECLARE
  trimmed_string VARCHAR2(20);
BEGIN
  trimmed_string := RTRIM('hello         ');
  DBMS_OUTPUT.PUT_LINE(trimmed_string);
END;
-- Output: hello

-- TRIM: Removes leading and trailing spaces or characters from a string
DECLARE
  trimmed_string VARCHAR2(20);
BEGIN
  trimmed_string := TRIM('     hello     ');
  DBMS_OUTPUT.PUT_LINE(trimmed_string);
END;
-- Output: hello
29
Q

Wie kann ich diesen String “abc#def#” verändern, damit “abcdef” angezeigt wird?

A

Um Zeichen aus einer Zeichenkette mit einem Aufruf von REPLACE built-in zu entfernen, geben Sie NULL als drittes Argument an. Sie können auch einfach den Standardwert verwenden oder sogar eine Zeichenkette mit der Länge Null übergeben.

BEGIN
   DBMS_OUTPUT.put_line (replace ('abc#def#', '#', NULL));
END;
DECLARE
   c_zero_length_string   CONSTANT VARCHAR2 (1) := '';
BEGIN
   DBMS_OUTPUT.put_line (REPLACE ('abc#def#', '#', c_zero_length_string));
END;
30
Q

Wird dieser Code auf einen Fehler auslaufen?

DECLARE
   n NUMBER(2) := 2;
   v VARCHAR2(1000);
BEGIN
   WHILE n <= 50
   LOOP
      v := v || ' ' || n;
      n := n + 2;
   END LOOP;

   DBMS_OUTPUT.put_line(v);
END;
A

Nein
Dadurch werden die Zahlen von 2 bis 50 auf einer horizontalen Linie ausgegeben.

Ursprünglich dachte ich, dass es zu einem Fehler führt, da v nicht deklariert ist mit einem Wert.

Quiz on Screen Output with DBMS_OUTPUT

2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50

31
Q

Ein Beispiel für INSTR und SUBSTR?

A

INSTR: Diese Funktion akzeptiert eine Zeichenkette, die zu prüfende Teilzeichenkette und zwei optionale Parameter - die Startposition in der Zeichenkette und eine ganze Zahl, welche die N-te Iteration angibt, die gefunden werden soll.

Um also das zweite Auftreten von “abc” in meiner Zeichenkette zu finden, würde ich schreiben:

INSTR (my_string, 'abc', 1, 2)

SUBSTR gibt die Teilzeichenkette für eine bestimmte Startposition und eine Anzahl von Zeichen (wie angegeben oder den Rest der Zeichenkette) zurück.

DECLARE
  string VARCHAR2(20) := 'Hello World';
  position NUMBER;
  substring VARCHAR2(5);
BEGIN
  -- Find the position of the substring 'World' in the string 'Hello World'
  position := INSTR(string, 'World');
  DBMS_OUTPUT.PUT_LINE('Position of World: ' || position);
  
  -- Extract the substring 'Hello' from the string 'Hello World'
  substring := SUBSTR(string, 1, 5);
  DBMS_OUTPUT.PUT_LINE('Substring: ' || substring);
END;

Position of World: 7
Substring: Hello

32
Q

Mit welchen Funktionen kann ich die Groß-/Kleinschreibung eines Strings verändern?

A

UPPER - alle Zeichen in Großbuchstaben
LOWER - Kleinschreibung aller Zeichen
INITCAP - initialisiert den ersten Buchstaben eines jeden Wortes

DECLARE
  string VARCHAR2(20) := 'Hello World';
  upper_case VARCHAR2(20);
  lower_case VARCHAR2(20);
  init_case VARCHAR2(20);
BEGIN
  -- Convert the string to uppercase
  upper_case := UPPER(string);
  DBMS_OUTPUT.PUT_LINE('Uppercase: ' || upper_case);
  
  -- Convert the string to lowercase
  lower_case := LOWER(string);
  DBMS_OUTPUT.PUT_LINE('Lowercase: ' || lower_case);
  
  -- Capitalize the first letter of each word in the string
  init_case := INITCAP(string);
  DBMS_OUTPUT.PUT_LINE('Initcap: ' || init_case);
END;

Uppercase: HELLO WORLD
Lowercase: hello world
Initcap: Hello World

33
Q

Was ist der Unterschied zwischen INITCAP und NLS_INITCAP?

A

Sowohl INITCAP als auch NLS_INITCAP sind PL/SQL-Funktionen, die dazu dienen, den ersten Buchstaben eines jeden Wortes in einer Zeichenkette groß zu schreiben. Der Unterschied zwischen den beiden Funktionen ist die Art und Weise, wie sie mit nicht-englischen Zeichen umgehen.

INITCAP ist eine Basisfunktion, die den ersten Buchstaben eines jeden Wortes in einer Zeichenkette groß schreibt, unabhängig von der Sprache. Sie berücksichtigt keine sprachspezifischen Regeln für die Großschreibung. Wenn Sie zum Beispiel INITCAP auf die Zeichenkette ‘london bridge’ anwenden, gibt sie ‘London Bridge’ zurück.

NLS_INITCAP hingegen ist eine fortgeschrittenere Funktion, welche die Großschreibregeln einer bestimmten Sprache berücksichtigt. Sie verwendet den Parameter NLS_SORT, um die sprachspezifischen Regeln für die Großschreibung zu ermitteln. Das bedeutet, dass NLS_INITCAP nicht-englische Zeichen korrekt behandelt, während INITCAP dies möglicherweise nicht tut. Wenn Sie beispielsweise NLS_INITCAP auf die Zeichenkette “санкт-петербург” anwenden, gibt es “Санкт-Петербург” zurück (wobei der erste Buchstabe jedes Wortes in kyrillischer Schrift großgeschrieben wird), während INITCAP “Санкт-петербург” zurückgeben würde (wobei nur der erste Buchstabe des ersten Wortes in kyrillischer Schrift großgeschrieben wird).

Zusammenfassend lässt sich sagen, dass INITCAP eine einfache Funktion ist, die den ersten Buchstaben jedes Wortes in einer Zeichenkette groß schreibt, während NLS_INITCAP eine fortgeschrittenere Funktion ist, die die sprachspezifischen Regeln für die Großschreibung berücksichtigt. Wenn Sie mit nicht-englischen Zeichen arbeiten, empfiehlt es sich, NLS_INITCAP zu verwenden, um eine korrekte Großschreibung zu gewährleisten.

34
Q

Wie definiere ich eine Konstante?

A

Um eine Konstante zu definieren, fügen Sie das Schlüsselwort CONSTANT zwischen dem Namen der Konstante und ihrem Datentyp ein. Stellen Sie dann sicher, dass Sie einen Standard-/Initialwert angeben, da Oracle sonst einen Kompilierungsfehler ausgibt.

DECLARE
   constant1 CONSTANT DATE := SYSDATE;
BEGIN
   DBMS_OUTPUT.put_line ('Consistently Constant');
END;

oder

DECLARE
   constant1 CONSTANT DATE DEFAULT SYSDATE;
BEGIN
   DBMS_OUTPUT.put_line ('Consistently Constant');
END;
35
Q

Was kann ich mit der ASCII-Funktion machen?

A

Die Funktion ASCII gibt die Dezimaldarstellung für das übergebene Zeichen zurück. Wenn Sie eine Zeichenkette mit mehr als einem Zeichen übergeben, gibt die Funktion nur die Dezimaldarstellung des ersten Zeichens zurück.

Die ASCII-Funktion ist ziemlich nachsichtig. Sie können ihr ein Zeichen, 6 oder bis zu 32767 Zeichen übergeben, und sie gibt einfach die Dezimaldarstellung des ersten Zeichens in der Zeichenkette zurück. Was aber, wenn Sie die Dezimaldarstellung eines anderen Zeichens in der Zeichenkette erhalten möchten? Dann müssen Sie SUBSTR verwenden, um dieses Zeichen zu extrahieren. Hier ist ein kleines Dienstprogramm, das dies für Sie erledigt:

CREATE OR REPLACE FUNCTION plch_ascii_for (
   string_in     IN VARCHAR2,
   location_in   IN PLS_INTEGER DEFAULT 1)
   RETURN PLS_INTEGER
IS
BEGIN
   RETURN ASCII (SUBSTR (string_in, location_in, 1));
END plch_ascii_for;
/
BEGIN
   DBMS_OUTPUT.put_line ('Default = ' || plch_ascii_for ('abc'));
   DBMS_OUTPUT.put_line ('Positive = ' || plch_ascii_for ('abc', 2));
   DBMS_OUTPUT.put_line ('With NULL = ' || plch_ascii_for ('abc', NULL));
   DBMS_OUTPUT.put_line ('Negative = ' || plch_ascii_for ('abcd', -2));
   DBMS_OUTPUT.put_line (
      'Past end of string = ' || plch_ascii_for ('abc', 500));
END;

Default = 97
Positive = 98
With NULL =
Negative = 99
Past end of string =

36
Q

Ist diese Aussage korrekt?

Unter der Annahme, dass der Status einer Programmeinheit, die das %ROWTYPE-Attribut enthält, zum Zeitpunkt der Ausführung VALID ist, gibt es keinen Laufzeit-Overhead für die Verwendung dieses Attributs.

A

Korrekt

Oracle löst das Attribut %ROWTYPE zum Zeitpunkt der Kompilierung der Programmeinheit auf. Dieses Attribut hat keinen Einfluss auf das Verhalten oder die Leistung während der Laufzeit (wenn ein Programm ausgeführt wird).

37
Q

Die eingebaute Funktion SUBSTR hat die folgende Kopfzeile (definiert im Paket STANDARD):

function SUBSTR(STR1 VARCHAR2,
                POS PLS_INTEGER,
                LEN PLS_INTEGER := 2147483647)
  return VARCHAR2;

Kann ich für POS eine 0 eingeben?

A

SUBSTR verhält sich anmutig und großzügig, wenn Sie einen Wert von 0 für die Anfangsposition der Teilzeichenkette übergeben. Es wird nicht wütend und löst eine Ausnahme aus. Es geht einfach davon aus, dass Sie den Wert 1 übergeben wollten (viele andere Sprachen beginnen ihren String-Index bei 0).
Hier sind einige Regeln für das Verhalten von SUBSTR:

  • Wenn pos 0 ist, wird es als 1 behandelt.
  • Wenn pos positiv ist, zählt Oracle Database vom Anfang von, um das erste Zeichen zu finden.
  • Wenn pos negativ ist, zählt Oracle vom Ende von str1 aus rückwärts.
  • Wenn len nicht angegeben wird, gibt Oracle alle Zeichen bis zum Ende von str1 zurück. Wenn len kleiner als 1 ist, gibt Oracle null zurück.
38
Q

Welche Zahlen könnte der folgende Code ausgeben?

DECLARE
   c_iterations CONSTANT INTEGER := 10;
   l_list DBMS_SQL.number_table;
BEGIN
   FOR indx IN 1 .. c_iterations
   LOOP
      l_list (DBMS_RANDOM.VALUE (1, 5)) := indx;
   END LOOP;
   DBMS_OUTPUT.put_line ('*' || l_list.COUNT || '*');
END;
A

1, 2, 3, 4, 5

  • Die Funktion VALUE gibt einen numerischen Wert zwischen dem angegebenen unteren und oberen Wert zurück.
  • Da ich in meinem Aufruf von DBMS_RANDOM.VALUE 1 und 5 als eigentliche Argumente übergebe, wird die Funktion immer eine Zahl zwischen 1 und 5 zurückgeben. Die Anzahl der Elemente in der Sammlung wird also nie größer als 5 sein.
  • Wir wissen nicht, wie viele Elemente sich in der Sammlung befinden werden, wenn die Schleife beendet wird, aber wir können davon ausgehen, dass je größer der Wert von c_iterations ist, desto wahrscheinlicher ist es, dass die Indexwerte 1 bis 5 alle aufgefüllt werden und 5 angezeigt wird.
39
Q

Wie kann ich TRANSLATE Funktion verwenden?

A

Syntax: TRANSLATE(string, from_string, to_string)
Verwenden Sie TRANSLATE, um Zeichen aus einer Zeichenkette zu entfernen und sie durch NULL zu ersetzen. Denken Sie jedoch daran, dass Sie NULL nicht als Ersatz für die Zeichenmenge übergeben können. Wenn Sie dies tun, gibt TRANSLATE NULL zurück.

SELECT
  TRANSLATE( '5*[2+6]/{9-3}', '[]{}', '()()' )
FROM
  DUAL;

Result: ‘5*(2+6)/(9-3)’

DECLARE
   l_string    VARCHAR2 (20) := 'abcdabcdaXbY';
   l_no_abcs   VARCHAR2 (20);
BEGIN
   l_no_abcs := TRANSLATE (l_string, '1abc', '1'); 
   DBMS_OUTPUT.put_line (l_no_abcs);
END;

Result: ddXY

This call to TRANSLATE does the trick: it replaces 1 with 1 (no change) and then replaces any other characters in the list with NULL, since there are no other substitution characters after the 1.

40
Q

Beispiele für die Funktionen: SIGN, ABS und GREATEST

A
DECLARE
  num1 NUMBER := -10;
  num2 NUMBER := 20;
  num3 NUMBER := 0;
  sign_num1 NUMBER;
  abs_num1 NUMBER;
  greatest_num NUMBER;
BEGIN
  -- Find the sign of num1
  sign_num1 := SIGN(num1);
  DBMS_OUTPUT.PUT_LINE('Sign of num1: ' || sign_num1);
  
  -- Find the absolute value of num1
  abs_num1 := ABS(num1);
  DBMS_OUTPUT.PUT_LINE('Absolute value of num1: ' || abs_num1);
  
  -- Find the greatest number among num1, num2, and num3
  greatest_num := GREATEST(num1, num2, num3);
  DBMS_OUTPUT.PUT_LINE('Greatest number: ' || greatest_num);
END;

Result

Sign of num1: -1
Absolute value of num1: 10
Greatest number: 20

Wie Sie sehen können, gibt die Funktion SIGN das Vorzeichen einer Zahl zurück (-1 für negative Zahlen, 0 für Null und 1 für positive Zahlen), die Funktion ABS gibt den absoluten Wert einer Zahl zurück (den Abstand der Zahl von Null) und die Funktion GREATEST gibt den größten Wert aus einer Gruppe von Zahlen zurück. Diese Funktionen werden häufig in PL/SQL-Programmen verwendet, um mathematische Berechnungen und Datenmanipulationsaufgaben durchzuführen.

41
Q

Ein Beispiel für SIGN und DECODE.

A
DECLARE
  num1 NUMBER := 10;
  num2 NUMBER := -20;
  num3 NUMBER := 0;
  result VARCHAR2(20);
BEGIN
  -- Compare the sign of num1 and num2
  result := DECODE(SIGN(num1 - num2), 1, 'num1 is greater than num2',
                                        -1, 'num2 is greater than num1',
                                        0, 'num1 and num2 are equal');
  DBMS_OUTPUT.PUT_LINE(result);
  
  -- Compare the sign of num3 and num2
  result := DECODE(SIGN(num3 - num2), 1, 'num3 is greater than num2',
                                        -1, 'num2 is greater than num3',
                                        0, 'num3 and num2 are equal');
  DBMS_OUTPUT.PUT_LINE(result);
END;

Result

num1 is greater than num2
num2 is greater than num3

Wie Sie sehen können, gibt die Funktion SIGN -1 für negative Zahlen, 0 für Null und 1 für positive Zahlen zurück, und die Funktion DECODE vergleicht das Vorzeichen der Differenzen und gibt auf der Grundlage des Ergebnisses eine Meldung zurück. Diese Funktionen werden häufig in PL/SQL-Programmen verwendet, um Datenvergleiche und bedingte logische Aufgaben durchzuführen.

42
Q

Was ist eine Collection?

A

In PL/SQL (Procedural Language/Structured Query Language) ist eine Collection eine geordnete Gruppe von Elementen, die von unterschiedlichem Typ sein können. Sie ermöglicht es, mehrere Werte in einer einzigen Variablen zu speichern und so effizienter mit Datenmengen zu arbeiten und diese zu bearbeiten.

PL/SQL bietet mehrere Arten von Collections, darunter:

Index-by-Tables (Assoziative Arrays): Diese Sammlungen sind ähnlich wie Arrays in anderen Programmiersprachen. Sie assoziieren jedes Element mit einem Index und ermöglichen den Zugriff auf Elemente anhand ihrer Indexwerte. Index-by-Tables können spärliche (sparse) Indizes haben und können entweder dicht (aufeinanderfolgende Indizes) oder spärlich (nicht aufeinanderfolgende Indizes) sein.

Verschachtelte Tabellen (Nested Tables): Diese Sammlungen ähneln eindimensionalen Arrays, haben aber dynamische Größen. Sie benötigen keine vordefinierte Größe und können nach Bedarf erweitert oder verkleinert werden. Geschachtelte Tabellen können nur dichte Indizes haben.

VARRAY (Arrays mit variabler Größe): Diese Sammlungen haben eine feste Größe, die bei ihrer Deklaration angegeben wird, und können Elemente eines bestimmten Typs speichern. VARRAYs sind wie Arrays mit einer maximalen Kapazität, und sie unterstützen keine dynamische Größenänderung.

Collections können zum Speichern und Manipulieren von Daten in PL/SQL-Programmen verwendet werden. Sie können als Variablen, Parameter von Prozeduren und Funktionen oder als Spalten in Datenbanktabellen deklariert werden. Collections bieten leistungsstarke Funktionen für die Verarbeitung und Manipulation von Datensätzen und werden in der PL/SQL-Programmierung häufig verwendet, um komplexe Operationen mit mehreren Werten zu vereinfachen.

43
Q

Ist ein Record eine Collection?

A

Ein Record wird in PL/SQL nicht als eine Collection betrachtet.

In PL/SQL ist ein Record (Datensatz) ein zusammengesetzter Datentyp, mit dem Sie mehrere zusammenhängende Datenelemente zusammen speichern können. Er stellt eine einzelne Zeile oder eine Struktur von Feldern aus einer Tabelle oder einer Ergebnismenge dar. Jedes Feld innerhalb eines Datensatzes hat einen bestimmten Datentyp.

Ein Record (Datensatz) kann zwar mehrere Felder enthalten, wird aber nicht als Collection betrachtet, da er nicht die gleiche Funktionalität wie Collections bietet. Im Gegensatz zu Collections verfügt ein Datensatz nicht über Indizes oder die Möglichkeit, mehrere Werte auf strukturierte Weise zu speichern. Stattdessen stellt er eine einzelne Einheit von zusammenhängenden Daten dar.

Records (Datensätze) werden in PL/SQL häufig verwendet, um das Ergebnis einer Abfrage zu speichern, um Daten zwischen Prozeduren oder Funktionen zu übergeben oder um eigene Datenstrukturen zu definieren. Sie werden in erster Linie für die Organisation und Bearbeitung strukturierter Daten verwendet, während Sammlungen für die Speicherung und Bearbeitung von Wertesätzen konzipiert sind.

44
Q

Ein Beispiel für eine Collection: Index-by tables (Associative arrays)

A

Index-by-Tables (Assoziative Arrays): Diese Sammlungen sind ähnlich wie Arrays in anderen Programmiersprachen. Sie assoziieren jedes Element mit einem Index und ermöglichen den Zugriff auf Elemente anhand ihrer Indexwerte. Index-by-Tables können spärliche (sparse) Indizes haben und können entweder dicht (aufeinanderfolgende Indizes) oder spärlich (nicht aufeinanderfolgende Indizes) sein.

DECLARE
  TYPE index_by_table_type IS TABLE OF VARCHAR2(100) INDEX BY PLS_INTEGER;
  my_table index_by_table_type;
BEGIN
  my_table(1) := 'Apple';
  my_table(2) := 'Banana';
  my_table(3) := 'Orange';
  
  -- Accessing elements by index
  DBMS_OUTPUT.PUT_LINE('Element 2: ' || my_table(2)); -- Output: Banana
  
  -- Looping through the collection
  FOR i IN my_table.FIRST .. my_table.LAST LOOP
    DBMS_OUTPUT.PUT_LINE('Element ' || i || ': ' || my_table(i));
  END LOOP;
END;
45
Q

Ein Beispiel für eine Collection: Nested tables

A

Verschachtelte Tabellen (Nested Tables): Diese Sammlungen ähneln eindimensionalen Arrays, haben aber dynamische Größen. Sie benötigen keine vordefinierte Größe und können nach Bedarf erweitert oder verkleinert werden. Geschachtelte Tabellen können nur dichte Indizes haben.

DECLARE
  TYPE nested_table_type IS TABLE OF VARCHAR2(100);
  my_table nested_table_type := nested_table_type('Apple', 'Banana', 'Orange');
BEGIN
  -- Accessing elements by index
  DBMS_OUTPUT.PUT_LINE('Element 2: ' || my_table(2)); -- Output: Banana
  
  -- Looping through the collection
  FOR i IN my_table.FIRST .. my_table.LAST LOOP
    DBMS_OUTPUT.PUT_LINE('Element ' || i || ': ' || my_table(i));
  END LOOP;
END;
46
Q

Ein Beispiel für eine Collection: VARRAY (Variable-size arrays)

A

VARRAY (Arrays mit variabler Größe): Diese Sammlungen haben eine feste Größe, die bei ihrer Deklaration angegeben wird, und können Elemente eines bestimmten Typs speichern. VARRAYs sind wie Arrays mit einer maximalen Kapazität, und sie unterstützen keine dynamische Größenänderung.

DECLARE
  TYPE varray_type IS VARRAY(3) OF VARCHAR2(100);
  my_varray varray_type := varray_type('Apple', 'Banana', 'Orange');
BEGIN
  -- Accessing elements by index
  DBMS_OUTPUT.PUT_LINE('Element 2: ' || my_varray(2)); -- Output: Banana
  
  -- Looping through the collection
  FOR i IN 1 .. my_varray.COUNT LOOP
    DBMS_OUTPUT.PUT_LINE('Element ' || i || ': ' || my_varray(i));
  END LOOP;
END;
47
Q

Was ist PLS_INTEGER?

A

PLS_INTEGER ist ein skalarer Datentyp in PL/SQL, der zum Speichern von Ganzzahlwerten mit Vorzeichen verwendet wird. Es handelt sich um einen effizienten Ganzzahl-Datentyp, der im Vergleich zu den Standard-Datentypen INTEGER oder NUMBER in PL/SQL eine höhere Leistung bietet.

Der PLS_INTEGER-Datentyp hat die folgenden Eigenschaften:

Größenoptimierung: PLS_INTEGER ist für Leistung und Speicherung optimiert. Er verwendet Maschinenarithmetik, d. h. er nutzt die native Ganzzahldarstellung der zugrunde liegenden Hardware, was zu schnelleren Berechnungen führt.

Bereichsgrenzen: PLS_INTEGER kann Ganzzahlwerte im Bereich von -2.147.483.648 bis 2.147.483.647 speichern. Er deckt in den meisten Szenarien einen breiten Bereich praktischer Integer-Werte ab.

Automatische Konvertierung: PLS_INTEGER kann automatisch in und aus anderen numerischen Datentypen wie INTEGER oder NUMBER konvertiert werden, ohne dass explizite Konvertierungsfunktionen erforderlich sind.

Kompatibilität mit SQL: PLS_INTEGER kann in SQL-Anweisungen verwendet werden und wird bei der Interaktion mit der Datenbank automatisch auf den Datentyp NUMBER abgebildet.

PLS_INTEGER wird häufig in PL/SQL-Programmen für Schleifenzähler, Array-Indizes und andere ganzzahlige Berechnungen verwendet, bei denen die Leistung eine Rolle spielt. Er ist besonders nützlich bei der Arbeit mit großen Datensätzen oder leistungsrelevanten Operationen.

48
Q

Mein assoziatives Array ist leer. Ich verwende die Methode EXISTS, um festzustellen, ob ein Element mit dem Indexwert 1 in dieser Sammlung existiert. Welcher Wert wird von EXISTS zurückgegeben?

A

Verwenden Sie die Methode EXISTS, um festzustellen, ob ein Element am angegebenen Indexwert definiert ist. Sie können EXISTS mit allen Arten von Collections verwenden. Wenn Ihre Collection ein assoziatives Array ist, das durch Strings indiziert wird, können Sie einen String-Wert an EXISTS übergeben, wie in:

DECLARE
   TYPE by_string_t IS TABLE OF NUMBER
                          INDEX BY VARCHAR2 (100);
   l_numbers   by_string_t;
BEGIN
   IF l_numbers.EXISTS ('steven')
   THEN
      DBMS_OUTPUT.put_line ('exists!');
   END IF;
END;

EXISTS gibt FALSE zurück, wenn der Indexwert nicht definiert ist. Es spielt keine Rolle, ob die Sammlung selbst leer ist oder nicht.
Es wird nicht die Ausnahme VALUE_ERROR oder NO_DATA_FOUND ausgelöst.

49
Q

Welche der Optionen verknüpfen zwei Zeichenfolgen und zeigen die resultierende Zeichenfolge an?

BEGIN
   DBMS_OUTPUT.put_line (CONCAT ('abc', 'def'));
	 DBMS_OUTPUT.put_line (CONCATENATE ('abc', 'def'));
	 DBMS_OUTPUT.put_line ('abc' || 'def');
	 DBMS_OUTPUT.put_line ('abc' + 'def');
END;
A
  • Entweder die Funktion CONCAT oder der Verkettungsoperator erfüllen diesen Zweck. Die CONCAT-Funktion akzeptiert zwei String-Argumente und gibt die Verkettung dieser beiden Strings zurück.
  • Der Verkettungsoperator in PL/SQL ist eine “Doppelpipe” ||.
  • Wenn Sie mehr als zwei Zeichenketten verketten wollen, ist der Operator || definitiv die richtige Wahl.

DBMS_OUTPUT.put_line (CONCAT (‘abc’, ‘def’)); –> JA
DBMS_OUTPUT.put_line (CONCATENATE (‘abc’, ‘def’)); –> NEIN
DBMS_OUTPUT.put_line (‘abc’ || ‘def’); –> JA
DBMS_OUTPUT.put_line (‘abc’ + ‘def’); –> NEIN

50
Q

Kann ich einen Loop so verwenden?

BEGIN
   FOR i IN 3 .. 1 LOOP
      DBMS_OUTPUT.put_line (TO_CHAR (i));
   END LOOP;
END;
A

Nein, es muss von klein nach groß gehen.
Falls ich das verwenden möchte, kann ich REVERSE benutzen.

BEGIN
   FOR i IN REVERSE 1 .. 3 LOOP
      DBMS_OUTPUT.put_line (TO_CHAR (i));
   END LOOP;
END;