如何在 java 中使用 jdbc 为 oracle 10g 执行 log miner PL/SQL 查询

Posted

技术标签:

【中文标题】如何在 java 中使用 jdbc 为 oracle 10g 执行 log miner PL/SQL 查询【英文标题】:How to execute log miner PL/SQL query for oracle 10g using jdbc in java 【发布时间】:2012-06-01 06:06:13 【问题描述】:

我在 Oracle 中为我的项目使用了一个名为 LogMiner 的工具。我在 Windows 7 32 位机器上使用 Oracle 10g。

为了启动日志挖掘工具,我登录到sqlplus 并执行以下查询:

 //Query to create flat file

 alter system set utl_file_dir='C:\oracle\product\10.2.0\logminer_dir' scope=spfile;
 shutdown immediate
 startup
 show parameter utl_file_dir
 SELECT SUPPLEMENTAL_LOG_DATA_MIN FROM V$DATABASE;    
 ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;

 SELECT SUPPLEMENTAL_LOG_DATA_MIN FROM V$DATABASE;
 alter system switch logfile;

这个 PL/SQL 查询使用 sqlplus 运行良好,但现在我想在 Java 中使用 jdbc 运行同样的查询

我为它写了如下代码:

    package src;
    import java.awt.event.ActionEvent;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.Statement;
    import javax.swing.JButton;
    import javax.swing.JLabel;
    import javax.swing.WindowConstants;
    import javax.swing.SwingUtilities;

    public class LogMiner extends javax.swing.JFrame 
      private JLabel jLabel1;
      private JButton jButton1;
      private JButton jButton4;
      private JButton jButton3;
      private JButton jButton2;


public static void main(String[] args) 
    SwingUtilities.invokeLater(new Runnable() 
        public void run() 
            LogMiner inst = new LogMiner();
            inst.setLocationRelativeTo(null);
            inst.setVisible(true);
        
    );


public LogMiner() 
    super();
    initGUI();


private void initGUI() 
    try 
        setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        getContentPane().setLayout(null);
        
            jLabel1 = new JLabel();
            getContentPane().add(jLabel1);
            jLabel1.setText("LogMiner Tool");
            jLabel1.setBounds(236, 18, 97, 21);
        
        
            jButton1 = new JButton();
            getContentPane().add(jButton1);
            jButton1.setText("Create the flat file");
            jButton1.setBounds(212, 71, 133, 28);
        
        pack();
        setSize(600, 400);
     catch (Exception e) 

        e.printStackTrace();
    




 jButton1.addActionListener(new java.awt.event.ActionListener() 
      public void actionPerformed(ActionEvent e) 

        //write query statement
            try
              
               // load oracle driver
              Class.forName("oracle.jdbc.driver.OracleDriver");
              // connect using Thin driver
              Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:test","system","oracle");
              System.out.println("Connected Successfully To Oracle");
                      //getting errors in the following line...need help here
              String sql="alter system set                              
                     utl_file_dir='C:\oracle\product\10.2.0\logminer_dir'scope=spfile;"
                     +"shutdown immediate"+
                     "startup"+
                     "show parameter utl_file_dir"+
                     "SELECT SUPPLEMENTAL_LOG_DATA_MIN FROM V$DATABASE"+
                     "alter system switch logfile";


                      Statement statement = con.createStatement();
              ResultSet resultset = statement.executeUpdate(sql);  

           resultset.next();
           String s = resultset.getString(1);      
           System.out.println(s);
          statement.close();
              con.close();
              
              catch(Exception ex)
              
                ex.printStackTrace();
              

               

         );

     

    

我应该如何在 Java 中编写相同的查询才能正确执行?有人可以告诉我吗?

【问题讨论】:

【参考方案1】:

你的代码有几个问题:

    一个executeUpdate() 调用不能运行多个语句 executeUpdate() 永远不会返回结果集,您需要使用 execute()executeQuery() shutdownstartup 是 SQL*Plus 命令,不能通过 JDBC 执行。但是,从 11.1 开始,Oracle 的 JDBC 驱动程序中有一个扩展允许您这样做:http://docs.oracle.com/cd/E11882_01/java.112/e16548/dbmgmnt.htm#CHDJABJI 但是我不知道这是否也适用于 Oracle 10(顺便说一下,如果我没记错的话,它是不支持的,你应该升级到 11.x) show parameter 是一个不能从 JDBC 运行的 SQL*Plus 命令。您需要改为运行 select * from v$parameter

【讨论】:

谢谢..升级到oracle 11g后,我的问题解决了:)

以上是关于如何在 java 中使用 jdbc 为 oracle 10g 执行 log miner PL/SQL 查询的主要内容,如果未能解决你的问题,请参考以下文章

如何使用JDBC连接oracle数据库

如何使用 jdbc 连接到 oracle

如何在java类中向oracle数据库写入Date类型的日期

如何通过 JDBC 将 Java 存储过程加载到 Oracle 10g 中?

JDBC:JAVA & Oracle

Java Oracle jdbc SELECT 语句