Sql 使用VARCHAR2的For循环
我正在尝试使用此代码显示每个学生的信息Sql 使用VARCHAR2的For循环,sql,oracle,plsql,Sql,Oracle,Plsql,我正在尝试使用此代码显示每个学生的信息 DECLARE CURSOR cursor1 IS SELECT STUDENTNAME, COURSEID, COURSEDESCRIPTION, COURSECREDITS, GRADE FROM STUDENTINFO; S_NAME STUDENTINFO.STUDENTNAME%TYPE; S_COURSEID STUDENTINFO.COURSEID%TYPE; S_COURSEDESCRIPTION S
DECLARE
CURSOR cursor1 IS SELECT STUDENTNAME, COURSEID, COURSEDESCRIPTION, COURSECREDITS, GRADE
FROM STUDENTINFO;
S_NAME STUDENTINFO.STUDENTNAME%TYPE;
S_COURSEID STUDENTINFO.COURSEID%TYPE;
S_COURSEDESCRIPTION STUDENTINFO.COURSEDESCRIPTION%TYPE;
S_COURSECREDITS STUDENTINFO.COURSECREDITS%TYPE;
S_GRADE STUDENTINFO.GRADE%TYPE;
BEGIN
OPEN CURSOR1;
LOOP
FETCH CURSOR1 INTO S_NAME, S_COURSEID, S_COURSEDESCRIPTION, S_COURSECREDITS, S_GRADE;
EXIT WHEN cursor1%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('Student Name: ' || S_NAME);
DBMS_OUTPUT.PUT_LINE(S_COURSEID || S_COURSEDESCRIPTION || S_COURSECREDITS || S_GRADE);
DBMS_OUTPUT.PUT_LINE(CHR(10));
END LOOP;
CLOSE CURSOR1;
END;
/
我的输出应该与
Student Name: John
CMIS 101 Intro to Info. Systems 3 B
CMIS 301 System Analysis 3 C
CMIS 451 Client/Server Systems 3 C
我很确定我应该使用我创建的for循环
DECLARE
CURSOR cursor2 IS SELECT STUDENTNAME, COURSEID, COURSEDESCRIPTION, COURSECREDITS, GRADE
FROM STUDENTINFO;
search_student STUDENTINFO.STUDENTNAME%TYPE;
BEGIN
FOR v_Record IN cursor2
LOOP
IF v_Record.STUDENTNAME = &SEARCH_STUDENT THEN
DBMS_OUTPUT.PUT_LINE('Student Name: ' || STUDENTNAME);
DBMS_OUTPUT.PUT_LINE(COURSEID || COURSEDESCRIPTION || COURSECREDITS || GRADE);
DBMS_OUTPUT.PUT_LINE(CHR(10));
END IF;
END LOOP;
END;
/
然而,当我为search_student输入一个名字时,我只得到了一个错误
标识符“insertnamehere”
我可以在搜索时不使用VARCHAR2吗?它只适用于数字吗?您的代码存在一些问题 首先,为什么要使用PL/SQL来实现这一点?您应该直接使用SQL语句。我将假设这是一个家庭作业问题(*叹气*-肯定有更好的例子可以使用?!) 一,
如果v_Record.STUDENTNAME=&SEARCH_STUDENT
-当您为SEARCH_STUDENT传入一个值时,客户端将替换术语&SEARCH_STUDENT
。因此,在定义搜索学生时,您必须确保指定学生名的单引号是一个字符串(即,当提示您输入搜索学生时,请输入“'SomeName'”
),或者在&search\u student
-即如果v\u Record.studentname=”&search\u student'
二,。在for循环中引用游标返回的字段时,需要引用值被提取到的记录。因此,DBMS_OUTPUT.PUT_行('Student Name:'| | STUDENTNAME)
应该是DBMS_OUTPUT.PUT_行('Student Name:'|| v|u Record.STUDENTNAME)代码>
三,。最后,如果您希望一次输出一个学生记录,请将筛选器放在光标中,而不是循环中。您需要在替换字符串周围加引号:如果v_record.STUDENTNAME='&SEARCH_student',则
谢谢,就是这样。我最后在&search_学生周围加了一个引号,这就是为什么我反应晚了。是的,我使用PL/SQL,因为它是用来做家庭作业的。关于你的第三点,你是指游标内的IF语句吗?是的。与其只获取所有行,然后扔掉一些(大多数?),为什么不首先获取您感兴趣的行呢?我希望您的讲师已经清楚地表明,您永远不会循环通过游标并使用dbms_output.put_行在生产代码中输出信息(并且只用于非生产代码中的特殊调试目的),不过!实际上,如果您使用非pl/sql调用需要游标输出的代码,您只需将ref游标传递回(但我假设您还没有介绍这些)。祝你的课程好运*{:-)