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

时间:2016-08-21 08:34:17

标签: oracle plsql

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级的名字 但我最终得到了这个错误

2 个答案:

答案 0 :(得分:4)

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,但这超出了您的问题的范围。

答案 1 :(得分:2)

您正在使用替换变量(&choice)来传递参数。这是一个SQL * Plus功能;您需要在编译代码之前传入该值,然后在块中对其进行硬编码。相反,您需要的是绑定变量(:choice),或将其写为带有in参数的过程。