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 に答える