说实话,对存储过程,我是一点都不了解,网上的资料看的是一头雾水,现在又要用这个来做东西
“每天晚上启动,读取符合条件的记录”,这个要怎么实现?
另外在这个存储过程里怎么调用函数

解决方案 »

  1.   

    每天晚上启动的话,得用job吧。
      

  2.   

    begin 
      sys.dbms_job.submit(job => :job, 
                          what => 'addtoWEB_PAYREF_POLICY;', 
                          next_date => to_date('13-11-2009', 'dd-mm-yyyy'), 
                          interval => 'trunc(sysdate)+1'); 
      commit; 
    end; 
      

  3.   

    Job是定时执行存储过程
    上面例子中的addtoWEB_PAYREF_POLICY就是要执行的过程名
    在过程中可以调用函数,怎么调用..你把函数当个值来处理就行了
      

  4.   

    public boolean runProcedure(String procedure_name) throws SQLException
      {
        //运行存储过程
        //procedure_name = p_test2 (param1,param2) 
        Connection conn = null;
        if (ds != null)
        {
          is_use_ds = true;
          conn = ds.getConnection();      
        }
        else
        {
          is_use_ds = false;
          if (conn_vec.size() > ds_vec_index)
            conn = (Connection)conn_vec.get(ds_vec_index);      
        }
        if (conn == null)
        {
          if (is_use_ds == true)
          {
           System.out.println(GlobalFun.getConvStr_SystemOut("无法通过JNDI和数据建立连接。"));
           throw new SQLException("无法通过JNDI和数据建立连接。");
          }
          else
          {
           System.out.println(GlobalFun.getConvStr_SystemOut("无法通过JDBC和数据建立连接。"));
           throw new SQLException("无法通过JDBC和数据建立连接。");
          }
        }
        String procedure = "{call " + procedure_name + " }";
        try
        {
         CallableStatement cstmt = conn.prepareCall(procedure);
         cstmt.executeUpdate();
         cstmt.close();
        }catch (SQLException ex) { return false;}
        return true;
      }这个方法能调用oracle函数么?
    要怎么写调用呢?
      

  5.   

    java程序中,调用存储过程:String proc = "{call proc_name(?,?) }";
    几个参数几个问号('?')。
    CallableStatement cstmt = conn.prepareCall(procedure); 之后设置参数
    cstmt.setString(1,param1); 注意序号从1开始!
    cstmt.setInt(2,param2);
     cstmt.executeUpdate();
     cstmt.close();函数:String proc = "{ ? = call proc_name(?,?) }";
    几个参数几个问号('?')。
    CallableStatement cstmt = conn.prepareCall(procedure); 之后设置参数
    cstmt.registerOutParameter(1,OracleTypes.INTEGER); 注意序号从1开始!
    cstmt.setString(2,param1);
    cstmt.setInt(3,param2);
     cstmt.executeUpdate();
    retVal = cstmt.getInt(1); //这里是获取返回值。
     cstmt.close();就像楼上几位说的。你这个需求,用job再好不过了,根本不用写代码,全部丢给数据库去做。
      

  6.   

    create or replace procedure CHECK_ORDER_TIME_FLAG
    ()
    AS
    last_date varchar2(8);
    begin
     
      select to_char(add_months(to_date(ls_date,'YYYYMMDD'),i_add_months),'YYYYMMDD')
                 into last_date from dual;
       select * into order_time from t_busi_order_dtl
      where process_flag='0' and process_deadline<>'' and process_deadline<last_date;           
    end CHECK_ORDER_TIME_FLAG;研究半天还是写不来
      

  7.   

    select * into order_time from t_busi_order_dtl
    看你的where条件!这张表存在多个列,要用游标。
    另外就是查询结果如果是多于一行数据,select into会出错的。建议你用游标了。
      

  8.   

    i_add_months 应该是你的输入参数吧?create语句里面没看到
      

  9.   

    begin 
      sys.dbms_job.submit(job => :job, 
                          what => 'addtoWEB_PAYREF_POLICY;', 
                          next_date => to_date('13-11-2009', 'dd-mm-yyyy'), 
                          interval => 'trunc(sysdate)+1'); 
      commit; 
    end;这个将会在每天的什么时候执行呢?是不是都是在每天的同一时间点执行呢?
    另外这样改
    begin
      sys.dbms_job.submit(job => :job,
                          what => 'CHECK_ORDER_TIME_FLAG;',
                          next_date => to_date('15-11-2009 00:00:30', 'dd-mm-yyyy hh24:mi:ss'),
                          interval => 'sysdate+1/86400');
      commit;
    end;是不是就每天0点30秒执行,都是固定这个点么?执行完一次,还能保持下一天也是这个时间点执行么?
      

  10.   

    begin
      sys.dbms_job.submit(job => :job,
                          what => 'CHECK_ORDER_TIME_FLAG;',
                          next_date => to_date('15-11-2009', 'dd-mm-yyyy'),
                          interval => 'trunc(sysdate)+1');
      commit;
    end;ORA-01008: 并非所有变量都已绑定
    还要定义变量??
      

  11.   


    variable job number;
    begin 
      sys.dbms_job.submit(job => :job, 
                          what => 'CHECK_ORDER_TIME_FLAG;', 
                          next_date => to_date('15-11-2009', 'dd-mm-yyyy'), 
                          interval => 'trunc(sysdate)+1'); 
      commit; 
    end; 
      

  12.   

    恩,定义job这个变量
     那13楼的问题有人回答下么??
      

  13.   

    要想每天的0点30秒执行,修改成:
      interval => ''TRUNC(SYSDATE + 1)+30/60/60/24'');
      

  14.   

    多了个单引号啊
      interval => 'TRUNC(SYSDATE + 1)+30/60/60/24');
      

  15.   

    你的13楼的第一个'trunc(sysdate)+1'
    似乎没见过这种用法~~~~
    第二个'sysdate+1/86400'相当于每隔一秒执行一次。