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
参数的过程。