Die Initialzündung auf Instagram

Heute bin ich über einen alten Beitrag von mir auf Instagram gestolpert:

„Was habe ich mir bloss dabei gedacht?“ war mein erster Gedanke. Erst bei genauerem Hinsehen wurde mir wieder klar, was ich damit bezwecken wollte: Den bösen, bösen ORA-01403: NO_DATA_FOUND abwenden, ohne ein BEGIN ... EXCEPTION drum herum. An die genaue Problemstellung kann ich mich nicht mehr erinnern, doch wahrscheinlich war es etwas wie das hier:

DECLARE
    v_myval   NUMBER;
    v_email   VARCHAR2(20) := 'SKING'; -- 'ABONHOTE'
BEGIN
    SELECT salary
    INTO v_myval
    FROM hr.employees
    WHERE email   = v_email;

    dbms_output.put_line('Salary of ' || v_email || ': ' || v_myval);
END;

Das geht so lange gut, wie der Steven King bei uns arbeitet. Als nicht-Mitarbeiter von Oracle wirft meine vermeintliche Mailadresse hier eine Exception. Falls die wider Erwarten nicht erwünscht sein sollte, so hilft das Instagram-Muster:

DECLARE
    v_myval   NUMBER;
    v_email   VARCHAR2(20) := 'ABONHOTE';
BEGIN
    WITH a AS ( SELECT salary
                FROM hr.employees
                WHERE email   = v_email
    )
    SELECT nvl(a.salary, - 1)
    INTO v_myval
    FROM a
    FULL OUTER JOIN ( SELECT 0
                      FROM dual
                    ) ON 1 = 1;
    dbms_output.put_line('Salary of ' || v_email || ': ' || v_myval);
END;

Zu beachten ist dabei, dass die Tabelle, die unter Umständen eine leere Menge zurückgeben könnte, in einer WITH-clause vorbereitet werden muss. Damit gebe ich mein Salär bei Oracle bekannt:

Salary of ABONHOTE: -1