2016-11-29 55 views
1

我想顯示每個學生的信息循環使用此代碼對於使用VARCHAR2

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 

我敢肯定,我應該使用一個循環,我創建

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

你需要在替換字符串周圍加引號:'IF v_Record.STUDENTNAME ='&SEARCH_STUDENT'THEN' –

回答

3

你的代碼有幾個問題。

首先,爲什麼要使用PL/SQL來做到這一點?您應該直接使用SQL語句。我會假設這是一個家庭作業問題(*嘆息* - 當然有更好的例子可以使用?!)。

1. IF v_Record.STUDENTNAME = &SEARCH_STUDENT - 當您傳入search_student的值時,客戶端會替換術語&search_student。因此,要麼確保在定義search_student(即,當提示您輸入search_student時輸入"'SomeName'")或將單引號放在&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.最後,如果您希望一次輸出單個學生記錄,請將過濾器放在光標中,而不是循環中。

+0

謝謝,就是這樣。我最後在&search_student周圍添加了單引號,這就是爲什麼我遲到做出迴應。是的,我使用PL/SQL,因爲它是用於作業。 關於你的第三點,你是指光標內的IF語句嗎? – Josh

+0

我的確如此。爲什麼不直接抓取你感興趣的行呢?而不是隻抓取所有行然後扔掉一些(最? – Boneist

+0

我希望你的講師已經清楚地表明,你永遠不會循環遊標並在生產代碼中使用dbms_output.put_line輸出信息(並且只能用於非生產代碼中的臨時調試目的),不過!實際上,如果你有非pl/sql,調用需要輸出遊標的代碼,你只需傳回一個遊標(但我假設你還沒有覆蓋那些遊標)。祝您的課程好運* {:-) – Boneist