Direkt zum Inhalt

Die 20 wichtigsten PL/SQL-Interviewfragen und Antworten im Jahr 2026

Mach dich für PL/SQL-Vorstellungsgespräche bereit, mit wichtigen Themen wie Funktionen, Triggern, dynamischem SQL, Fehlerbehandlung, Best Practices und Fragen, die auf echten Szenarien basieren.
Aktualisiert 22. Dez. 2025  · 10 Min. lesen

PL/SQL, die prozedurale Spracherweiterung von SQL von Oracle, musst du einfach kennen, wenn du mit Oracle-Datenbanken arbeiten willst. Das gilt für wichtige Rollen wie Datenbankadministrator, Entwickler und Datenanalyst, die alle mit komplexer Geschäftslogik in der Datenbank umgehen müssen.

Ich denke, dass Interviewer die Kandidaten anhand von drei Hauptaspekten beurteilen:

  • Begriffliches Verständnis: Grundprinzipien, Datentypen, Kontrollstrukturen und Ausnahmebehandlung.
  • Praktische Programmierkenntnisse: Effiziente gespeicherte Prozeduren, Funktionen, Trigger und Pakete schreiben.
  • Leistungsaspekte: Optimierung von PL/SQL-Code, um die Ausführungszeit zu verbessern, den Ressourcenverbrauch zu minimieren und Fehler wie übermäßige Kontextwechsel zwischen SQL und PL/SQL zu vermeiden.

Um dir zu helfen, gebe ich dir hier einen Leitfaden zu PL/SQL-Interviewfragen. Ich fange mit den grundlegenden Konzepten an und gehe dann zu fortgeschritteneren Themen wie Massenverarbeitung, dynamischem SQL und Leistungsoptimierung über.

Wenn du die grundlegenden Konzepte der Oracle-Datenbank verstehen willst, empfehle ich dir unseren Kurs „Einführung in Oracle SQL “. Der ist echt wichtig, um zu lernen, wie man mit der Oracle-Datenbank arbeitet und wie die Datenbank PL/SQL zur Verarbeitung von Abfragen nutzt.

Fragen für Anfänger zum Thema PL/SQL im Vorstellungsgespräch

In der ersten Interviewphase kann der Interviewer grundlegende Fragen stellen, um dein Wissen über grundlegende Datenbank- und PL/SQL-Konzepte zu checken. Schau dir diese Fragen mal an und überleg dir Antworten, um dich auf die erste Phase des Vorstellungsgesprächs vorzubereiten.

1. Was ist PL/SQL?

PL/SQL ist die prozedurale Erweiterung von SQL durch Oracle. Im Gegensatz zu SQL, das deklarativ ist und sich auf das Abrufen von Daten und deren Bearbeitung konzentriert, können Entwickler mit PL/SQL prozedurale Logik implementieren, was es zu einem leistungsstarken Tool für das Schreiben komplexer Geschäftsregeln innerhalb der Datenbank macht. Es unterstützt Variablen, Schleifen, Bedingungen, Ausnahmebehandlung und modulare Programmierung durch Prozeduren, Funktionen und Pakete.

2. Wie sieht die Grundstruktur eines PL/SQL-Blocks aus?

Ein PL/SQL-Block ist die grundlegende Ausführungseinheit in PL/SQL und besteht aus vier Hauptabschnitten:

  • DECLARE (Optional): Wird benutzt, um Variablen, Konstanten, Cursor und benutzerdefinierte Typen zu definieren.

  • BEGIN: Der ausführbare Teil, wo SQL-Abfragen und prozedurale Anweisungen geschrieben werden.

  • EXCEPTION (Optional): Behandelt Laufzeitfehler und Ausnahmen, um eine reibungslose Fehlerbehebung zu gewährleisten.

  • END;: Zeigt das Ende des Blocks an.

3. Was sind die wichtigsten PL/SQL-Datentypen?

PL/SQL unterstützt verschiedene Datentypen, die wie folgt kategorisiert sind:

  • Skalare Typen: Einzelwert-Typen wie NUMBER, VARCHAR2, DATE, BOOLEAN.

  • Zusammengesetzte Typen: Sammlungen wie RECORD (benutzerdefinierte Strukturen) und TABLE/VARRAY (Arrays).

  • Referenztypen: Zeiger auf Datenbankobjekte, wie z. B. „ REF CURSOR “ für die dynamische Abfrageverarbeitung.

4. Was sind die grundlegenden Kontrollstrukturen in PL/SQL?

PL/SQL hat ein paar Kontrollstrukturen, die beim Verwalten des Programmablaufs helfen:

  • Schleifen: Dazu gehören „ LOOP “, „ FOR LOOP “ und „ WHILE LOOP “, die die wiederholte Ausführung von Anweisungen ermöglichen.

  • Bedingte Anweisungen: Dazu gehören die Anweisungen „ IF “ und „ CASE “, die je nach Bedingungen unterschiedliche Code-Blöcke ausführen. Die DECODE()-Funktion ist ein weiteres gutes Beispiel für eine Bedingung, die man sich mal anschauen sollte. 

Fragen für Fortgeschrittene zum Thema PL/SQL im Vorstellungsgespräch

Nachdem wir die grundlegenden Fragen geklärt haben, kommen wir jetzt zu ein paar Interviewfragen zum Thema Datenstrukturen für Fortgeschrittene. Nachdem sie deine Grundkenntnisse geprüft haben, werden die Interviewer jetzt deine technischen Fähigkeiten bei der Umsetzung und Anwendung von PL/SQL-Konzepten testen.

5. Was ist der Unterschied zwischen gespeicherten Prozeduren und Funktionen?

Gespeicherte Prozeduren und Funktionen sind beide wiederverwendbare PL/SQL-Codeblöcke, aber sie haben ziemlich unterschiedliche Zwecke.

Gespeicherte Prozeduren werden benutzt, um Operationen durchzuführen, die keinen Wert zurückgeben, wie zum Beispiel das Einfügen, Aktualisieren oder Löschen von Daten. Sie werden für Aufgaben verwendet, die Daten ändern oder komplizierte Vorgänge ausführen, ohne ein Ergebnis zurückzugeben.

Das folgende Verfahren aktualisiert zum Beispiel die Gehaltsinformationen ( salary ) des Mitarbeiters mit der angegebenen Gehaltsgruppe ( employee_id ), indem es die angegebene Gehaltsstufe ( p_increment ) hinzufügt, sodass sich das Gehalt dynamisch basierend auf den Eingabeparametern ändert.

CREATE PROCEDURE update_salary(p_emp_id NUMBER, p_increment NUMBER) AS  
BEGIN  
    -- Update the salary of the employee with the given ID  
    UPDATE employees  
    SET salary = salary + p_increment  
    WHERE employee_id = p_emp_id;  
END;

Funktionen hingegen geben nach der Ausführung von Operationen einen Wert zurück. Sie sind super für Berechnungen oder das Abrufen von Daten, bei denen ein Ergebnis rauskommen muss.

Die Funktion unten macht es einfacher, das Gehalt eines Mitarbeiters abzurufen, und kann in SQL-Abfragen oder anderen Prozeduren wiederverwendet werden.

CREATE FUNCTION get_employee_salary(p_emp_id NUMBER) RETURN NUMBER AS  
    v_salary NUMBER;  
BEGIN  
    -- Retrieve the salary for the given employee ID  
    SELECT salary INTO v_salary  
    FROM employees  
    WHERE employee_id = p_emp_id;  
    
    -- Return the retrieved salary  
    RETURN v_salary;  
END;

6. Was sind PL/SQL-Pakete?

PL/SQL-Pakete sind Sammlungen von Prozeduren, Funktionen und Variablen, die Code zusammenfassen, um ihn besser zu organisieren und wiederverwenden zu können. Die bestehen aus zwei Teilen:

  • Paket-Spezifikation: Deklariert öffentliche Elemente (Prozeduren, Funktionen, Variablen).
  • Paketinhalt: Enthält die Details zur Umsetzung der in der Spezifikation angegebenen Prozeduren und Funktionen.

Die folgende Abfrage erstellt zum Beispiel ein Paket „ employee_pkg “, das eine Prozedur zum Erhöhen des Gehalts eines Mitarbeiters und eine Funktion zum Abrufen der Gesamtzahl der Mitarbeiter definiert, wobei deren Implementierungen im Paketkörper bereitgestellt werden.

-- Create a package named 'employee_pkg'
CREATE PACKAGE employee_pkg AS  

    -- Procedure to increase an employee's salary by a percentage  
    PROCEDURE raise_salary(p_emp_id NUMBER, p_percent NUMBER);  

    -- Function to return the total number of employees  
    FUNCTION get_total_employees RETURN NUMBER;  

END employee_pkg;

7. Was sind PL/SQL-Trigger?

Trigger sind PL/SQL-Blöcke, die automatisch bei bestimmten Datenbankereignissen wie Einfügungen, Aktualisierungen oder Löschungen ablaufen. Trigger werden benutzt, um Geschäftsregeln durchzusetzen. Sie werden auch oft für Audits benutzt. Sie sind in folgende Kategorien unterteilt:

  • Trigger auf Zeilenebene: Führ das mal für jede betroffene Zeile aus.
  • Trigger auf Statement-Ebene: Wird einmal pro SQL-Anweisung ausgeführt, egal wie viele Zeilen betroffen sind.

Die folgende Abfrage erstellt einen Trigger „ AFTER UPDATEtrg_salary_audit für die Tabelle „ employees “, der Gehaltsänderungen in der Tabelle „ salary_audit table “ protokolliert und dabei die Mitarbeiter-ID, das alte und neue Gehalt sowie den Zeitstempel der Aktualisierung erfasst.

-- Create or replace a trigger 'trg_salary_audit'
CREATE OR REPLACE TRIGGER trg_salary_audit  
AFTER UPDATE OF salary ON employees  -- Fires after salary updates in 'employees' table
FOR EACH ROW  -- Executes for each updated row
BEGIN  
    -- Inserts old and new salary details into 'salary_audit' table
    INSERT INTO salary_audit (employee_id, old_salary, new_salary, change_date)  
    VALUES (:OLD.employee_id, :OLD.salary, :NEW.salary, SYSDATE);  
END;

Schau dir unser Tutorial zu SQL-Triggern an, damit du bereit bist, falls Trigger im Vorstellungsgespräch zur Sprache kommen. 

8. Wie geht man in PL/SQL mit Ausnahmen um?

PL/SQL hat Mechanismen zur Fehlerbehandlung, um Stabilität zu bringen und Abstürze zu vermeiden. Die Arten von Ausnahmen umfassen Folgendes:

  • Vordefinierte Ausnahmen: Eingebaute Ausnahmen wie NO_DATA_FOUND, TOO_MANY_ROWS und ZERO_DIVIDE.

  • Benutzerdefinierte Ausnahmen: Benutzerdefinierte Ausnahmen werden mit „ EXCEPTION “ deklariert und mit „ RAISE “ ausgelöst.

Der folgende PL/SQL-Block holt zum Beispiel das Gehalt eines Mitarbeiters mit der ID 100 ab, löst eine benutzerdefinierte Ausnahme aus, wenn das Gehalt unter 1000 liegt, und kümmert sich um mögliche Fehler, wie fehlende Mitarbeiterdatensätze und unerwartete Ausnahmen.

DECLARE  
    v_salary NUMBER;  -- Variable to store the employee's salary  
    e_low_salary EXCEPTION;  -- Custom exception for low salary  

BEGIN  
    -- Retrieve salary of employee with ID 100  
    SELECT salary INTO v_salary FROM employees WHERE employee_id = 100;  

    -- Raise exception if salary is below 1000  
    IF v_salary < 1000 THEN  
        RAISE e_low_salary;  
    END IF;  

EXCEPTION  
    WHEN NO_DATA_FOUND THEN  -- Handle case where employee ID is not found  
        DBMS_OUTPUT.PUT_LINE('Employee not found.');  
    WHEN e_low_salary THEN  -- Handle custom low salary exception  
        DBMS_OUTPUT.PUT_LINE('Salary is below the allowed threshold.');  
    WHEN OTHERS THEN  -- Handle any other unexpected errors  
        DBMS_OUTPUT.PUT_LINE('An unexpected error occurred: ' || SQLERRM);  

END;

Die besten Vorgehensweisen für die Ausnahmebehandlung umfassen Folgendes:

  • Rechne immer mit möglichen Ausnahmen.
  • Benutz aussagekräftige Fehlermeldungen.
  • Ausnahmen für die Prüfung protokollieren.
  • Mach den Code für die Ausnahmebehandlung kurz und konzentrier dich auf die Wiederherstellung.

9. Wie kannst du überprüfen, ob eine UPDATE-Anweisung ausgeführt wird oder nicht?

Mit dem SQL-Attribut „ %NOTFOUND “ kann man feststellen, ob die Anweisung „ UPDATE “ erfolgreich irgendwelche Datensätze geändert hat. Wenn die letzte ausgeführte SQL-Anweisung keine Auswirkungen auf Zeilen hatte, gibt diese Variable „ TRUE “ zurück.

Die folgende Abfrage aktualisiert zum Beispiel das Gehalt der Mitarbeiter in Abteilung 10, indem es um 10 % erhöht wird, und prüft dann mithilfe des Attributs „ %NOTFOUND “, ob irgendwelche Zeilen von der Anweisung „ UPDATE “ betroffen waren. Wenn keine Zeilen geändert wurden, kommt die Meldung „Keine Zeilen geändert“. Wenn Zeilen aktualisiert wurden, gibt es die Anzahl der betroffenen Zeilen über das Attribut „ SQL%ROWCOUNT “ aus.

DECLARE
    -- Declare a variable to store the number of rows updated
    rows_updated INTEGER;
BEGIN
    -- Perform an UPDATE statement on the 'employees' table
    UPDATE employees
    SET salary = salary * 1.1
    WHERE department_id = 10;

    -- Check if any rows were updated by using %NOTFOUND
    IF SQL%NOTFOUND THEN
        -- If no rows were updated, print a message
        DBMS_OUTPUT.PUT_LINE('No rows were updated.');
    ELSE
        -- If rows were updated, print how many rows were affected
        rows_updated := SQL%ROWCOUNT;  -- Store the number of rows updated
        DBMS_OUTPUT.PUT_LINE(rows_updated || ' rows were updated.');
    END IF;
END;
/

Fragen für Fortgeschrittene zu PL/SQL im Vorstellungsgespräch

Schauen wir uns jetzt ein paar fortgeschrittene Interviewfragen an, falls du dich für eine höhere Position bewirbst, die mehr Erfahrung erfordert.

10. Wie kann man die Leistung in PL/SQL verbessern?

Die Minimierung von Kontextwechseln zwischen SQL und PL/SQL ist entscheidend für die Optimierung der Leistung. Jeder Wechsel bringt einen Mehraufwand mit sich, der die Ausführungszeiten verlangsamen kann, vor allem wenn man oft zwischen den beiden hin und her wechselt.

11. Wie nutzt man Massenoperationen, um Kontextwechsel zu minimieren?

PL/SQL hat Techniken für die Massenverarbeitung, um die Interaktion zwischen SQL und PL/SQL zu verbessern, indem mehrere Zeilen auf einmal geholt oder geändert werden.

Der folgende PL/SQL-Block holt zum Beispiel alle Mitarbeiter aus Abteilung 10 mit „ BULK COLLECT “ in eine Sammlung und geht sie durch, um den Namen jedes Mitarbeiters auszugeben. Das verbessert die Leistung, weil es weniger Kontextwechsel zwischen SQL und PL/SQL braucht.

DECLARE  
    -- Define a table-type collection based on the 'employees' table structure  
    TYPE emp_table IS TABLE OF employees%ROWTYPE;  
    v_emps emp_table;  -- Declare a variable of this type  

BEGIN  
    -- Bulk fetch employees from department 10 into the collection  
    SELECT * BULK COLLECT INTO v_emps FROM employees WHERE department_id = 10;  

    -- Loop through the collection and print employee names  
    FOR i IN 1..v_emps.COUNT LOOP  
        DBMS_OUTPUT.PUT_LINE('Employee: ' || v_emps(i).employee_name);  
    END LOOP;  

END;

Außerdem nutzt dieser PL/SQL-Block „ FORALL “ für Massenaktualisierungen, um das Gehalt der Mitarbeiter mit den IDs 101, 102 und 103 um 10 % zu erhöhen.

DECLARE  
    -- Define a table-type collection for employee IDs  
    TYPE t_emp_ids IS TABLE OF employees.employee_id%TYPE;  
    -- Initialize collection with specific employee IDs  
    v_emp_ids t_emp_ids := t_emp_ids(101, 102, 103);  

BEGIN  
    -- Bulk update salaries by 10% for specified employee IDs  
    FORALL i IN 1..v_emp_ids.COUNT  
        UPDATE employees SET salary = salary * 1.10 WHERE employee_id = v_emp_ids(i);  

END;

12. Was sind dynamisches SQL und Referenzcursor?

Dynamisches SQL ermöglicht die dynamische Ausführung von SQL-Anweisungen zur Laufzeit, was bei variablen Namen von Tabellen, Spalten oder Abfragestrukturen nützlich ist.

Der folgende PL/SQL-Block zählt mit dynamischem SQL die Zeilen in der Tabelle „ employees ” und zeigt das Ergebnis an. Ich mag diese Art von Ansatz, weil er Flexibilität ermöglicht.

DECLARE  
    v_table_name VARCHAR2(50) := 'employees';  -- Store table name  
    v_count NUMBER;  -- Variable to hold row count  

BEGIN  
    -- Dynamically count rows in the specified table  
    EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM ' || v_table_name INTO v_count;  

    -- Print the total count  
    DBMS_OUTPUT.PUT_LINE('Total Employees: ' || v_count);  

END;  

Ref-Cursor sind dynamische Cursor, die zur Laufzeit geöffnet, abgerufen und geschlossen werden können, sodass Abfrageergebnisse zwischen Programmeinheiten ausgetauscht werden können.

Der folgende PL/SQL-Block nutzt eine Abfrage „ REF CURSOR “, um die Namen der Mitarbeiter aus Abteilung 20 abzurufen und auszugeben. Der Cursor wird dynamisch geöffnet, mit einer Schleife durchlaufen und nach der Verarbeitung geschlossen.

DECLARE  
    -- Define a REF CURSOR type  
    TYPE emp_ref_cursor IS REF CURSOR;  
    v_cursor emp_ref_cursor;  -- Declare a cursor variable  
    v_name employees.employee_name%TYPE;  -- Variable to store employee name  

BEGIN  
    -- Open the cursor for employees in department 20  
    OPEN v_cursor FOR SELECT employee_name FROM employees WHERE department_id = 20;  

    -- Fetch and print employee names in a loop  
    LOOP  
        FETCH v_cursor INTO v_name;  
        EXIT WHEN v_cursor%NOTFOUND;  
        DBMS_OUTPUT.PUT_LINE('Employee: ' || v_name);  
    END LOOP;  

    -- Close the cursor  
    CLOSE v_cursor;  

END;

13. Wie gehst du mit Fehlern bei der Tabelle um?

Fehler beim Ändern von Tabellen treten auf, wenn ein Trigger versucht, die Tabelle zu ändern, auf der er ausgelöst wird. Ein zusammengesetzter Trigger ermöglicht es, die Triggerausführung in mehrere Phasen aufzuteilen, wie z. B. „ BEFORE “, „ AFTER “ und „ FOR EACH ROW “, um Probleme durch direkte Änderungen zu vermeiden.

Der zusammengesetzte Trigger unten protokolliert Gehaltsänderungen in der Tabelle „ salary_audit “ auf effiziente Weise, indem er vor jeder Zeilenaktualisierung Daten sammelt und nach der Anweisung einen Masseneintrag durchführt, wodurch Kontextwechsel reduziert und die Leistung verbessert werden.

CREATE OR REPLACE TRIGGER trg_salary_audit  
FOR UPDATE OF salary ON employees  -- Trigger fires on salary updates  
COMPOUND TRIGGER  

    -- Declare an associative array to store audit records  
    TYPE t_salary_audit IS TABLE OF salary_audit%ROWTYPE INDEX BY PLS_INTEGER;  
    v_audit_data t_salary_audit;  
    v_idx PLS_INTEGER := 0;  

    -- Before updating each row, store old and new salary details  
    BEFORE EACH ROW IS  
    BEGIN  
        v_idx := v_idx + 1;  
        v_audit_data(v_idx).employee_id := :OLD.employee_id;  
        v_audit_data(v_idx).old_salary := :OLD.salary;  
        v_audit_data(v_idx).new_salary := :NEW.salary;  
        v_audit_data(v_idx).change_date := SYSDATE;  
    END BEFORE EACH ROW;  

    -- After the statement, insert all audit records in bulk  
    AFTER STATEMENT IS  
    BEGIN  
        FORALL i IN 1..v_idx  
            INSERT INTO salary_audit VALUES v_audit_data(i);  
    END AFTER STATEMENT;  

END trg_salary_audit;

14. Was ist Überladung in PL/SQL?

Überladen ermöglicht es, mehrere Prozeduren oder Funktionen mit demselben Namen, aber unterschiedlichen Parametern innerhalb eines Pakets zu definieren. Das macht den Code besser lesbar und pflegeleichter, weil es mehrere Möglichkeiten gibt, ähnliche Vorgänge durchzuführen.

In der folgenden Abfrage macht der Paketkörper zwei überladene Prozeduren namens „ update_salary “ klar: Der eine erhöht das Gehalt eines Mitarbeiters um einen bestimmten Betrag, während der andere ein neues Gehalt mit einem Gültigkeitsdatum festlegt und die Tabelle „ employees “ entsprechend aktualisiert.

-- Create the package specification
CREATE OR REPLACE PACKAGE emp_pkg AS  
    -- Procedure to increment salary by a specified amount  
    PROCEDURE update_salary(p_emp_id NUMBER, p_increment NUMBER);

    -- Overloaded procedure to set a new salary with an effective date  
    PROCEDURE update_salary(p_emp_id NUMBER, p_new_salary NUMBER, p_effective_date DATE);
END emp_pkg;
/
-- Create the package body
CREATE OR REPLACE PACKAGE BODY emp_pkg AS  

    -- Procedure to increment salary by a specified amount  
    PROCEDURE update_salary(p_emp_id NUMBER, p_increment NUMBER) AS  
    BEGIN  
        UPDATE employees  
        SET salary = salary + p_increment  
        WHERE employee_id = p_emp_id;  
    END update_salary;  

    -- Overloaded procedure to set a new salary with an effective date  
    PROCEDURE update_salary(p_emp_id NUMBER, p_new_salary NUMBER, p_effective_date DATE) AS  
    BEGIN  
        UPDATE employees  
        SET salary = p_new_salary, last_update = p_effective_date  
        WHERE employee_id = p_emp_id;  
    END update_salary;  

END emp_pkg;
/

15. Was sind die Compiler-Direktiven und Pragmas in PL/SQL?

PL/SQL hat Compiler-Direktiven (PRAGMA), um Code zu optimieren und Ausnahmen zu verarbeiten. Zu den gängigen Pragmas gehören:

  • PRAGMA EXCEPTION_INIT: Ordnet eine benutzerdefinierte Ausnahme einem Oracle-Fehlercode zu.

  • PRAGMA SERIALLY_REUSABLE: Optimiert die Nutzung des Paketspeichers für mehr Skalierbarkeit.

Der folgende PL/SQL-Block kümmert sich um das Hinzufügen eines Mitarbeiters mit einem ungültigen Gehalt, indem er eine benutzerdefinierte Ausnahme e_invalid_salary verwendet, die dem Fehlercode -20001 zugeordnet ist. Wenn die Ausnahme ausgelöst wird, wird eine Fehlermeldung angezeigt.

DECLARE  
    e_invalid_salary EXCEPTION;  -- Declare custom exception for invalid salary  
    PRAGMA EXCEPTION_INIT(e_invalid_salary, -20001);  -- Associate exception with error code -20001  
BEGIN  
    -- Attempt to insert an employee with invalid salary  
    INSERT INTO employees (employee_id, salary) VALUES (999, -1000);  
EXCEPTION  
    -- Handle the custom exception and print a message  
    WHEN e_invalid_salary THEN  
        DBMS_OUTPUT.PUT_LINE('Invalid salary detected!');  
END;  

16. Was gibt's für verschiedene Methoden, um PL/SQL-Code zu verfolgen und zu debuggen?

PL/SQL hat ein paar eingebaute Pakete, mit denen man die Leistung von Code verfolgen und debuggen kann. Zu den gängigen Methoden gehören die Verwendung von „ DBMS_TRACE “ zur Verfolgung des Ausführungsflusses, „ DBMS_APPLICATION_INFO “ zur Überwachung der Sitzungsaktivität und „ DBMS_SESSION “ zum Sammeln von Diagnoseinformationen auf Sitzungsebene.

Die folgende Abfrage aktiviert erst mal die SQL-Ablaufverfolgung mit „ DBMS_SESSION.set_sql_trace(TRUE) “ und legt dann mit „ DBMS_APPLICATION_INFO.set_client_info() “ die spezifischen Sitzungsinfos für die Überwachung fest. Der PL/SQL-Block wird ausgeführt, der eine Operation „ UPDATE “ simuliert. Schließlich wird die Ablaufverfolgung nach der Ausführung mit „ DBMS_SESSION.set_sql_trace(FALSE) “ deaktiviert.

-- Enable tracing for the current session using DBMS_SESSION
BEGIN
   -- Start session-level tracing
   DBMS_SESSION.set_sql_trace(TRUE);
END;
/

-- Set application information using DBMS_APPLICATION_INFO
BEGIN
   -- Set the application name and action for session monitoring
   DBMS_APPLICATION_INFO.set_client_info('Trace Debug Session');
   DBMS_APPLICATION_INFO.set_action('Debugging PL/SQL Code');
END;
/

-- Example PL/SQL block that simulates a process for debugging
DECLARE
   v_employee_id NUMBER := 100;
BEGIN
   -- Example query to fetch employee details
   FOR rec IN (SELECT first_name, last_name FROM employees WHERE employee_id = v_employee_id) LOOP
      DBMS_OUTPUT.put_line('Employee: ' || rec.first_name || ' ' || rec.last_name);
   END LOOP;
   
   -- Simulate some logic that could be traced
   IF v_employee_id = 100 THEN
      DBMS_OUTPUT.put_line('Employee ID is 100');
   END IF;
END;
/

-- Disable tracing after the session is complete
BEGIN
   -- Stop session-level tracing
   DBMS_SESSION.set_sql_trace(FALSE);
END;
/

Szenariobasierte PL/SQL-Interviewfragen

In echten Unternehmensanwendungen wird PL/SQL benutzt, um komplizierte Geschäftslogik zu verarbeiten. Interviewer checken oft, wie gut ein Bewerber PL/SQL in echten Situationen anwenden kann. Hier sind ein paar wichtige Herausforderungen und Strategien, wie man sie lösen kann.

Für den nächsten und letzten Abschnitt würde ich dir empfehlen, dir zu überlegen, wie du Fragen nach diesem Muster beantworten kannst, wenn du ein Vorstellungsgespräch hast. Versuch aber natürlich, deine Antwort auf deine Branche zuzuschneiden oder deine eigenen Erfahrungen einzubringen. Das Gleiche gilt, wenn du ein Vorstellungsgespräch mit einem Bewerber führst und Ideen suchst, wie du Fragen stellen und die Ausführlichkeit der Antworten beurteilen kannst. In diesem Fall hoffe ich, dass dieser Abschnitt dir sowohl für deine Fragen als auch für deine Bewertungskriterien als Inspiration dient .

Verbessere die SQL-Kenntnisse deines Teams

Trainiere dein Team in SQL mit DataCamp for Business. Umfassende Schulungen, praktische Projekte und detaillierte Leistungskennzahlen für dein Unternehmen.

Fordere noch heute eine Demo an!
business-homepage-hero.png

17. Wie entwirft man Trigger in Umgebungen mit hoher Parallelität?

Stell dir vor, du musst eine Geschäftsregel durchsetzen, nach der das Gehalt eines Mitarbeiters nicht öfter als einmal pro Tag geändert werden darf. Die Datenbank hat aber viele gleichzeitige Transaktionen, und ein einfacher Trigger könnte zu Konflikten oder Performance-Problemen führen.

Anstatt einen Trigger auf Zeilenebene zu verwenden, der bei jeder Aktualisierung ausgelöst wird und die Leistung beeinträchtigen kann, solltest du einen Trigger auf Anweisungsebene mit einer Log-Tabelle verwenden, um mehrere Gehaltsaktualisierungen am selben Tag zu verhindern.

Der folgende Trigger verhindert zum Beispiel, dass das Gehalt eines Mitarbeiters am selben Tag mehrmals aktualisiert wird, indem er die Tabelle „ salary_update_log “ überprüft, bevor er eine Aktualisierung zulässt. Wenn das Gehalt heute schon aktualisiert wurde, kommt es zu einem Fehler; sonst wird das Aktualisierungsdatum protokolliert.

-- Create a table to log the last salary update for each employee
CREATE TABLE salary_update_log (
    employee_id NUMBER PRIMARY KEY,  -- Employee ID as primary key
    last_update DATE  -- Date of the last salary update
);

-- Create or replace a compound trigger to prevent multiple salary updates on the same day
CREATE OR REPLACE TRIGGER trg_prevent_multiple_salary_update  
FOR UPDATE OF salary ON employees  
COMPOUND TRIGGER  

    -- Declare a variable to store last salary update date per row
    TYPE emp_log_type IS TABLE OF DATE INDEX BY PLS_INTEGER;
    emp_log emp_log_type;

    BEFORE STATEMENT IS  
    BEGIN  
        -- Load existing salary update logs into memory for reference
        FOR rec IN (SELECT employee_id, last_update FROM salary_update_log) LOOP  
            emp_log(rec.employee_id) := rec.last_update;  
        END LOOP;  
    END BEFORE STATEMENT;  

    BEFORE EACH ROW IS  
    BEGIN  
        -- Check if an entry exists for this employee
        IF emp_log.EXISTS(:NEW.employee_id) THEN  
            -- Validate if salary was updated today
            IF emp_log(:NEW.employee_id) = TRUNC(SYSDATE) THEN  
                RAISE_APPLICATION_ERROR(-20010, 'Salary can only be updated once per day');  
            ELSE  
                -- Update log in memory
                emp_log(:NEW.employee_id) := TRUNC(SYSDATE);  
            END IF;  
        ELSE  
            -- Insert a new log entry into memory
            emp_log(:NEW.employee_id) := TRUNC(SYSDATE);  
        END IF;  
    END BEFORE EACH ROW;  

    AFTER STATEMENT IS  
    BEGIN  
        -- Apply changes to the log table after all row updates
        FOR i IN emp_log.FIRST .. emp_log.LAST LOOP  
            MERGE INTO salary_update_log l  
            USING (SELECT i AS employee_id, emp_log(i) AS last_update FROM DUAL) s  
            ON (l.employee_id = s.employee_id)  
            WHEN MATCHED THEN  
                UPDATE SET l.last_update = s.last_update  
            WHEN NOT MATCHED THEN  
                INSERT (employee_id, last_update) VALUES (s.employee_id, s.last_update);  
        END LOOP;  
    END AFTER STATEMENT;  

END trg_prevent_multiple_salary_update;

Das obige Beispiel würde die Sperrung auf Zeilenebene reduzieren und Transaktionskonflikte bei Massenaktualisierungen minimieren.

18. Wie teilst du große Transaktionen in kleinere Teile auf, um die Zuverlässigkeit zu erhöhen?

Stell dir vor, ein Bankensystem muss eine Massenaktualisierung machen, um die Zinssätze für Millionen von Kundenkonten anzupassen. Eine einzelne große Transaktion kann Tabellen zu lange sperren oder zu Rollback-Fehlern führen.

In diesem Fall solltest du die Massenverarbeitung mit „ COMMIT “ in Stapeln nutzen, um die Daten schrittweise zu verarbeiten und Konflikte zu vermeiden.

Der folgende PL/SQL-Block macht die Lösung klar, indem er mit „ BULK COLLECT “ die Konto-IDs abruft und sie dann durchläuft, um den Zinssatz um 5 % zu erhöhen. Es speichert die Änderungen nach jeweils 1000 Aktualisierungen, um die Leistung zu verbessern und den Ressourcenverbrauch zu reduzieren. Ein abschließender Commit stellt sicher, dass alle verbleibenden Aktualisierungen gespeichert werden.

DECLARE  
    -- Define a collection type for account IDs  
    TYPE t_accounts IS TABLE OF NUMBER;  -- Use NUMBER instead of referencing accounts.account_id
    v_account_ids t_accounts;  -- Variable to store account IDs  
    v_batch_size CONSTANT NUMBER := 1000;  -- Batch size for commits  

BEGIN  
    -- Bulk collect all account IDs into the collection  
    SELECT account_id BULK COLLECT INTO v_account_ids FROM accounts;  

    -- Loop through each account ID to update the interest rate  
    FOR i IN 1 .. v_account_ids.COUNT LOOP  
        UPDATE accounts  
        SET interest_rate = interest_rate * 1.05  -- Increase interest rate by 5%  
        WHERE account_id = v_account_ids(i);  

        -- Commit after every 1000 updates  
        IF MOD(i, v_batch_size) = 0 THEN  
            COMMIT;  
        END IF;  
    END LOOP;  

    COMMIT; -- Final commit for any remaining updates  
END;
/

Diese Lösung würde die Zuverlässigkeit in Finanzsystemen wie der Gehaltsabrechnung sichern, indem sie Transaktionsfehler verhindert.

19. Wie packt man komplexe Logik in Pakete, damit sie pflegbar bleibt?

Ein Einzelhandelsunternehmen muss ein Bestellverarbeitungssystem einführen, das mehrere Schritte umfasst: Überprüfen, ob was auf Lager ist, Sachen reservieren, Rabatte ausrechnen und die Transaktionshistorie aufzeichnen.

Anstatt separate, eigenständige Prozeduren zu schreiben, musst du diese Logik strukturiert und wartungsfreundlich organisieren. Also, nutze PL/SQL-Pakete, um zusammengehörige Prozeduren und Funktionen zu kapseln, damit der Code besser wiederverwendbar und wartbar ist.

Die unten stehende Paketspezifikation beschreibt Funktionen und Verfahren für die Auftragsabwicklung, wie zum Beispiel die Überprüfung des Lagerbestands, die Reservierung von Lagerbeständen, die Berechnung von Rabatten und die Protokollierung des Transaktionsstatus. Es bietet einen modularen Ansatz für die Bearbeitung von auftragsbezogenen Aufgaben.

-- Create a package specification for order processing functions and procedures
CREATE PACKAGE order_processing_pkg AS  

    -- Function to check if enough inventory is available for the product
    FUNCTION check_inventory(p_product_id NUMBER, p_quantity NUMBER) RETURN BOOLEAN;  

    -- Procedure to reserve stock for a specific order
    PROCEDURE reserve_stock(p_order_id NUMBER, p_product_id NUMBER, p_quantity NUMBER);  

    -- Function to calculate discount based on customer and total amount
    FUNCTION calculate_discount(p_customer_id NUMBER, p_total_amount NUMBER) RETURN NUMBER;  

    -- Procedure to log the status of a transaction
    PROCEDURE log_transaction(p_order_id NUMBER, p_status VARCHAR2);  

END order_processing_pkg;

Dann nutzen wir den folgenden Paketkörper, um die in der Paketspezifikation definierten Funktionen und Prozeduren umzusetzen. Es kümmert sich um wichtige Sachen wie die Überprüfung der Lagerverfügbarkeit, die Reservierung von Lagerbeständen, die Berechnung von Rabatten und die Protokollierung des Transaktionsstatus und sorgt so für einen reibungslosen Ablauf der Bestellabwicklung.

-- Create the package body implementing the functions and procedures for order processing
CREATE PACKAGE BODY order_processing_pkg AS  

    -- Function to check if sufficient inventory is available for the product
    FUNCTION check_inventory(p_product_id NUMBER, p_quantity NUMBER) RETURN BOOLEAN AS  
        v_available_qty NUMBER;  -- Variable to store available quantity  
    BEGIN  
        -- Retrieve the available quantity from inventory
        SELECT stock_quantity INTO v_available_qty FROM inventory WHERE product_id = p_product_id;  
        -- Return true if enough stock is available, otherwise false
        RETURN v_available_qty >= p_quantity;  
    END check_inventory;  

    -- Procedure to reserve stock for a specific order
    PROCEDURE reserve_stock(p_order_id NUMBER, p_product_id NUMBER, p_quantity NUMBER) AS  
    BEGIN  
        -- Deduct the ordered quantity from the inventory
        UPDATE inventory SET stock_quantity = stock_quantity - p_quantity WHERE product_id = p_product_id;  
    END reserve_stock;  

    -- Function to calculate a discount based on the total order amount
    FUNCTION calculate_discount(p_customer_id NUMBER, p_total_amount NUMBER) RETURN NUMBER AS  
        v_discount NUMBER := 0;  -- Initialize discount to 0  
    BEGIN  
        -- Apply 10% discount if the total amount is greater than 500
        IF p_total_amount > 500 THEN  
            v_discount := p_total_amount * 0.10;  
        END IF;  
        -- Return the calculated discount
        RETURN v_discount;  
    END calculate_discount;  

    -- Procedure to log the transaction status
    PROCEDURE log_transaction(p_order_id NUMBER, p_status VARCHAR2) AS  
    BEGIN  
        -- Insert a log entry for the order status
        INSERT INTO order_log (order_id, status, log_date) VALUES (p_order_id, p_status, SYSDATE);  
    END log_transaction;  

END order_processing_pkg;

20. Wie gehst du mit Deadlocks in Systemen mit vielen Transaktionen um?

Stell dir vor, ein Finanzsystem aktualisiert oft mehrere miteinander verbundene Tabellen gleichzeitig. Deadlocks passieren, wenn zwei Transaktionen auf die gesperrten Ressourcen der anderen warten, was zu Leistungsengpässen führt.

Um dieses Problem zu lösen, solltest du die Zeilen immer in einer einheitlichen Reihenfolge über alle Transaktionen hinweg sperren. Benutz auch die Klausel „ NOWAIT “ oder „ SKIP LOCKED “, um zu verhindern, dass du ewig warten musst.

Der folgende PL/SQL-Block versucht zum Beispiel, eine bestimmte Zeile in der Tabelle „accounts“ für die Aktualisierung mit der Klausel „ FOR UPDATE NOWAIT “ zu sperren, was dazu führt, dass die Transaktion sofort fehlschlägt, wenn eine andere Sitzung die Zeile bereits gesperrt hat. Nach dem Sperren wird der Transaktionsstatus aktualisiert und die Änderungen werden übernommen. Wenn ein Fehler passiert, fängt es die Ausnahme ab und zeigt 'ne Fehlermeldung an.

DECLARE  
    v_balance NUMBER(15,2);  -- Declare variable to store the account balance  
BEGIN  
    -- Lock the account row for update to prevent other sessions from modifying it  
    SELECT balance INTO v_balance FROM accounts  
    WHERE account_id = 101 FOR UPDATE NOWAIT;  

    -- Update the transaction status to 'Processed' for all transactions related to this account  
    UPDATE transactions  
    SET status = 'Processed'  
    WHERE account_id = 101 AND status = 'Pending';  -- Update only pending transactions  

    COMMIT;  -- Commit the changes  

EXCEPTION  
    -- Handle errors, such as locking issues or unexpected exceptions  
    WHEN OTHERS THEN  
        DBMS_OUTPUT.PUT_LINE('Transaction failed: ' || SQLERRM);  
        ROLLBACK;  -- Ensure rollback in case of failure  
END;
/

Genauso macht dieser PL/SQL-Block das mit ausstehenden Transaktionen: Er sperrt sie für Updates mit ` FOR UPDATE SKIP LOCKED`, sodass er Zeilen überspringen kann, die schon von anderen Sitzungen gesperrt sind. Es setzt den Status jeder Transaktion auf „In Bearbeitung“ und übernimmt die Änderungen am Ende.

DECLARE  
    -- Declare a cursor to select pending transactions and lock rows for update
    CURSOR c_pending_txns IS  
        SELECT transaction_id FROM transactions WHERE status = 'Pending' FOR UPDATE SKIP LOCKED;  -- Skip locked rows  

BEGIN  
    -- Loop through the pending transactions
    FOR txn IN c_pending_txns LOOP  
        -- Update the status of each transaction to 'Processing'
        UPDATE transactions SET status = 'Processing' WHERE transaction_id = txn.transaction_id;  
    END LOOP;  
    COMMIT;  -- Commit the changes to finalize the transaction updates  
END;

Fazit und weitere Infos

Für Jobs, wo Oracle im Mittelpunkt steht, suchen Arbeitgeber Leute, die guten PL/SQL-Code schreiben, mit echten Herausforderungen klarkommen und die Datenbankleistung verbessern können. Ich empfehle dir, die offizielle Oracle-Dokumentation zur PL/SQL-Sprachreferenz zu lesen, um einen detaillierten Leitfaden und Best Practices zu PL/SQL zu bekommen. Oracle Live SQL (Interactive PL/SQL Playground) gibt dir Zugriff auf die Cloud-Plattform von Oracle, um PL/SQL-Abfragen online auszuführen. Ich empfehle dir auch, der Oracle Community beizutreten, um dich mit Oracle-Experten und -Entwicklern auszutauschen, und das Stack Overflow -Forum zu besuchen, um Antworten auf Fragen zu PL/SQL zu finden.

Aber nichts geht über einen gut durchdachten Lernplan. Deshalb empfehle ich dir echt, unseren Kurs „Einführung in Oracle SQL“ zu machen, der meiner Meinung nach der beste Weg ist, um ein echter Experte zu werden. Wenn du deine Kenntnisse im Umgang mit Datenbanken vertiefen möchtest, empfehle ich dir außerdem unseren Kurs „Datenbankdesign“, in dem du lernst, wie du Datenbanken erstellst und verwaltest und das für deine Anforderungen geeignete DBMS auswählst. Probier doch mal unseren Lernpfad „Associate Data Engineer in SQL“ aus, um die Grundlagen des Data Engineering und Data Warehousing zu lernen. 

Und zu guter Letzt: Wenn du Bewerber interviewst und auch andere weiterbilden möchtest, melde dich bei unserem DataCamp for Business -Team. Mit praktischen Projekten und maßgeschneiderten Lernpfaden kann DataCamp ganze Teams weiterbilden. Das ist eine super Möglichkeit für Arbeitgeber, Qualifikationslücken zu schließen und das Selbstvertrauen und die Glaubwürdigkeit eines Teams zu stärken. Also, melde dich noch heute bei unserem Team.


Allan Ouko's photo
Author
Allan Ouko
LinkedIn
Ich verfasse Artikel, die Datenwissenschaft und Analytik vereinfachen und leicht verständlich und zugänglich machen.

Häufig gestellte Fragen zu PL SQL

Was ist PL/SQL und wie unterscheidet es sich von SQL?

PL/SQL ist eine prozedurale Sprache, die von Oracle entwickelt wurde und Kontrollstrukturen und Fehlerbehandlung ermöglicht, während SQL deklarativ ist und sich um das Abrufen/Bearbeiten von Daten kümmert.

Was ist ein PL/SQL-Paket?

Eine Sammlung von Prozeduren, Funktionen, Variablen und Cursorn für modulare Programmierung und Wiederverwendbarkeit.

Was ist der Unterschied zwischen einer Prozedur und einer Funktion?

Prozeduren machen was, ohne einen Wert zurückzugeben, während Funktionen einen Wert zurückgeben, den man in Abfragen nutzen kann.

Was sind Trigger in PL/SQL?

Automatische Aktionen, die vor oder nach den Vorgängen „ INSERT “, „ UPDATE “ und „ DELETE “ gemacht werden.

Was ist Massenverarbeitung in PL/SQL?

Die Massenverarbeitung (BULK COLLECT, FORALL) macht die Leistung besser, indem sie die Kontextwechsel zwischen PL/SQL- und SQL-Engines bei der Verarbeitung großer Datensätze reduziert.

Themen

Lerne SQL mit DataCamp

Kurs

Datenbearbeitung in SQL

4 Std.
306.9K
Lerne, mit komplexen SQL-Abfragen diverse Data-Science-Aufgaben zu lösen und Datensätze für Analysen in PostgreSQL vorzubereiten.
Details anzeigenRight Arrow
Kurs starten
Mehr anzeigenRight Arrow
Verwandt

Blog

Die 50 wichtigsten AWS-Interviewfragen und Antworten für 2026

Ein kompletter Leitfaden, um die grundlegenden, mittleren und fortgeschrittenen AWS-Interviewfragen zu checken, zusammen mit Fragen, die auf echten Situationen basieren.
Zoumana Keita 's photo

Zoumana Keita

15 Min.

Blog

Die 20 besten Snowflake-Interview-Fragen für alle Niveaus

Bist du gerade auf der Suche nach einem Job, der Snowflake nutzt? Bereite dich mit diesen 20 besten Snowflake-Interview-Fragen vor, damit du den Job bekommst!
Nisha Arya Ahmed's photo

Nisha Arya Ahmed

15 Min.

Tutorial

30 coole Python-Tricks für besseren Code mit Beispielen

Wir haben 30 coole Python-Tricks zusammengestellt, mit denen du deinen Code verbessern und deine Python-Kenntnisse ausbauen kannst.
Kurtis Pykes 's photo

Kurtis Pykes

Tutorial

Fibonacci-Folge in Python: Lerne und entdecke Programmiertechniken

Finde raus, wie die Fibonacci-Folge funktioniert. Schau dir die mathematischen Eigenschaften und die Anwendungen in der echten Welt an.
Laiba Siddiqui's photo

Laiba Siddiqui

Tutorial

Python-Lambda-Funktionen: Ein Leitfaden für Anfänger

Lerne mehr über Python-Lambda-Funktionen, wozu sie gut sind und wann man sie benutzt. Enthält praktische Beispiele und bewährte Methoden für eine effektive Umsetzung.
Mark Pedigo's photo

Mark Pedigo

Mehr anzeigenMehr anzeigen