2010-11-27 24 views
0

嗨,大家好,我正在研究一個存儲過程,但我被困在如何輸出下面的光標。我希望它能夠採取任何課程,然後吐出點數,課程編號和課程描述。這是我到目前爲止有:當我使用存儲過程傳入​​字符串時,如何輸出遊標?

EXEC STUDENT_COUNT_COURSE('CS 101'); 

CALLS

CREATE OR REPLACE PROCEDURE STUDENT_COUNT_COURSE (p_CrsNum IN COURSE.COURSENUM%TYPE) 
IS 
    cursor cursor1 IS 
      SELECT  CourseDesc.courseNum, CourseDesc.courseDesc, COUNT(DISTINCT Student.studentID) as "Count", 
      FROM   Course INNER JOIN 
         CourseDesc ON Course.courseNum = CourseDesc.courseNum INNER JOIN 
         Grades ON Course.courseID = Grades.courseID INNER JOIN 
         Student ON Grades.studentID = Student.studentID 
      WHERE  (CourseDesc.courseNum = p_CrsNum) 
      GROUP BY CourseDesc.courseNum, CourseDesc.courseDesc; 
begin   
for c in cursor1 
loop 
dbms_output.putline('There are COUNT students in' || c.courseNum ||', '|| c.dourseDesc); 
//still working on count... 
end loop; 
end; 

回答

0

我覺得很蠢......我在dbms_output.put_line上丟失了一個下劃線,並且在我的select語句結尾處有一個額外的逗號。

這是我使用的解決方案:

CREATE OR REPLACE PROCEDURE STUDENT_COUNT_COURSE(p_CrsNum IN COURSE.COURSENUM%TYPE) 
AS 
    cursor cursor1 is SELECT CourseDesc.courseNum, 
        CourseDesc.courseDesc, 
        COUNT(DISTINCT Student.studentID) as "Count" 
      FROM  Course INNER JOIN 
        CourseDesc ON Course.courseNum = CourseDesc.courseNum INNER JOIN 
        Grades ON Course.courseID = Grades.courseID INNER JOIN 
        Student ON Grades.studentID = Student.studentID 
      WHERE  (CourseDesc.courseNum = p_CrsNum) 
      GROUP BY CourseDesc.courseNum, CourseDesc.courseDesc; 
BEGIN   
    FOR c IN cursor1 
    LOOP 
     IF C."Count"=1 THEN 
      DBMS_OUTPUT.PUT_LINE('There is '||c."Count"||' student in ' || c.courseNum ||', '||c.CourseDesc); 
     ELSE 
      DBMS_OUTPUT.PUT_LINE('There are '||c."Count"||' students in ' || c.courseNum ||', '||c.CourseDesc); 
     END IF; 
    END LOOP; 
END; 
1

需要使用遊標變量來保存結果集,它可以作爲一個過程OUT參數,而是通過一個函數返回它的輸出是通常的處理事物的方式。就像這樣:

CREATE OR REPLACE FUNCTION STUDENT_COUNT_COURSE 
    (p_CrsNum IN COURSE.COURSENUM%TYPE) 
    RETURN sys_refcursor 
IS 
    rc sys_refcursor; 
BEGIN 
    open rc for 
      SELECT  CourseDesc.courseNum 
        , CourseDesc.courseDesc 
        , COUNT(DISTINCT Student.studentID) 
      FROM   Course INNER JOIN 
         CourseDesc ON Course.courseNum = CourseDesc.courseNum INNER JOIN 
         Grades ON Course.courseID = Grades.courseID INNER JOIN 
         Student ON Grades.studentID = Student.studentID 
      WHERE  (CourseDesc.courseNum = p_CrsNum) 
      GROUP BY CourseDesc.courseNum, CourseDesc.courseDesc; 

    return rc; 
end; 
+0

嘿,我需要它在存儲過程中。我已經更新了一下我的代碼。儘管如此,它還是拋出了錯誤。 – OneSneakyMofo 2010-11-28 00:40:55

0

我認爲你可能想是這樣的(只是閱讀光標,並將其發送到標準輸出)

LOOP 
FETCH cursor1 
    INTO couse_num, course_name, num_students; 
EXIT WHEN v_cursor%NOTFOUND; 
DBMS_OUTPUT.PUT_LINE(couse_num|| ' , ' || course_name|| ' , ' || num_students); 
END LOOP; 
CLOSE cursor1; 

但首先你必須創建光標( APC發佈的方式)

相關問題