创建PL / SQL过程时“无效的SQL语句”

时间:2012-11-28 22:13:36

标签: oracle stored-procedures plsql

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

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

AuthorID中的Task代表编写任务的作者。现在我编写了以下过程,该过程应该根据作者编写的任务数更新level - 属性。

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语句

e.g。对于行result c1%ROWTYPEFETCH c1 into result。另外,我收到错误

  

PLS-00103:在期待其中一个时遇到符号“文件结束”   以下内容:......

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

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

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

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

而不是

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

答案 1 :(得分: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;