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

如果你能说出你想要达到的目标,那么我们可能会找到你需要的代码。从目前的情况看,你似乎缺少了很多东西来完成它。