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');

正常に実行され、1 つのレコードが返されます。何が起こっている?

Oracle Forms 10g (10.1.2.3.0) PL/SQL (10.1.0.5.0) を使用しています。データベースのバージョン 11.2.0.3.0

4

1 に答える 1

1

エラーから、キーワード「結合」をテーブルエイリアスとして解釈しているように見えますが、これは奇妙で、OracleがANSI結合を追加する前のバージョンを使用していることを意味する可能性があります-私はフォームを使用しないので、使用しませんそれが何歳になるかを知っています。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 に答える