поиск записей с курсорами и процедурами - PullRequest
0 голосов
/ 29 января 2020

my diagrams for the libaray project

Я не знаю, как написать правильную процедуру с курсорами. я что-то делаю?

procedure1: for given student show all titles of books he ever rented
--no such student  no recordsexcep

    SET SERVEROUTPUT ON
create or replace procedure showRENTS(v_idStudent int)
as

v_NameOfBook varchar2(100);
--v_count int;
no_such_id EXCEPTION;
cursor c1 is
select NameOfbook from book
where 
begin 
open c1;
loop 
fetch c1
into v_fname,v_lname;
--select count(1) into v_count from Student where idStduent =v_id ;
--if
--v_count = 0;
--then raise no_such_id;
--end if;
exit when c1%notfounf
end loop; 
close c1;
end;
/

Ответы [ 2 ]

0 голосов
/ 29 января 2020

Пожалуйста, в будущем опубликуйте вашу фактическую таблицу DDL, а не просто ERD. Смотрите комментарий Littlefoot. Также включите образцы данных испытаний и ожидаемые результаты этой даты. ВСЕ как ТЕСТ, нет изображений для DDL, данные. Возможно, вы захотите ознакомиться с разделом справки «Как задавать вопросы».

При возникновении подобных проблем просто следуйте своему ERD. Так что вот вам дали студентку и попросили арендовать книгу. Следуйте по пути: Студент -> Процесс -> Копии -> Книга. Это на самом деле становится честным запросом.

    create or replace procedure showrents(v_idStudent int)
    as
        no_such_id EXCEPTION;
        v_student_ok interger :=0;  
        cursor c_student_books is 
               select nameofbook 
                 from student s
                 join process p on (p.idstudent = s.idstudent)
                 join copies  c on (c.idcopies  = p.idcopies)
                 join books   b on (b.idbook    = b.idbook)
                where s.idstudent = v_idStudent;
    begin 
        select count(*)
          into v_student_ok
          from student 
         where idstudent = v_idstudent
           and rownum <= 1;

        if v_student_ok = 0 
        then
           raise no_such_id;
        end if;

        for rented in c_student_books
        loop 
           dbms_output.put_line( rented.nameofBook);
        end ;
    end showrents; ```    
0 голосов
/ 29 января 2020

Я не вижу изображения, но - опубликованную вами процедуру можно переписать в

CREATE OR REPLACE PROCEDURE showrents (v_idstudent IN INT)
AS
BEGIN
   FOR c1 IN (SELECT nameofbook FROM book)
   LOOP
      DBMS_OUTPUT.put_line (c1.nameofbook);
   END LOOP;
END;
/

Я бы предложил использовать курсор ДЛЯ l oop - его проще написать и поддерживать как Oracle выполняет большую часть работы за вас (вам не нужно объявлять переменную курсора, открывать курсор, извлекать его, заботиться о выходе из l oop, закрывать курсор).

I я не уверен, что его параметр имеет отношение к нему, но я оставил его; Я думаю, вы добавите немного кода позже.

Надеюсь, это поможет вам начать.

...