0

我有一个如下所示的基本表:

SQL> desc comments
Name              Null?        Type
---------------------------------------
COMMENT_ID        NOT NULL     NUMBER
POST_ID           NOT NULL     NUMBER
USER_ID           NOT NULL     NUMBER
MESSAGE           NOT NULL     VARCHAR2(2500)
MESSAGE_TIME      NOT NULL     TIMESTAMP(6)
UPVOTES           NOT NULL     NUMBER

我想做的是调用一个存储过程来增加赞成票。这似乎是最有意义的,因为我不想传递除了 comment_id 和 post_id 之外的任何东西。

我想我应该做这样的事情(请原谅语法,我已经很久没有搞乱存储过程了)

CREATE OR REPLACE procedure proc_upvote_comment (comment_id NUMBER , post_id NUMBER) 
BEGIN
    SELECT UPVOTES FROM COMMENTS 
        WHERE COMMENTS.COMMENT_ID  = proc_upvote_comment.comment_id 
              AND COMMENTS.POST_ID = proc_upvote_comment.post_id;
   //Call an update
END;
/

但我似乎不知道这里缺少的部分。我试过查看 http://docs.oracle.com/cd/B19306_01/appdev.102/b14251/adfns_packages.htm#i1007682 http://docs.oracle.com/cd/B12037_01/server.101/b10759 /statements_6009.htm

还有网站上的其他几个地方——但我只是错过了一些东西。

在正确方向上的任何帮助都会很棒

4

2 回答 2

3

有什么原因这对您不起作用:

 CREATE OR REPLACE procedure proc_upvote_comment (comment_id NUMBER , post_id NUMBER) 
 AS
 BEGIN
    UPDATE COMMENTS 
       SET UPVOTES = UPVOTES + 1
     WHERE COMMENTS.COMMENT_ID  = proc_upvote_comment.comment_id 
          AND COMMENTS.POST_ID = proc_upvote_comment.post_id;
 END;

请记住,SQL 与集合一起工作;)

于 2012-07-26T18:04:34.223 回答
1

你可能只是想要

CREATE OR REPLACE procedure proc_upvote_comment (p_comment_id NUMBER , p_post_id NUMBER) 
AS
BEGIN
  UPDATE comments
     SET upvotes = upvotes + 1
   WHERE comment_id = p_comment_id
     AND post_id    = p_post_id;
END;
/

通常,您希望有一个命名约定来区分参数和列名。我更喜欢使用p_参数l_前缀和局部变量前缀,但还有其他约定。如果您不这样做并且对列和参数使用相同的名称,则 SQL 语句将首先使用列名称解析标识符,然后再使用参数名称。诉诸为存储过程的名称添加前缀以提供范围解析是可行的,但它相当麻烦。

于 2012-07-26T18:09:19.903 回答