问题描述
最近在搞oracle存储过程,主要是对以前项目的一个统计的维护,库和表已不能在优化,每天也会有新数据入库,加索引不符合实际,现在只能采用存储过程,因为自己对这一块不是很了解,上头也在催,希望各位牛人帮忙写一下,小弟不胜感激:现在那个建表语句我已给出(table2.sql),还有就是统计的sql也给出了(count.txt) 问题补充:能不能给一下java调用这个存数过程,最好详细点,像那些输入参数和返回结果的处理,最好把 1、没有返回值,2、有一个返回值,3、多个返回值等,这三种的条用情况都给出,加上注释更好;huoyj 写道
解决方案
这里的SYS_CURSOR是Oracle内置的游标类型,在java中对应的是oracle.jdbc.OracleTypes.CURSOR类型,下面是个java调用的例子:java中调用,并处理:CallableStatement cstmt = null;ResultSet rs = null;try {String callSql = "{? = call AAAAA(?)}";cstmt = conn.prepareCall(callSql); cstmt.setString(2, "userName");cstmt.registerOutParameter(1, oracle.jdbc.OracleTypes.CURSOR);cstmt.execute();rs = (ResultSet) cstmt.getObject(1); //直接当做ResutlSet类型来处理 if (rs != null) { System.out.print("usercd"); System.out.print("userName"); System.out.println("EMAIL"); while (rs.next()) { System.out.print(rs.getString(1)+" "); System.out.print(rs.getString(2)+" "); System.out.println(rs.getString(3)); } }
解决方案二:
CREATE OR REPLACE PROCEDURE SMS_COUNT(out_cursor OUT SYS_REFCURSOR) 这里面的out_cursor OUT SYS_REFCURSOR表示的就是返回值,OUT就表示的是输出参数,你可以写多个这样的输出参数就表示多个返回值。
解决方案三:
第一个sms的应该是这么写的,其他的也跟这个类似,你自己写就可以了,CREATE OR REPLACE PROCEDURE SMS_COUNT(out_cursor OUT SYS_REFCURSOR)IS v_sql VARCHAR2(200);BEGIN v_sql:='select to_char(tt.send_time,''yyyy-mm-dd''),message,'+ 'sum(decode(send_state, ''1'', 1, 0)),'+ 'sum(decode(send_state, ''1'', 0, 1)),'+ 'sum(decode(receipt_state, ''1'', 1, 0)),'+ 'sum(decode(receipt_state, ''2'', 1, 0)),'+ 'sum(decode(receipt_state, null, 1, '''', 1, 0)) +' 'from gw_sms_send_log tt '+ 'where to_char(tt.send_time, ''yyyy-mm-dd'') >=''2011-11-14''+ 'group by message,to_char(tt.send_time, ''yyyy-mm-dd'')'+ 'order by sum(decode(send_state, ''1'', 1, 0)) desc'; OPEN out_cursor FOR v_sql;END;