Sql 使用存储过程传入字符串时,如何输出光标?
嘿,伙计们,我正在处理一个存储过程,但我一直在研究如何输出下面的光标。我想让它接受我给它的任何课程,并吐出计数、课程编号和课程描述。以下是我目前掌握的情况:Sql 使用存储过程传入字符串时,如何输出光标?,sql,oracle,stored-procedures,Sql,Oracle,Stored Procedures,嘿,伙计们,我正在处理一个存储过程,但我一直在研究如何输出下面的光标。我想让它接受我给它的任何课程,并吐出计数、课程编号和课程描述。以下是我目前掌握的情况: EXEC STUDENT_COUNT_COURSE('CS 101'); 召唤 您需要一个游标变量来保存resultset,可以将其作为过程输出参数输出,但通过函数返回它是处理问题的常用方法。像这样: CREATE OR REPLACE FUNCTION STUDENT_COUNT_COURSE (p_CrsNum IN COU
EXEC STUDENT_COUNT_COURSE('CS 101');
召唤
您需要一个游标变量来保存resultset,可以将其作为过程输出参数输出,但通过函数返回它是处理问题的常用方法。像这样:
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;
我认为您可能需要这样的内容(只需读取光标并将其发送到标准输出)
但是首先你必须创建光标(APC发布的方式)我觉得很愚蠢。。。我的dbms_output.put_行缺少一个下划线,并且在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;
嘿,我需要一个存储过程。我已经更新了一点代码。不过,这让我大吃一惊。
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;
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;