应用:通过存储过程返回集合

阅读更多

1,首先是oracle的存储过程,利用了cursor

sql 代码
  1. CREATE OR REPLACE PROCEDURE OTAC_ADM.pro_gettasksubscriber_data (   
  2.    msg_overtime               IN       INTEGER,   
  3.    subscriber_total           IN       INTEGER,   
  4.    task_id                    IN       INTEGER,   
  5.    retry_subscriber_percent   IN       NUMBER,   
  6.    retry_num                  IN       INTEGER,   
  7.    sub_groupid                IN       INTEGER,   
  8.    p_cursor                   OUT      tasksubscriber_package.task_cursor   
  9. )   
  10. IS  
  11.    retry_task    INTEGER;   
  12.    db_retry      INTEGER;   
  13.    db_new        INTEGER;   
  14.    db_task_num   INTEGER;   
  15.   
  16. BEGIN  
  17.    SELECT COUNT (1)   
  18.      INTO db_task_num   
  19.      FROM otatask t   
  20.     WHERE t.statusid = 3;   
  21.   
  22.    IF db_task_num > 0   
  23.    THEN  
  24.       retry_task := subscriber_total / db_task_num * retry_subscriber_percent;   
  25.    ELSE  
  26.       RETURN;   
  27.    END IF;   
  28.   
  29.    SELECT COUNT (msgid)   
  30.      INTO db_retry   
  31.      FROM otatasksubscribers   
  32.     WHERE subscriberstatusid = 2   
  33.       AND (SYSDATE - msg_overtime / (24 * 3600) - sendingdate) > 0   
  34.       AND retrynum < retry_num   
  35.       AND sendingstat = 0   
  36.       AND taskid = task_id   
  37.       AND subgroupid = sub_groupid   
  38.       AND iscanretry = 1;   
  39.   
  40.    IF db_retry > retry_task   
  41.    THEN  
  42.       db_retry := retry_task;   
  43.    END IF;   
  44.   
  45.    db_new := subscriber_total / db_task_num - db_retry;   
  46.   
  47.    OPEN p_cursor FOR  
  48.       -- retry subscriber of a task   
  49.       SELECT *   
  50.         FROM (SELECT   msisdn, currentseq, msgid, retrynum, sendingdate,   
  51.                        subscriberstatusid, patchlastseq, patchlastcode,   
  52.                        iscanretry   
  53.                   FROM otatasksubscribers   
  54.                  WHERE subscriberstatusid = 2   
  55.                    AND (SYSDATE - msg_overtime / (24 * 3600) - sendingdate) >   
  56.                                                                              0   
  57.                    AND retrynum < retry_num   
  58.                    AND sendingstat = 0   
  59.                    AND taskid = task_id   
  60.                    AND iscanretry = 1   
  61.                    AND subgroupid = sub_groupid   
  62.               ORDER BY currentseq DESC)   
  63.        WHERE ROWNUM <= db_retry   
  64.       UNION ALL  
  65.       -- new subscriber of a task   
  66.       SELECT *   
  67.         FROM (SELECT msisdn, currentseq, msgid, retrynum, sendingdate,   
  68.                      subscriberstatusid, patchlastseq, patchlastcode,   
  69.                      iscanretry   
  70.                 FROM otatasksubscribers   
  71.                WHERE subscriberstatusid = 0   
  72.                  AND taskid = task_id   
  73.                  AND subgroupid = sub_groupid   
  74.                  AND iscanretry = 1)   
  75.        WHERE ROWNUM <= db_new;   
  76. EXCEPTION   
  77.    WHEN NO_DATA_FOUND   
  78.    THEN  
  79.       NULL;   
  80.    WHEN OTHERS   
  81.    THEN  
  82.       -- Consider logging the error and then re-raise   
  83.       RAISE;   
  84. END pro_gettasksubscriber_data;   
  85. /  

2.再看看java的调用

java 代码
  1. CallableStatement proc = null;   
  2.             proc = DBConn   
  3.                     .prepareCall("{ call pro_gettasksubscriber_data(?,?,?,?,?,?,?) }");   
  4.             proc.setInt(1, Start.MessageOverTime);   
  5.             proc.setInt(2, Start.runnergroupsize);   
  6.             proc.setInt(3, taskID);   
  7.             proc.setDouble(4, Start.retry_subscriber_percent);   
  8.             proc.setInt(5, Start.RetryTimes);   
  9.             proc.setLong(6, subGroupId);   
  10.             proc.registerOutParameter(7, oracle.jdbc.OracleTypes.CURSOR);   
  11.             proc.execute();   
  12.             rs = (ResultSet) proc.getObject(7);  

3,小心oracle的classes12.jar的bug会造成代码的一些问题。。。

参考

 xiaobo.iteye.com/blog/44466

你可能感兴趣的:(Oracle,SQL,JDBC,Blog)