2017-06-16 373 views
1

這可能是一個蹩腳的錯誤,但我沒有找到它。 在過程中我有這樣的:PLSQL錯誤:組件必須聲明

PROCEDURE myProcedure(returnCode OUT NUMBER) IS 
CURSOR myCursor IS 
    SELECT column1, column2, column3, column4 FROM MyTable WHERE columX IS NULL AND columnY = 'PS'; 

TYPE myType IS RECORD (
    name1 MyTable.Column1%TYPE, 
    name2 MyTable.Column2%TYPE, 
    name3 MyTable.Column3%TYPE, 
    name4 MyTable.Column4%TYPE 
); 


myVar myType; 
myVar2 typeA 

BEGIN 
    FOR myVar IN myCursor 
    LOOP 
     myVar2 := myVar.name2; 
    END LOOP; 
END; 

錯誤:

PLS-00302 component name2 must be declared 

有什麼不對?

+0

如果你能說出你正在努力達到的目標,那麼我們可能會想出你需要的代碼。就目前而言,你看起來很缺乏完成它。 – BriteSponge

回答

1

myVar遊標循環變量是不相關的myVar記錄類型的變量;它的作用域有效地覆蓋了類型定義。如果您刪除了該類型,則會出現相同的錯誤。

From the documentation for cursor for loop

光標FOR LOOP聲明隱式聲明其循環指數爲指定光標返回行類型的記錄變量。

a related section

光標FOR LOOP聲明隱式聲明其循環索引類型,其收益光標的%ROWTYPE記錄變量。該記錄對於循環是本地的,並且僅在循環執行期間存在。

有了這個語法,myVar是隱含相同的行類型的光標本身,且具有column2場而非name2字段;所以此工程:

BEGIN 
    FOR myVar IN myCursor 
    LOOP 
     myVar2 := myVar.column2; 
    END LOOP; 
END; 

和兩個myVar變量聲明和myType類型聲明是多餘的。

要使用記錄類型,而不是你需要更多的顯式遊標處理:

BEGIN 
    OPEN myCursor; 
    LOOP 
     FETCH myCursor INTO myVar; 
     EXIT WHEN myCursor%NOTFOUND; 
     myVar2 := myVar.name2; 
    END LOOP; 
    CLOSE myCursor; 
END; 

現在myVar依然是你myType記錄類型變量 - 沒有什麼是壓倒一切的是 - 所以它具有您指定的字段名。

您也可以明確定義myVarmyCursor%rowType以避免需要自己的記錄類型,但這只是編寫第一個循環的更長的方式,您需要返回參考myVar.column2

相關問題