PL / SQL不存在查询

时间:2016-03-31 19:16:55

标签: sql oracle plsql

我需要帮助来解决这个问题。 Driver_ID存在于两个表中,Driver和Driver_Deliveries。我需要它来显示First_Name,Surname& Driver_eliveries表中未显示的驱动程序ID的Driver_ID。我正在使用Oracle SQL Developer和Oracle 11G。

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:

1 个答案:

答案 0 :(得分: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,但是如果必须......