#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. Я ничего не знаю о синтаксисе 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 Не одну функцию групповой группы…