2016-03-31 46 views
-3

我需要帮助来解决这个问题。 Driver_ID存在两个表中,Driver和Driver_Deliveries。我需要它显示Driver_Deliveries表中没有出现的Driver ID的First_Name,Surname & Driver_ID。我正在使用Oracle 11g的Oracle SQL Developer。PL/SQL不存在查询

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; 

这里的错误堆栈:

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

那么,什么是错的用你的解决方案(如果有的话)? – mustaccio

+0

此外,这是否需要在PL/SQL?它可以在普通的SQL中更直接地完成。 – mathguy

+0

@mustaccio这是我得到的:06550. 00000 - “行%s,列%s:\ n%s” *原因:通常是PL/SQL编译错误。 *动作: –

回答

0

您需要选择用的东西在PL/SQL块一个简单的查询,但你已经采取了规则太远;因为您的光标循环变量i是一种隐式记录类型,可用于查询结果。

在游标查询的选择列表和from子句中还有一个逗号。在where条款之后还有一个额外的分号。

所以与循环语法,你需要:

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

虽然你真的应该使用明确的联接语法,这将使它更明显,你目前在你的where子句中的两个表之间没有任何联系。但是你实际上并不想在这里提到driver_deliveries - 你得到driver表中的所有数据。您只有需要参考exists条款中的内容。 (我刚刚注意到你也在该子句中错误地拼写了表名)。

所以修改进一步:

需要:

... 
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 
... 

你似乎并不需要为这个PL/SQL,但是如果你要...

+0

非常感谢你的帮助,它的工作,我真的很感激它!我最近才开始学习这个,所以我就犯了这些错误。 –

+0

您需要解释错误堆栈并查看它们指向的行(及其周围)。这并不总是很清楚,但这些错误很明显。 –