2012-11-28 31 views
1

当在Oracle数据库我有以下两个表:“无效的SQL语句”创建PL/SQL程序

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

其中AuthorIDTask表示写任务的作者。现在我编写了以下程序,该程序应该更新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语句

例如行result c1%ROWTYPEFETCH c1 into result。此外,我得到的错误

PLS-00103:出现符号期待的 下列操作之一时, “-的文件结束”:...

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

感谢您的帮助!

+0

如果您在使用SQL * Plus,你需要终止'创建table'用'/'(在同一行) –

+0

@ a_horse_with_no_name我已经尝试过,但没有区别(只是再次检查)。 – kaufmanu

+0

@a_horse_with_no_name你确实是指'create table'语句,还是只是一个错字,而你的意思是'create procedure'?编辑:是的,我意识到这一点(但有些人希望我专门创建一个程序;-)) – kaufmanu

回答

2

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

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

代替

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

好的答案。:)我是新的关于PL/SQL,你的问题和答案真的对我有帮助。 – lv0gun9

+0

@ lv0gun9这不是一个很好的学习模式。尽可能避免显式游标。 http://stackoverflow.com/questions/13658505/pl-sql-executing-procedure-fails-and-unable-to-retrieve-compile-warnings –

+0

@DavidAldridge thx很多! – lv0gun9

1

错误#1:水平在PL/SQL

保留字我想你的代码的其余部分没有如果和它看起来不错 - 所以这 将编译(见下文)。是的,IF的更新表 - 表 不应该在那里(错误#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; 
+0

我改变了列名,但是我仍然得到相同的错误... – kaufmanu

+0

我试图编译没有IF的程序,但它仍然失败。 – kaufmanu

+0

对不起,我错了 - 它编译没有IFs – kaufmanu