我尝试使用此代码显示每个学生的信息
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吗?它只适用于数字吗?
答案 0 :(得分:3)
您的代码存在一些问题。
首先,为什么要使用PL / SQL来做这个?您应该直接使用SQL语句。我会假设这是一个功课问题(*叹气* - 肯定有更好的例子可供使用?!)。
1。 IF v_Record.STUDENTNAME = &SEARCH_STUDENT
- 当您为search_student传入值时,客户端会替换术语&search_student
。因此,您必须确保在定义search_student时指定studentname的单引号是一个字符串(即,在提示您输入"'SomeName'"
的search_student时)或将单引号放在&SEARCH_STUDENT
周围 - 即。 IF v_Record.STUDENTNAME = '&SEARCH_STUDENT'
2。在for循环中引用游标返回的字段时,需要引用获取值的记录。因此DBMS_OUTPUT.PUT_LINE('Student Name: ' || STUDENTNAME);
应为DBMS_OUTPUT.PUT_LINE('Student Name: ' || v_Record.STUDENTNAME);
3。最后,如果您希望一次输出一个学生记录,请将过滤器放在光标中,而不是循环中。