2013-10-01 4 views
0

у меня есть две таблицыPLSQL Процедура запроса две таблицы и цикл по результатам

Книга:

CREATE TABLE Book 
    (
book_id  INTEGER NOT NULL , 
shelf_letter CHAR (1) NOT NULL , 
call_number INTEGER , 
no_of_copies INTEGER NOT NULL , 
CONSTRAINT isbn_unique UNIQUE (isbn), 
) ; 

Копии:

CREATE TABLE Copies 
    (
copy_id  INTEGER NOT NULL , 
book_id  INTEGER NOT NULL , 
copy_number INTEGER NOT NULL, 
constraint copy_number_unique unique(book_id,copy_number) 
) ; 

So Копии записей в таблице для всех копий книга (Book.no_of_copies равна 5, тогда в таблице Копии есть 5 копий (строк))

Как написать процедура, которая может принимать входной параметр как book_id и, сначала запросив таблицу Book, найти no_of_copies. Если no_of_copies является положительным, тогда запросите таблицу Копиров и отобразите copy_number, shel_letter и call_number для каждого результата.

+3

Хранимая процедура сама по себе не отображает ничего, она возвращает выходные параметры. – Sebas

ответ

1
CREATE PROCEDURE (P_BOOK_ID INTEGER) 

    CURSOR C1(L_BOOK_ID INTEGER) IS 
    SELECT * FROM COPIES WHERE BOOK_ID = L_BOOK_ID; 
    L_NUM_COPIES NUMBER; 

BEGIN 

    SELECT NO_OF_COPIES INTO L_NUM_COPIES FROM BOOK WHERE BOOK_ID = P_BOOK_ID; 

    IF L_NUM_COPIES>0 
     THEN 
      FOR CUR IN C1(P_BOOK_ID) 
      LOOP 
       DBMS_OUTPUT.PUT_LINE(CUR.COPY_NUMBER); 
      END LOOP; 

END; 

ИЛИ

CREATE PROCEDURE (P_BOOK_ID INTEGER) 

    CURSOR C1(L_BOOK_ID INTEGER) IS 
    SELECT B.book_id, 
      B.shelf_letter, 
      B.call_number, 
      B.no_of_copies, 
      C.copy_id, 
      C.copy_number 
    FROM COPIES C, 
     BOOK B 
    WHERE C.BOOK_ID = L_BOOK_ID 
    AND C.BOOK_ID=B.BOOK_ID; 

    L_NUM_COPIES NUMBER; 

BEGIN 

    FOR CUR IN C1(P_BOOK_ID) 
    LOOP 
     DBMS_OUTPUT.PUT_LINE(CUR.book_id); 
     DBMS_OUTPUT.PUT_LINE(CUR.shelf_letter); 
     DBMS_OUTPUT.PUT_LINE(CUR.call_number); 
     DBMS_OUTPUT.PUT_LINE(CUR.no_of_copies); 
     DBMS_OUTPUT.PUT_LINE(CUR.copy_id); 
     DBMS_OUTPUT.PUT_LINE(CUR.copy_number); 

    END LOOP; 

END; 
+0

Пожалуйста, никогда не делайте этого. Никто. –

+0

@CleverIdeaWidgetry, почему мы не должны этого делать? –

+0

@FahmiRamadhan. Мой первоначальный комментарий касался двухпозиционного подхода, первоначально опубликованного. Затем он был обновлен после того, как мой комментарий будет выполнен в одном курсоре - который будет бесконечно лучше. Я должен был сделать редактирование самостоятельно, вместо того, чтобы просто сказать «нет». –

2

... Или, эм, вы могли бы просто написать этот очень простой запрос:

select copies.copy_number, 
     book.shelf_letter, 
     book.call_number 
from book 
join copies 
on  copies.book_id = book.book_id 
where book.book_id  = ??? 
and book.no_of_copies > 0 

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

+0

Спасибо. Я просто вынужден сделать это как процедуру, а не делать это прямолинейно. Сумасшедший мир, я думаю :) – user6123723

Смежные вопросы