现在遇到一个问题,就是我写出的每一句SQL语句都要先进行分析,分析出来的COST值小于某个值的时候,这个SQL语句才有效,可是我不知道在JAVA中如何获得SQL的分析结果,帮帮忙,急!(注意用的是oracle数据库)

解决方案 »

  1.   

    explain plan
        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获取结果,你看行不?
      

  2.   

    我直接用JDBC取不出来,不知道为什么~~~,用存储过程写了一个,供楼主参考。drop sequence SEQ_STATEMENT_ID;
    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