Разница между PL/SQL и SQL. Выберите в

Вопрос:

У меня возникла проблема с компиляцией простой части кода в 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;

Когда я пытаюсь скомпилировать это, я вижу эту ошибку: Encountered the symbol error

Однако, когда я запускаю этот кусок кода в 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

Лучший ответ:

Из этой ошибки представляется интерпретация ключевого слова «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;

… хотя наложение таблиц по-прежнему будет более ясным.

Оцените статью
TechArks.Ru
Добавить комментарий