有时能返回值,有时不能(在数据库中执行确认有值)感觉应该是JAVA的网络
或者是语句逻辑的问题,建议可以对java语句做分步测试!

解决方案 »

  1.   

    PROCEDURE f_main (
          v_subjectcode   IN       VARCHAR2,                            --科目编码
          v_baim          IN       VARCHAR2,                            --业务目的
          v_accperiod     IN       VARCHAR2,                            --会计区间
          v_orient        IN       VARCHAR2,                                --方向
          v_accbook       IN       VARCHAR2,                              --帐套号
          v_year          IN       CHAR,                                      --年
          v_con           IN       VARCHAR2,                      --是否包含未计帐
          v_curdate       IN       VARCHAR2,                            --当前日期
          v_ret_p         OUT      DECIMAL
       )
       AS
       BEGIN
          v_ret_p :=
             f_main (v_subjectcode,                                     --科目编码
                     v_baim,                                            --业务目的
                     v_accperiod,                                       --会计区间
                     v_orient,                                              --方向
                     v_accbook,                                           --帐套号
                     v_year,                                                  --年
                     v_con,                                       --是否包含未计帐
                     v_curdate
                    );
          --DBMS_OUTPUT.put_line ('RetVal = ' || TO_CHAR (v_ret_p));      --当前日期
      IF v_ret_p IS NULL THEN
         v_ret_p := 0;
      END IF;
       END;java:sessionbean  部署在weblogic上  Connection con = null;
        Statement sm = null;
        ResultSet rs = null;
        java.math.BigDecimal dQC = null;    try {
          DataSource dataSource = ServiceLocator.getInstance().getDatasource(
              "jndi/OracleSea", DataSource.class);
          con = dataSource.getConnection();
          if (con == null) {
            log.error("无法获取数据源!");
          }      try {
            log.error("调用getNumber计算值");
            log.info(s_subjectcode+s_baim+s_accperiod+s_orient+s_accbook+s_year+s_con+s_curdate);        String strSQL = "{call zb_main.f_main(?,?,?,?,?,?,?,?,?)}";
            CallableStatement callQC = con.prepareCall(strSQL);        callQC.setString(1, s_subjectcode);
            callQC.setString(2, s_baim);
            callQC.setString(3, s_accperiod);
            callQC.setString(4, s_orient);
            callQC.setString(5, s_accbook);
            callQC.setString(6, s_year);
            callQC.setString(7, s_con);
            callQC.setString(8, s_curdate);        callQC.registerOutParameter(9, java.sql.Types.DECIMAL, 7);        callQC.execute();        dQC = callQC.getBigDecimal(9);
           log.error("调用getNumber计算值,完成;dQC="+dQC.toString());
            con.close();
          }
          catch (java.sql.SQLException sqlE) {
            log.error("调用存储过程计算错误!");
            System.out.println(sqlE.getMessage());
          }    }
        catch (Exception ex) {
          log.error("method计算公式的值:获取数据源出错!");
          ex.printStackTrace();    }
        return dQC;  }
      

  2.   

    刚又试了一下:
       PROCEDURE f_main_t (
         v_subjectcode   IN       VARCHAR2,                           --科目编码
         v_baim          IN       VARCHAR2,                           --业务目的
         v_accperiod     IN       VARCHAR2,                           --会计区间
        v_orient        IN       VARCHAR2,                               --方向
          v_accbook       IN       VARCHAR2,                             --帐套号
         v_year          IN       CHAR,                                     --年
        v_con           IN       VARCHAR2,                     --是否包含未计帐
        v_curdate       IN       VARCHAR2,                           --当前日期
          v_ret_p4         OUT      DECIMAL
       ) AS
       v_ret_p1 DECIMAL;
       BEGIN
      --v_ret_p1 := 10000000;
      v_ret_p1 := f_main_f('4220001','发生','年','借','422','2005','是','2005-11-11');
       v_ret_p4 := v_ret_p1;
       END;  如果在存储过程中直接给变量赋值则可以返回;如果通过函数给变量赋值则不能返回。