PL/SQL 不存在查询

Posted

技术标签:

【中文标题】PL/SQL 不存在查询【英文标题】:PL/SQL Not Exists Query 【发布时间】:2016-03-31 19:16:54 【问题描述】:

我需要帮助来解决这个问题。 Driver_ID 存在于两个表中,Driver 和 Driver_Deliveries。我需要它来显示未出现在 Driver_Deliveries 表中的驱动程序 ID 的 First_Name、Surname 和 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:

【问题讨论】:

那么,您的解决方案有什么问题(如果有的话)? 另外,这需要在 PL/SQL 中吗?它可以更直接地用纯 SQL 完成。 @mustaccio 这是我得到的:06550. 00000 - "line %s, column %s:\n%s" *原因:通常是 PL/SQL 编译错误。 *行动: @mathguy 是的,我需要在 PL/SQL 中完成 您的代码中有一堆语法错误:不必要的INTO 子句,两个表之间缺少连接,where 子句前的额外逗号,可能还有其他。或许您可以从 Oracle 文档中的示例开始并以此为基础。 【参考方案1】:

您需要在 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,但如果您必须...

【讨论】:

非常感谢您的帮助,它成功了,我真的很感激!我最近才开始学习这个,所以这就是我犯这些错误的原因。 您需要掌握解释错误堆栈的窍门,并查看(和周围)它们指向的行。这并不总是很清楚,但这些错误被标记得很清楚。

以上是关于PL/SQL 不存在查询的主要内容,如果未能解决你的问题,请参考以下文章

imp命令导入dmp文件,提示成功无警告,但是在pl sql 查询,提示表不存在,是怎么回事?

在pl/sql中怎么查询所有存在的表,以及怎么样获得未知表中的某一字段

PL/SQL: ORA-00942: 表或视图不存在

通知调用方不存在记录的 DML PL/SQL 过程

更新/删除不存在的行时的 PL/SQL 异常

PL/SQL - 仅当记录不存在时才插入记录