2012-11-28 70 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