Stored procedures 基本存储过程(更新列值)

Stored procedures 基本存储过程(更新列值),stored-procedures,oracle10g,Stored Procedures,Oracle10g,我有一个基本表,如下所示: SQL> desc comments Name Null? Type --------------------------------------- COMMENT_ID NOT NULL NUMBER POST_ID NOT NULL NUMBER USER_ID NOT NULL NUMBER MESSAGE NOT NU

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

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
我想做的是调用一个存储过程,以增加UPVOUTS。这似乎是最有意义的,因为我不想传递除了评论id和帖子id之外的任何东西

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

但我只是不知道这里丢失的那块。我试着看了看 http://docs.oracle.com/cd/B12037_01/server.101/b10759/statements_6009.htm

网站上还有其他一些地方,但我只是错过了一些东西


在正确的方向上提供任何帮助都是非常好的

是否有任何原因这对您不起作用:

 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使用集合;)

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

 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使用集合;)

你可能只是想

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语句将首先使用列的名称,然后使用参数的名称解析标识符。在存储过程的名称前加前缀以提供范围解析是可行的,但这相当麻烦。

您可能只是想

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语句将首先使用列的名称,然后使用参数的名称解析标识符。诉诸于在存储过程的名称前加前缀以提供范围解析是可行的,但这相当麻烦。

每次这样做时,我都会收到错误PLS-00103:在预期以下情况之一时遇到符号“BEGIN”:;使用外部确定性并行_启用的流水线将authid作为集群顺序。符号“是”被替换为“开始”continue@PSU_Kardi-在
开始之前,您需要一个
AS
(或者
IS
,两者都可以工作)每次我这样做时,我都会收到错误PLS-00103:在预期以下情况之一时遇到符号“BEGIN”:;使用外部确定性并行_启用的流水线将authid作为集群顺序。符号“是”被替换为“开始”continue@PSU_Kardi-在
开始之前,您需要一个
AS
(或者
IS
,两者都可以)