0

私は2つのテーブルを持っています

本:

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)
  ) ;

したがって、書籍のすべての部数に対する Copies テーブル エントリ (Book.no_of_copies が 5 の場合、Copies テーブルには 5 つの部数 (行) があります)

入力パラメーターを book_id として取り、最初に Book テーブルをクエリして no_of_copies を見つけるプロシージャを作成するにはどうすればよいでしょうか。no_of_copies が正の場合、Copies テーブルにクエリを実行し、結果ごとに copy_number、shelf_letter、および call_number を表示します。

4

2 に答える 2

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;
于 2013-10-01T09:05:03.117 に答える