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游标传递回(但我假设您还没有介绍这些)。祝你的课程好运*{:-)