现在遇到一个问题,就是我写出的每一句SQL语句都要先进行分析,分析出来的COST值小于某个值的时候,这个SQL语句才有效,可是我不知道在JAVA中如何获得SQL的分析结果,帮帮忙,急!(注意用的是oracle数据库)
解决方案 »
- ora-14452 试图创建、更改或删除正在使用的临时表中的索引
- 高分请教高手海量数据录入存储解决方案
- 请问:数据库记录300w,查询速度慢的解决办法?
- 求一本优质初中级水平学oracle资料
- 关于SQL语句中:ROWNUM的奇怪问题.
- 一个真实的故事:IT人离开IT还能干什么
- help!!怎么在Oracle客户端导入导出数据库文件
- 各位大侠:如何在IBM x250带阵列柜的双机热备份系统上安装Oracle817?
- c语言编写oracle数据库,使用游标,然后死在循环里了
- 求助,RAC集群,节点OFFLINE该如何处理
- 求个问题
- 收藏 不显示删除回复显示所有回复显示星级回复显示得分回复 一个比较有意思的难题?关于多条件查询![
SET STATEMENT_ID = 'tybt1'
INTO plan_table
FOR select t1.* from tyb.t1 t1,tyb.t2 t2 where t1.sid=t2.sid;select statement_id,operation,cost from plan_table where statement_id = 'tybt1';
然后使用JDBC获取结果,你看行不?
create sequence SEQ_STATEMENT_ID
minvalue 1
maxvalue 9999999999
start with 1
increment by 1
nocache;
create or replace procedure getCost(
in_sql IN varchar2,
in_cost IN number,
out_ret OUT SYS_REFCURSOR)
as
var_seq varchar2(20);
begin
select trim(to_char(SEQ_STATEMENT_ID.nextVal)) into var_seq from dual; execute immediate 'explain plan SET STATEMENT_ID = '''||var_seq||''' INTO plan_table FOR '||in_sql; open out_ret for
select in_sql||':'||statement_id||':'||operation||':'||trim(to_char(cost)) as soc --这里还需要什么列直接从plan_table里面拿。
from plan_table
where statement_id = var_seq
and cost >= in_cost; exception when others then
raise;
end;
/
java:(db这部分是我封装的连接池,用jdbc的statement一样)package test;import java.math.BigDecimal;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;import oracle.jdbc.driver.OracleTypes;import com.eip.common.EipException;
import com.socix.configure.GlobalInfo;
import com.socix.database.DbFactory;
import com.socix.database.ICallableStatement;public class TestOracleCost { public static void main(String[] args) {
try { GlobalInfo
.loadConfig("E:/workspace/EnterpriseInfoPortal/WebContent/WEB-INF/config/config.xml");
DbFactory.initPool();
// LogManager.init();
long startTime = 0;
long endTime = 0; startTime = new Date().getTime(); ICallableStatement cs = null;
ResultSet rs = null;
try {
cs = DbFactory.getInstance().getCallableStatement("CARTOON",
"{ call getCost(?,?,?)}");
cs.setString(1, "select count(*) from dat_ct_log");
cs.setBigDecimal(2,new BigDecimal("0"));
cs.registerOutParameter(3, OracleTypes.CURSOR);
cs.executeQuery();
rs = (ResultSet) cs.getObject(3);
while (rs.next()) {
System.out.println(rs.getString("SOC"));
}
} catch (Exception e) {
throw new EipException(e);
} finally {
try {
if (rs != null) {
rs.close();
}
if (cs != null) {
cs.close();
}
} catch (SQLException e) {
throw new EipException(e);
}
}
endTime = new Date().getTime();
System.out.println("It takes " + (endTime - startTime)
+ " milliseconds to execute");
System.exit(0);
} catch (Exception e1) {
e1.printStackTrace();
} finally {
DbFactory.shutDown();
System.exit(0);
}
}}
输出:IWAV0055I Java Bean test.TestOracleCost started with the main method
select count(*) from dat_ct_log:2:SELECT STATEMENT:2
select count(*) from dat_ct_log:2:INDEX:2
It takes 109 milliseconds to execute