мне нужна помощь о функциях plsql в хранимой процедуре - PullRequest
0 голосов
/ 21 октября 2019

это мой код для процедуры. я создал две таблицы как Stud_Marks и Result с некоторыми данными в нем ... а затем я создал эту процедуру. во время выполнения он показывает ошибку для «объект SYS.FIND_CLASS является недействительным».

  SQL> create or replace procedure find_class(roll IN number) IS


2  tm number (10);
  3  begin
  4  select total_marks into tm from stud_marks where name IN(select name from result where roll=roll_no);
  5  if(tm<=1500 and tm>=990)then
  6  update result set class='distin' where roll_no=roll;
  7  elseif(tm>900 and tm<989)then
  8  update result set class='first' where roll_no=roll;
  9  elseif(tm<=899 and tm>=825)then
 10  update result set class='second' where roll_no=roll;
 11  end if;
 12  exception when no_data_found then
 13  dbms_output.put_line('roll no is not matched with the entry');
14  end;
 15  /




[enter image description here][1]
Warning: Procedure created with compilation errors

.

SQL> declare



2  r number(10);
  3  begin
  4  r:=&roll_no;
  5  find_class(r);
  6  end;
  7  /





Enter value for roll_no: 1
old   4: r:=&roll_no;
new   4: r:=1;
find_class(r);




*
ERROR at line 5:
ORA-06550: line 5, column 1:
PLS-00905: object SYS.FIND_CLASS is invalid
ORA-06550: line 5, column 1:
PL/SQL: Statement ignored

тогда я получаю ошибку для find_class (r) .. почему? ??

1 Ответ

1 голос
/ 21 октября 2019

Перед вызовом процедуры необходимо убедиться, что она действительна. У вас все не так, Oracle выдает ошибку.

После того, как вы ее создали, вы получили сообщение:

Предупреждение: процедура создана с ошибками компиляции

Вы должны были проверить, что не так, выполнив команду

show err

Я переформатировал код, который вы разместили - посмотрите, как его легче читать:

create or replace procedure find_class(roll IN number) IS
  tm number (10);
begin
  select total_marks 
    into tm 
    from stud_marks 
    where name IN (select name 
                   from result 
                   where roll = roll_no
                  );

  if (tm <= 1500 and tm >= 990)then
     update result set 
       class = 'distin' 
       where roll_no = roll;
  elsif (tm > 900 and tm < 989) then        --> ELSIF, not ELSEIF
     update result set 
       class = 'first' 
       where roll_no = roll;
  elsif (tm <= 899 and tm >= 825) then      --> ELSIF, not ELSEIF
     update result set 
       class = 'second' 
       where roll_no = roll;
   end if;

exception when no_data_found then
  dbms_output.put_line('roll no is not matched with the entry');
end;

Очевидно, вы использовали ELSEIF, в то время какэто должно быть ELSIF. Я не знаю, единственная ли это ошибка, потому что у меня нет твоих таблиц - ты это выяснишь. Не забудьте show err при необходимости!

Итак, когда он создан без ошибок, вы можете позвонить ему и посмотреть, что он делает.

PS Забыл упомянуть: почему выэто связано как SYS? Этот пользователь владеет базой данных и должен не использоваться для разработки или образования . Вы должны использовать одного из предопределенных пользователей (например, Scott или HR) или создать своего собственного пользователя. Оставьте SYS в покое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...