SQL从视图中生成过程

SQL从视图中生成过程,sql,procedure,Sql,Procedure,这是一个SQL视图,显示ID为“2”的图书在同一书架上的图书数量。有没有一种简单的方法可以将此转换为一个过程,在这个过程中,您可以输入图书ID,而不是默认的ID为“2”?我还没有冒险进入程序,这个特殊的程序会涉及很多编码吗 SELECT COUNT(*) FROM books WHERE shelf_id = (SELECT shelf_id FROM books WHERE book_id = 2) 子查询是因为图书表具有书架ID,但书架不包含图书ID。您的代码可能如下所示:

这是一个SQL视图,显示ID为“2”的图书在同一书架上的图书数量。有没有一种简单的方法可以将此转换为一个过程,在这个过程中,您可以输入图书ID,而不是默认的ID为“2”?我还没有冒险进入程序,这个特殊的程序会涉及很多编码吗

    SELECT COUNT(*) FROM books
    WHERE shelf_id = (SELECT shelf_id FROM books WHERE book_id = 2)

子查询是因为图书表具有书架ID,但书架不包含图书ID。

您的代码可能如下所示:-

CREATE PROCEDURE spBooks(@BookID integer)
AS
SELECT COUNT(*) FROM books
    WHERE shelf_id = (SELECT shelf_id FROM books WHERE book_id = @BookID)
GO;

这将创建所需的存储过程。

如果是Oracle,请尝试以下操作:

    PROCEDURE GET_BOOK_COUNT(
        i_book_id            IN  books.book_id%TYPE,
        o_count              OUT NUMBER)
      AS
      BEGIN
            SELECT COUNT(*) INTO o_count  FROM books
            WHERE shelf_id = 
                         (SELECT shelf_id FROM books WHERE book_id = i_book_id );
      END GET_BOOK_COUNT;
但最好将其设置为
函数
,而不是
过程

      FUNCTION GET_BOOK_COUNT(
        i_book_id            IN  books.book_id%TYPE)
            RETURN NUMBER
            IS
            l_count Number;
            SELECT COUNT(*) INTO l_count  FROM books
            WHERE shelf_id = 
                         (SELECT shelf_id FROM books WHERE book_id = i_book_id );
            RETURN l_count;
      END GET_BOOK_COUNT;

为什么要使用子查询?您正在从同一个表中查询这两个。我已编辑了此帖子。这是因为Book表有一个shelf ID,但shelf不包含Book ID。在这种情况下,我更喜欢直接返回该值的函数。Out参数有时有点棘手,特别是如果您想将结果作为更大的SQL语句的一部分重新使用的话。@a_horse_和_no_name同意:因为OP询问了这个过程,所以我提到了这一点。我现在更新答案。