在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%ROWTYPE
或FETCH c1 into result
。另外,我收到错误
PLS-00103:在期待其中一个时遇到符号“文件结束” 以下内容:......
代码行BEGIN OPEN c1
。我无法弄清楚,我的代码有什么问题。我已经阅读过Oracle和其他网站上的教程,但在我到目前为止看到的每个例子中,他们都使用了完全相同的语法。我是否需要更改“分隔符”(例如在MySQL中)?
感谢您的帮助!
答案 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;