0

我在 PL/SQL 中编译简单的一段代码时遇到问题。代码如下:

DECLARE
    zm VARCHAR(20);
BEGIN
    SELECT TEA_FIRST_NAME  into zm
    from students join teachers on STU_TEA_ID = TEA_ID
    where STU_ID = (select k.STU_ID from students k where k.STU_FIRST_NAME = 
    :BLOCK9.TEXT_ITEM11);
END;

当我尝试编译它时,我看到了那个错误: 遇到符号错误

但是,当我在 SQL Navigator 中运行这段代码时:

SELECT TEA_FIRST_NAME
from students join teachers on STU_TEA_ID = TEA_ID
where STU_ID = (select k.STU_ID from students k where k.STU_FIRST_NAME = 
'Lukasz');

它运行良好并返回一条记录。怎么了?

我正在使用 Oracle Forms 10g (10.1.2.3.0) PL/SQL (10.1.0.5.0)。数据库版本 11.2.0.3.0

4

1 回答 1

1

从错误来看,它似乎将关键字“join”解释为表别名,这很奇怪,可能意味着您使用的版本早于 Oracle 添加 ANSI 连接 - 我不使用 Forms,所以我不知道那将有多大。您可以在非 Forms 客户端中运行相同的匿名块以查看它是否应该工作。

显式别名表应该消除混淆:

DECLARE
    zm VARCHAR(20);
BEGIN
    SELECT TEA_FIRST_NAME  into zm
    from students s join teachers t on s.STU_TEA_ID = t.TEA_ID
    where STU_ID = (select k.STU_ID from students k where k.STU_FIRST_NAME = 
    :BLOCK9.TEXT_ITEM11);
END;

...但由于它似乎不理解join它仍然不会喜欢那样。如果它真的那么旧,那么您可能必须恢复到旧的连接语法:

DECLARE
    zm VARCHAR(20);
BEGIN
    SELECT TEA_FIRST_NAME  into zm
    from students, teachers
    where STU_TEA_ID = TEA_ID
    and STU_ID = (select k.STU_ID from students k where k.STU_FIRST_NAME = 
    :BLOCK9.TEXT_ITEM11);
END;

...虽然别名表仍然会使其更清晰。

于 2013-07-05T15:34:32.120 回答