PLS-00382:游标中的表达式类型错误


DECLARE
A_NAME STUDENTS_1.NAME%TYPE;
B_NAME STUDENTS_1.NAME%TYPE;
C_NAME STUDENTS_1.NAME%TYPE;
GRADE_ST STUDENTS_1.GRADE%TYPE;

CURSOR A IS SELECT NAME FROM STUDENTS_1 WHERE REGEXP_LIKE(GRADE,'(A)','i');
CURSOR B IS SELECT NAME FROM STUDENTS_1 WHERE REGEXP_LIKE(GRADE,'(B)','i');
CURSOR C IS SELECT NAME FROM STUDENTS_1 WHERE REGEXP_LIKE(GRADE,'(C)','i');

BEGIN
GRADE_ST:= &CHOICE;

IF (GRADE_ST='A') THEN
OPEN A;
LOOP
FETCH A INTO A_NAME;
EXIT WHEN A%NOTFOUND;
INSERT INTO SCHOLARSHIP_A VALUES(A_NAME);
END LOOP;
CLOSE A;

ELSIF (GRADE_ST='B') THEN 
OPEN B;
LOOP
FETCH B INTO B_NAME;
EXIT WHEN B%NOTFOUND;
INSERT INTO SCHOLARSHIP_B VALUES(B_NAME);
END LOOP;
CLOSE B;

ELSE
OPEN C;
LOOP
FETCH C INTO C_NAME;
EXIT WHEN C%NOTFOUND;
INSERT INTO SCHOLARSHIP_C VALUES(C_NAME);
END LOOP;
CLOSE C;

END IF;
END;
/

我正在制作三种不同的奖学金表,等级A,B,C如果我用户输入值而不是等级我得到解决方案,但我不想给值作为用户输入,我希望用户输入应该是等级比如如果我输入A,我应该从表中得到所有等级为A的名字但是我最终得到了这个错误

SQL*Plus或SQL Developer在PL/SQL块被解析之前替换choice变量值,并且正如@mathguy建议的那样,最终可能不是您想要的。但是在这里,如果你有set verify on,你就能看到正在编译的代码,会看到是什么导致了这个错误;这部分:

BEGIN
GRADE_ST:= &CHOICE;

最终实际上是,如果用户提供值A:

BEGIN
GRADE_ST:= A;

,在此范围内A是游标名称。所以这是一个无效的赋值,将游标赋给字符串;因此,您得到的错误。

因为你的choice是一个字符/字符串,你需要把它括在引号里,所以你应该这样做:

BEGIN
GRADE_ST:= '&CHOICE';

你可以大大简化你正在做的事情,实际上不需要PL/SQL,但这超出了你的问题范围。

您正在使用替换变量(&choice)来传递参数。这是SQL*Plus的一个特性;您需要在编译代码之前传入该值,然后将其硬编码到块中。相反,您需要的是一个绑定变量(:choice),或者将其写成一个接受in参数的过程。

相关内容

最新更新