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
有什么不对?
泰
答
的myVar
游标循环变量是不相关的myVar
记录类型的变量;它的作用域有效地覆盖了类型定义。如果您删除了该类型,则会出现相同的错误。
From the documentation for cursor for loop
:
光标
FOR LOOP
声明隐式声明其循环指数为指定光标返回行类型的记录变量。
光标
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
记录类型变量 - 没有什么是压倒一切的是 - 所以它具有您指定的字段名。
您也可以明确定义myVar
为myCursor%rowType
以避免需要自己的记录类型,但这只是编写第一个循环的更长的方式,您需要返回参考myVar.column2
。
如果你能说出你正在努力达到的目标,那么我们可能会想出你需要的代码。就目前而言,你看起来很缺乏完成它。 – BriteSponge