Ошибка в строке 10 возникает из-за того, что параметры хранимых процедур не имеют длины. Объявление процедуры должно быть что-то вроде
procedure find_high_avg (term IN courses.term%type,
line IN courses.lineno%type,
s_fname OUT students.fname%type,
s_lname OUT students.lname%type,
s_sid OUT students.side%type,
average OUT number)
is
Ошибка в строке 14, скорее всего, связана с тем, что параметры вашей процедуры имеют то же имя, что и столбцы в вашей таблице. В правилах разрешения области действия оператора SQL имена столбцов имеют приоритет над локальными переменными PL / SQL. Поэтому, когда вы кодируете что-то вроде
sc.term = term
Oracle пытается разрешить неквалифицированное TERM
, используя столбец в одной из таблиц. Если в обеих таблицах есть столбец с именем TERM
, это создает неоднозначную ссылку на столбец - Oracle не знает, какую из двух таблиц использовать. Конечно, в действительности вы не хотите, чтобы он использовал столбец из любой таблицы, вы хотите, чтобы он использовал параметр. Наиболее распространенный подход к этой проблеме - добавить префикс к именам параметров, чтобы они не конфликтовали с именами столбцов. Что-то вроде
procedure find_high_avg (p_term IN courses.term%type,
p_line IN courses.lineno%type,
s_fname OUT students.fname%type,
s_lname OUT students.lname%type,
s_sid OUT students.side%type,
p_average OUT number)
is
Ошибка в строке 29 возникает из-за того, что процедура принимает 6 параметров - 2 входа и 4 выхода. Поэтому для его вызова вам нужно будет использовать 6 параметров. Что-то вроде
DECLARE
myTerm courses.term%type;
myLine courses.lineno%type;
l_fname students.fname%type;
l_lname students.lname%type;
l_sid students.side%type;
l_avg number;
BEGIN
myTerm:='F12';
myLine:='1031';
find_high_avg(myTerm, myLine,l_fname,l_lname, l_sid, l_avg);
END;