2013-10-01 166 views
0

我有兩個表PLSQL程序通過結果

圖書查詢兩個表和循環一本書(Book.no_of_copies是5,然後在副本表中有5個副本(行))

我該怎麼寫一個可以將輸入參數作爲book_id的過程,並且首先查詢Book表,找到no_of_copies。如果no_of_copies是肯定的,則查詢Copies表並顯示每個結果的copy_number,shelf_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; 

OR

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