Как вывести курсор при передаче строки с помощью хранимой процедуры? - PullRequest
0 голосов
/ 28 ноября 2010

Эй, ребята, я работаю над хранимой процедурой, но застрял на том, как вывести курсор ниже.Я хочу, чтобы он прошел любой курс, который я ему дал, и выплюнул счет, номер курса и описание курса.Вот что у меня есть:

EXEC STUDENT_COUNT_COURSE('CS 101');

ЗВОНОКИ

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;

Ответы [ 3 ]

1 голос
/ 28 ноября 2010

Вам нужна переменная курсора для хранения результирующего набора, который вы можете вывести как параметр 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 голосов
/ 28 ноября 2010

Я чувствую себя глупо ... Мне не хватало подчеркивания в моей 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;
0 голосов
/ 28 ноября 2010

Я думаю, что вам может понадобиться что-то вроде этого (просто чтение курсора и отправка его на стандартный вывод)

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)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...