For循环使用VARCHAR2

时间:2016-11-29 16:22:43

标签: 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 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吗?它只适用于数字吗?

1 个答案:

答案 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。最后,如果您希望一次输出一个学生记录,请将过滤器放在光标中,而不是循环中。