前台jsp开发
后台是oracle
具体问题描述:我在jsp页面中调用了一个存储过程,存储过程的内容很简单,就是一个insert语句,过程中没有使用游标,在使用过程中,经常报ORA-01001: invalid cursor这个错误。很郁闷,相同的参数有时能成功,有时会报错。
tomcat使用的是 Oracle JDBC Driver version - 9.0.2.0.0
orcale是10g的
很郁闷。
请高手指点!!

解决方案 »

  1.   

    ORA-01001 invalid cursorCause: Either a host language program call specified an invalid cursor or the value of the MAXOPENCURSORS option in the precompiler command were too small. All cursors must be opened using the OOPEN call before being referenced in any of the following calls: SQL, DESCRIBE, NAME, DEFINE, BIND, EXEC, FETCH, and CLOSE. The Logon Data Area (LDA) must be defined by using OLON or OLOGON. If the LDA is not defined, this message is issued for the following calls: OPEN, COM, CON, ROL, and LOGOFF.Action: Check the erroneous call statement. Specify a correct LDA area or open the cursor as required. If there is no problem with the cursor, it may be necessary to increase the MAXOPENCURSORS option value before precompiling.
      

  2.   

    过程的代码CREATE OR REPLACE PROCEDURE EDU.PROC_SMS_DISPATCHER(
        MSGID             IN VARCHAR2,  
        ATTIME            IN VARCHAR2,  
        T_SRCTERMID       IN VARCHAR2, 
        AIN_SERVICEID     IN VARCHAR2,  
        FEE_TYPE          IN NUMBER,    
        SRCTERMPHONE      IN VARCHAR2,  
        DESCTERMID_LIST   IN  VARCHAR2, 
        DESCTERMID_TYPE   IN  VARCHAR2, 
        UNIT_LIST         IN  VARCHAR2,
       ORGID             IN NUMBER,   
        MSGLEVEL          IN NUMBER,    
        RET               OUT NUMBER,   
        ERRORMSG          OUT VARCHAR2)
    AS
    BEGIN
       DECLARE
          V_ERR_CODE NUMBER;
          V_ERR_TXT   VARCHAR2(600);      DESCTERMID_LIST_VAR VARCHAR(4000);
          DESCTERMID_TYPE_LIST_VAR VARCHAR(2000);      BEGIN
           RET:=0;
            DESCTERMID_LIST_VAR := SUBSTR(DESCTERMID_LIST,1,4000);  
            
            INSERT INTO SMS_DISPATCHER
            (MSGID,     ATTIME,T_SRCTERMID,AIN_SERVICEID,FEE_TYPE,SRCTERMPHONE,
            DESCTERMID_LIST,DESCTERMID_TYPE,UNIT_LIST,
            CREATEDATE,SRC_ORGID,MSG_LEVEL)
            VALUES(MSGID,ATTIME,T_SRCTERMID,AIN_SERVICEID,FEE_TYPE,SRCTERMPHONE,
            DESCTERMID_LIST_VAR,DESCTERMID_TYPE,UNIT_LIST,
            SYSDATE,ORGID,MSGLEVEL);
            COMMIT;
            RET:=1;
       EXCEPTION
           WHEN OTHERS THEN
              ROLLBACK;          V_ERR_CODE := SQLCODE;
              V_ERR_TXT  :=  'PROC_SMS_DISPATCHER:'||SUBSTR(SQLERRM,1,200)||DBMS_UTILITY.FORMAT_ERROR_BACKTRACE();          INSERT INTO PROC_ERR_LOGS(CODE,MESSAGE,INFO)
              VALUES(V_ERR_CODE,V_ERR_TXT,'EXCEPTION');         
              COMMIT;
        END;
    END;页面的代码:
    //接口调用(存储过程)
          String procedure = "{call PROC_SMS_DISPATCHER(?,?,?,?,?,?,?,?,?,?,?,?,?) }";
          CallableStatement cstmt = con.prepareCall(procedure);
      cstmt.setString(1,message_id);
              cstmt.setString(2,"sysdate");
      cstmt.setString(3,srcTermID+"66");
      cstmt.setString(4,"DX");}

    //单位状态
          sql = " select fee_status from table_01 where id = "+ id;
          rs = stmt.executeQuery(sql);
          rs.next();
          cstmt.setString(5,rs.getString(1));      sql = " select mobile from table_02 where id=" + p_id;
          rs = stmt.executeQuery(sql);
          rs.next();
          cstmt.setString(6,rs.getString(1));      cstmt.setString(7,desile_con);
          cstmt.setString(8,"2");
          cstmt.setString(9,det_con);      cstmt.setString(10,g_id);
          cstmt.setString(11,glevel);
          cstmt.registerOutParameter(12,java.sql.Types.INTEGER);
          cstmt.registerOutParameter(13,java.sql.Types.VARCHAR);
      
          int lala=10;
          cstmt.executeUpdate();
          lala=cstmt.getInt(12);
          if(lala==0){
            ----过程调用失败
          }
      

  3.   

    1  单独测试存储过程,相同的参数多调用几次,如果存储过程没有报错,就是调用问题了。
     个人感觉,是存储过程的问题,因为报错是 ora-01001.