PLSQL程序,用于查询两个表并循环遍历结果

PLSQL程序,用于查询两个表并循环遍历结果,sql,oracle,stored-procedures,plsql,rdbms,Sql,Oracle,Stored Procedures,Plsql,Rdbms,我有两张桌子 书籍: 副本: 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) ) ; 因此,一本书的所有副本的副本表条目(book.no_of_Copies是5,那么副本表中有5个副本(行) 我

我有两张桌子

书籍:

副本:

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)
  ) ;
因此,一本书的所有副本的副本表条目(book.no_of_Copies是5,那么副本表中有5个副本(行)

我如何编写一个过程,将输入参数作为book_id,并通过首先查询book表来查找no_拷贝。如果没有副本,则查询副本表并显示每个结果的副本号、货架号和呼叫号

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;


…或者,呃,您可以编写以下非常简单的查询:

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

如果必须,您可以将其包装在一个过程中,但我无法想象您为什么需要。

…或者,呃,您可以编写以下非常简单的查询:

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

如果必须,您可以将其包装在过程中,但我无法想象您为什么需要这样做。

存储过程本身不显示任何内容,而是返回输出参数。存储过程本身不显示任何内容,而是返回输出参数。谢谢。我只是被迫按程序来做,而不是按直截了当的方式做。。疯狂世界我猜:)谢谢你。我只是被迫按程序来做,而不是按直截了当的方式做。。疯狂世界我猜:)请不要这样做。没有。一个。@CleverIdeaWidgetry为什么我们不应该这样做?@FahmiRamadhan我最初的评论是指最初发布的双光标方法。然后,在我的评论之后,它被更新,在一个游标中完成,这是非常好的。我应该自己编辑而不是说“不”。请不要这样做。没有。一个。@CleverIdeaWidgetry为什么我们不应该这样做?@FahmiRamadhan我最初的评论是指最初发布的双光标方法。然后,在我的评论之后,它被更新,在一个游标中完成,这是非常好的。我应该自己编辑而不是说“不”。
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