Oracle PLS-00382:游标中的表达式类型错误
我制作了三个不同的奖学金表格,A,B,C等级,如果我是用户输入值,而不是等级,我得到了解决方案,但我不想把值作为用户输入,我想用户输入应该是等级 比如如果我输入A,我应该从表中得到所有等级为A的名字Oracle PLS-00382:游标中的表达式类型错误,oracle,plsql,Oracle,Plsql,我制作了三个不同的奖学金表格,A,B,C等级,如果我是用户输入值,而不是等级,我得到了解决方案,但我不想把值作为用户输入,我想用户输入应该是等级 比如如果我输入A,我应该从表中得到所有等级为A的名字 但是我最终会出现这个错误您正在使用替换变量&choice来传递参数。这是一个SQL*Plus特性;您需要在编译代码之前传入值,然后在块中对其进行硬编码。相反,您需要的是一个绑定变量:choice,或者将其编写为一个接受in参数的过程。您正在使用替换变量&choice传入参数。这是一个SQL*Plus
但是我最终会出现这个错误您正在使用替换变量&choice来传递参数。这是一个SQL*Plus特性;您需要在编译代码之前传入值,然后在块中对其进行硬编码。相反,您需要的是一个绑定变量:choice,或者将其编写为一个接受in参数的过程。您正在使用替换变量&choice传入参数。这是一个SQL*Plus特性;您需要在编译代码之前传入值,然后在块中对其进行硬编码。相反,您需要的是一个绑定变量:choice,或者将其编写为一个接受in参数的过程。SQL*Plus或SQL Developer在解析PL/SQL块之前替换choice变量值,正如@mathguy所建议的,这可能不是您最终想要的。但是在这里,如果您设置了verify,您将能够看到实际正在编译的代码,并且会看到导致此错误的代码;本部分:
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,则最终实际为:
在这个范围内,A是游标名称。所以这是一个无效的赋值,将光标赋值给字符串;因此你会得到错误
因为您的选择是一个字符/字符串,所以需要将其括在引号中,因此您应该执行以下操作:
BEGIN
GRADE_ST:= A;
您可以大大简化所做的工作,实际上不需要PL/SQL,但这超出了您的问题范围。SQL*Plus或SQL Developer在解析PL/SQL块之前替换choice变量值,正如@mathguy所建议的,这可能不是您最终想要的。但是在这里,如果您设置了verify,您将能够看到实际正在编译的代码,并且会看到导致此错误的代码;本部分:
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,则最终实际为:
在这个范围内,A是游标名称。所以这是一个无效的赋值,将光标赋值给字符串;因此你会得到错误
因为您的选择是一个字符/字符串,所以需要将其括在引号中,因此您应该执行以下操作:
BEGIN
GRADE_ST:= A;
您可以大大简化所做的工作,实际上不需要PL/SQL,但这超出了您的问题范围。Ha!很好,我甚至没有看光标的名字。读了这篇文章之后,我才意识到,事实上,我没有回答OP的问题。哈!很好,我甚至没有看光标的名字。直到读了这篇文章之后,我才意识到,事实上,我没有回答OP的问题。顺便说一句,在从y选择x中,对于r,z循环构造节省了大量代码,通常更高效、更可靠。或者您可以在纯SQL中使用insert first来完成整个过程,当。。。multi table insert.btw在select x from y中的r中,其中z循环构造节省了大量代码,通常更高效、更可靠。或者您可以在纯SQL中使用insert first来完成整个过程,当。。。多表插入。