Oracle PLSQL错误:必须声明组件
这可能是个错误,但我没有发现。 在一个程序中,我有:Oracle PLSQL错误:必须声明组件,oracle,plsql,Oracle,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, n
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
怎么了
Ty游标循环变量
myVar
与您的myVar
记录类型变量无关;它的作用域有效地覆盖了类型定义。如果删除了该类型,则会出现相同的错误
:
游标FOR循环
语句隐式地将其循环索引声明为指定游标返回的行类型的记录变量
和来自:
游标FOR循环
语句隐式地将其循环索引声明为其游标返回的类型的%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
如果你能说出你想要达到的目标,那么我们可能会找到你需要的代码。从目前的情况看,你似乎缺少了很多东西来完成它。