1

在 Oracle DB 中,我有以下两个表:

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

其中AuthorIDinTask代表编写任务的作者。现在我编写了以下程序,即应该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%ROWTYPEFETCH c1 into result。此外,我得到了错误

PLS-00103:在预期以下情况之一时遇到符号“文件结尾”:...

为行BEGIN OPEN c1。我无法弄清楚我的代码有什么问题。我已经阅读了 Oracle 和其他站点上的教程,但在我目前看到的每个示例中,它们都使用了完全相同的语法。我是否需要更改“分隔符”(例如在 MySQL 中)?

谢谢你的帮助!

4

2 回答 2

2

我刚刚发现了问题:if 子句中的更新语句是错误的。它应该是:

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 回答