我在ORACLE中写了2个存储过程,其中一个存储过程要调用另外一个存储过程,我的写法如下,但报错,请各位高手给个指点:CREATE OR REPLACE PROCEDURE SP_SYS_STUDENT_COURSE(
    Result OUT int,
    StudentNo IN VARCHAR2,
    ClassNo IN VARCHAR2,
    YearNo IN VARCHAR2,--学年
    TermNo IN INT--学期    
)
AS 
    StudentId LONG;
    ClassId LONG; 
BEGIN
    SELECT ID INTO StudentId FROM STUDENTS WHERE STUDENT_NO= StudentNo;
    SELECT ID INTO ClassId FROM TERM_CLASS WHERE CLASS_NO=ClassNo;
    Result:=EXECUTE(SP_STUDENT_SELECT_COURSE(StudentId,ClassId,YearNo,TermNo));
    EXCEPTION
        WHEN OTHERS THEN
            ROLLBACK TO SAVEPOINT trans;
            Result:=-20083;    
END SP_SYS_STUDENT_COURSE;

解决方案 »

  1.   

    Result:=EXECUTE(SP_STUDENT_SELECT_COURSE(StudentId,ClassId,YearNo,TermNo));
    改成Result:=SP_STUDENT_SELECT_COURSE(StudentId,ClassId,YearNo,TermNo);
      

  2.   

    3楼的回复不对哦,报错:Compilation errors for PROCEDURE NJXE.SP_SYS_STUDENT_COURSEError: PLS-00222: 在此范围中不存在名为 'SP_STUDENT_SELECT_COURSE' 的函数但我这个'SP_STUDENT_SELECT_COURSE' 是存储过程,并且是存在的。
      

  3.   


    语句改为下面的试试:SP_STUDENT_SELECT_COURSE(StudentId,ClassId,YearNo,TermNo);
    Result:=你要的输出;并且 :你的变量也有问题啊。
        StudentNo IN VARCHAR2,
        ClassNo IN VARCHAR2,
        YearNo IN VARCHAR2,--学年
        TermNo IN INT--学期没有输出变量那里可以得到结果?
      

  4.   

    不知道你的Result要得到说明,过程的嵌套调用,你可以参照下面的。
    注:xx和pp是过程,aa,bb是父过程的输入参数,也是子过程的输入参数;cc是父过程的输出参数,也是子过程的输出参数。CREATE OR REPLACE
    procedure xx(aa in number,bb in number,cc out number)is
    begin
     pp(aa,bb,cc);
    end;
      

  5.   

    SP_STUDENT_SELECT_COURSE是要返回一个值的,而Result就是为了得到这个返回值,然后返回给调用函数,但现在总是出问题,编译不通过。
      

  6.   

    被调用的过程是否 参数定义为 out ?
    如果没有  怎么返回?
    过程中调用 过程   过程名 ( 参数=>参数值    );
    后面就是接收过程out值
      

  7.   

    没看到你定义这个SP_STUDENT_SELECT_COURSE啊?
      

  8.   

    Result:=SP_STUDENT_SELECT_COURSE(StudentId,ClassId,YearNo,TermNo);这样调的话要定义function的,如果定义为procduce则调用方法为:
    CREATE OR REPLACE PROCEDURE SP_SYS_STUDENT_COURSE(
        Result OUT int,
        StudentNo IN VARCHAR2,
        ClassNo IN VARCHAR2,
        YearNo IN VARCHAR2,--学年
        TermNo IN INT--学期    
    )
    AS 
        StudentId LONG;
        ClassId LONG; 
        v_result number;
    BEGIN
        SELECT ID INTO StudentId FROM STUDENTS WHERE STUDENT_NO= StudentNo;
        SELECT ID INTO ClassId FROM TERM_CLASS WHERE CLASS_NO=ClassNo;
        --再定义一个out 变量v_result
        SP_STUDENT_SELECT_COURSE(StudentId,ClassId,YearNo,TermNo,v_result);
        Result:=v_result;
        EXCEPTION
            WHEN OTHERS THEN
                ROLLBACK TO SAVEPOINT trans;
                Result:=-20083;    
    END SP_SYS_STUDENT_COURSE;
      

  9.   

    过程是没有返回值,所以不能这样写
    Result:=EXECUTE(SP_STUDENT_SELECT_COURSE(StudentId,ClassId,YearNo,TermNo));
      

  10.   


    SP_STUDENT_SELECT_COURSE(StudentId,ClassId,YearNo,TermNo)
      

  11.   

    可以定义一个包,将过程SP_STUDENT_SELECT_COURSE,和SP_SYS_STUDENT_COURSE放进去,再在包体中重写一下,再调用.因为存储过程是私有的
      

  12.   

    调用的这个存储过程(SP_STUDENT_SELECT_COURSE)有没有返回(OUT)?
    3楼的回复不对哦,报错:Compilation errors for PROCEDURE NJXE.SP_SYS_STUDENT_COURSEError: PLS-00222: 在此范围中不存在名为 'SP_STUDENT_SELECT_COURSE' 的函数这句很明显就是把SP_STUDENT_SELECT_COURSE当作函数去编译的,所以才出错,