我需要帮助来解决这个问题。 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:
答案 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,但是如果必须......