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 查询,提示表不存在,是怎么回事?