Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle PLS-00382:游标中的表达式类型错误_Oracle_Plsql - Fatal编程技术网

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

Oracle PLS-00382:游标中的表达式类型错误,oracle,plsql,Oracle,Plsql,我制作了三个不同的奖学金表格,A,B,C等级,如果我是用户输入值,而不是等级,我得到了解决方案,但我不想把值作为用户输入,我想用户输入应该是等级 比如如果我输入A,我应该从表中得到所有等级为A的名字 但是我最终会出现这个错误您正在使用替换变量&choice来传递参数。这是一个SQL*Plus特性;您需要在编译代码之前传入值,然后在块中对其进行硬编码。相反,您需要的是一个绑定变量:choice,或者将其编写为一个接受in参数的过程。您正在使用替换变量&choice传入参数。这是一个SQL*Plus

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

您正在使用替换变量&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来完成整个过程,当。。。多表插入。