Недопустимый идентификатор SQL при использовании переменной привязки

#sql #oracle-sqldeveloper #inner-join

Вопрос:

Используя мой анонимный блок, который я написал ниже, переменная bind выдает мне ошибку: я вставил изображение таблицы ниже.

  • редактировать: ETHI1022-это ввод, который я даю для CORID
 v_corid CHAR(8) := ETHI1022;
                       *
ERROR at line 3:
ORA-06550: line 3, column 24:
PLS-00201: identifier 'ETHI1022' must be declared
ORA-06550: line 0, column 0:
PL/SQL: Compilation unit analysis terminated
 

Я понимаю, что мое внутреннее соединение, скорее всего, испорчено, как никакое другое. Я пытаюсь изучить этот материал, и мне очень трудно понять, как работает извлечение значений из оператора select и размещение их в переменных в разделе объявление.

 DECLARE
    v_marstuid MARKS.STUID%TYPE;
    v_corid CHAR(8) := amp;corid;
    v_avgmark NUMBER(2);
    v_maxmark NUMBER(2);
    v_minmark NUMBER(2);
    v_cordesc VARCHAR2(255);

    ex_CourseNotFound EXCEPTION;
BEGIN
    SELECT Count(M.stuid),
           M.corid,
           Avg(M.mark),
           Max(M.mark),
           Min(M.mark),
           C.descript
    INTO   v_marstuid, v_corid, v_avgmark, v_maxmark,
    v_minmark, v_cordesc
    FROM   marks M
           inner join courses C
                   ON M.corid = C.corid
    WHERE  C.corid = v_corid;

    dbms_output.Put_line (v_corid
                          || ' - '
                          || v_cordesc);

    dbms_output.Put_line ('Course Stats: ');

    dbms_output.Put_line ('Number of students: '
                          || v_marstuid);

    dbms_output.Put_line ('Average: '
                          || v_avgmark);

    dbms_output.Put_line ('Marks Range: ');

    dbms_output.Put_line ('High: '
                          || v_maxmark);

    dbms_output.Put_line ('Low: '
                          || v_minmark);

EXCEPTION
    WHEN ex_CourseNotFound THEN
    DBMS_OUTPUT.PUT_LINE(v_corcode || ' Does not exist.');
END;

/ 
 

[Используемая таблица]

1

Комментарии:

1. Я ничего не знаю о синтаксисе Oracle, но разве строки не должны быть в кавычках? Нравится v_corid CHAR(8) := 'ETHI1022'; ?

2. @Arvo, Так вот какой результат он мне дает. amp; — это то, что подсказывает ему, чтобы пользователь, запускающий файл, что-то ввел, поэтому он помещает ETHI1022 туда самостоятельно. Вы правы, хотя он рассматривает входные данные как переменную, но я не уверен, как это исправить.

Ответ №1:

Вместо ETHI1022 должно быть «ETHI1022». Ваше внутреннее соединение в порядке. Откуда вы получаете ценность corid . Сделайте его типа varchar/string или что-то в этом роде.

Или вы могли бы попробовать v_corid CHAR(8) := ''''||amp;corid||'''';

Комментарии:

1. Спасибо вам за ответ. Я не уверен, как заставить его рассматривать входные данные как строку. Когда я запускаю код с этим, он выдает мне следующее: ORA-01741: незаконный идентификатор нулевой длины, который используется при запуске с двойными кавычками, с одинарными кавычками он выдает ту же ошибку, что и раньше.

2. Я сделал '''||amp;corid||''' это, и это работает, но теперь по какой-то причине он говорит мне, что строковый буфер слишком мал для v_marstuid, даже если он настроен на получение типа данных прямо из бд. Спасибо за решение!

3. Я думаю, что что-то не так с моим утверждением select, но я не уверен, что именно. Теперь я могу заставить переменную bind работать, но теперь я получаю ORA-00937 Не одну функцию групповой группы…