PLSQL错误:组件必须声明

问题描述:

这可能是一个蹩脚的错误,但我没有找到它。 在过程中我有这样的: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

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