Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用存储过程传入字符串时,如何输出光标?_Sql_Oracle_Stored Procedures - Fatal编程技术网

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;