1

Oracle DBには、次の2つのテーブルがあります。

Task (TaskID, ..., AuthorID)
Author (AuthorID, level)

ここでAuthorID、inTaskは、タスクを作成した作成者を表します。levelここで、作成者が作成したタスクの数に基づいて-Attributeを更新することになっている次の手順を作成しました。

CREATE OR REPLACE PROCEDURE profil_level
IS
    CURSOR c1 IS SELECT AuthorID, COUNT(AuthorID) as Total FROM Task
       GROUP BY AuthorID;
    result c1%ROWTYPE;
BEGIN
    OPEN c1;
        LOOP
        FETCH c1 INTO result;
        EXIT WHEN c1%NOTFOUND;

      IF(result.Total = 2 OR result.Total = 3) THEN
        UPDATE TABLE Author SET level = 'advanced' 
            WHERE AuthorID = result.AuthorID;
      END IF;

      IF(result.Total >= 4) THEN
        UPDATE TABLE Author SET level= 'proficient'
            WHERE AuthorID = result.AuthorID;
      END IF;
    END LOOP;
  CLOSE c1;
END;

このステートメントを実行しようとすると、次のようなエラーが大量に発生します。

無効なSQLステートメント

たとえば、行result c1%ROWTYPEまたはFETCH c1 into result。さらに、エラーが発生します

PLS-00103:次のいずれかが予想されるときに「ファイルの終わり」という記号が表示されました:..。

行のBEGIN OPEN c1。コードの問題が何であるか理解できません。Oracleや他のサイトのチュートリアルを読んだことがありますが、これまでに見たすべての例で、まったく同じ構文を使用しています。'区切り文字'を変更する必要がありますか(たとえば、MySQLのように)?

ご協力いただきありがとうございます!

4

2 に答える 2

2

問題が見つかりました。if 句内の update ステートメントに誤りがありました。それはあるはずです:

UPDATE Author SET level = 'advanced' 
            WHERE AuthorID = result.AuthorID;

それ以外の

UPDATE TABLE Author SET level = 'advanced' 
            WHERE AuthorID = result.AuthorID;
于 2012-11-28T22:54:25.820 に答える
1

エラー#1:LEVELはPL/SQLの予約語です

IFを使用せずに残りのコードを試しましたが、見た目は良さそうです。これでコンパイルされます(以下を参照)。はい、IFにはUPDATE TABLEがあります-TABLEという単語はそこにあるべきではありません(エラー#2)

**列名としてLEVELを使用しないでください。**

CREATE OR REPLACE PROCEDURE profil_level
IS
    CURSOR c1 IS SELECT FIELD1, COUNT(FIELD1) AS TOTAL FROM T1
      GROUP BY FIELD1;
    result c1%ROWTYPE;
BEGIN
    OPEN c1;
        LOOP
        FETCH c1 INTO result;
        EXIT WHEN c1%NOTFOUND;


        END LOOP;
    CLOSE c1;
END;
于 2012-11-28T22:28:13.303 に答える