2016-03-31 4 views
-3

Ich brauche Hilfe, um dieses Problem zu lösen. Die Driver_ID existiert in zwei Tabellen, Driver und Driver_Deliveries. Ich brauche es, um den First_Name, den Nachnamen & Driver_ID für die Treiber-IDs anzuzeigen, die nicht in der Tabelle Driver_Deliveries angezeigt werden. Ich verwende Oracle SQL Developer mit Oracle 11G.PL/SQL nicht vorhanden Abfrage

DECLARE 
    FIRSTNAME VARCHAR2(20); 
    SUR_NAME  VARCHAR2(20); 
    DRIVERID VARCHAR2(5); 

BEGIN 

FOR i IN 
(
    SELECT 
     FIRST_NAME, 
     SURNAME, 
     a.DRIVER_ID 
     INTO 
     FIRSTNAME, SUR_NAME, DRIVERID 
    FROM 


     DRIVER_DELIVERIES, 
     DRIVER a, 


     WHERE NOT EXISTS(SELECT * FROM DRIVER_DELIVERIES WHERE DRIVER_DELIVERIES.DRIVER_ID = a.DRIVER_ID); 


     ) 
LOOP 


     DBMS_OUTPUT.PUT_LINE('FIRST NAME :' ||I.FIRST_NAME); 

     DBMS_OUTPUT.PUT_LINE('SURNAME :' || I.SURNAME); 

     DBMS_OUTPUT.PUT_LINE('DELIVERY JOB REQUIRED: YES '); 



    END LOOP; 
END; 

Hier ist der Fehler-Stack:

Error report - 
ORA-06550: line 23, column 9: 
PL/SQL: ORA-00903: invalid table name 
ORA-06550: line 10, column 5: 
PL/SQL: SQL Statement ignored 
ORA-06550: line 23, column 106: 
PLS-00103: Encountered the symbol ";" when expecting one of the following: 

    loop 
06550. 00000 - "line %s, column %s:\n%s" 

*Cause: Usually a PL/SQL compilation error. 
*Action: 
+0

Also, was ist falsch mit Ihrer Lösung (wenn überhaupt)? – mustaccio

+0

Muss dies auch in PL/SQL sein? Dies kann direkter in SQL erfolgen. – mathguy

+0

@mustaccio das bekomme ich: 06550. 00000 - "Zeile% s, Spalte% s: \ n% s" * Ursache: Normalerweise ein PL/SQL-Kompilierungsfehler. * Aktion: –

Antwort

0

Sie müssen in etwas mit einer einfachen Abfrage in einem PL/SQL-Block wählen, aber Sie haben diese Regel zu weit gegangen; weil Ihre Cursor-Loop-Variable i ein impliziter Datensatztyp ist, der bereits für die Abfrageergebnisse verfügbar ist.

Sie haben auch ein zusätzliches Komma in der Auswahlliste der Cursorabfrage und die from-Klausel. Und ein zusätzliches Semikolon nach der where Klausel.

Also mit dieser Schleife Syntax, die Sie benötigen:

... 
FOR i IN 
(
    SELECT 
     FIRST_NAME, 
     SURNAME, 
     a.DRIVER_ID 
    FROM 
     DRIVER_DELIVERIES, 
     DRIVER a 
    WHERE 
... 

Obwohl Sie wirklich explizite Join-Syntax verwendet werden soll, die es machen würde offensichtlich, dass Sie zur Zeit keine Verbindung zwischen den beiden Tabellen in Ihrer where Klausel haben. Aber Sie wollen eigentlich überhaupt nicht auf driver_deliveries verweisen - Sie erhalten alle Daten aus der driver Tabelle. Sie nur müssen auf das innerhalb der exists Klausel verweisen. (Und ich habe gerade bemerkt, dass Sie den Tabellennamen auch in dieser Klausel falsch geschrieben haben).

So geändert wird, wie weiter:

Bedarf:

... 
FOR i IN 
(
    SELECT 
     FIRST_NAME, 
     SURNAME, 
     DRIVER_ID 
    FROM 
     DRIVER a 
    WHERE NOT EXISTS(
     SELECT null FROM DRIVER_DELIVERIES 
     WHERE DRIVER_DELIVERIES.DRIVER_ID = a.DRIVER_ID) 
) 
LOOP 
... 

Sie erscheinen nicht PL/SQL für diese benötigen, aber wenn Sie müssen ...

+0

Vielen Dank für die Hilfe, es hat funktioniert, ich schätze es wirklich! Ich habe erst vor kurzem damit angefangen zu lernen, deshalb habe ich diese Fehler gemacht. –

+0

Sie müssen den Fehler-Stack interpretieren und (und herum) die Zeilen sehen, auf die sie zeigen. Es ist nicht immer klar, aber diese Fehler wurden deutlich gekennzeichnet. –