问题是这样的:
Oracle服务器装在局域网内的某台电脑上:比如192.168.0.100;自己的机子ip(装有客户端)是192.168.0.33;
在java程序中我想读取某一个表(比如muser)的所有数据作为备份。下面是一些参数:
服务器id:gzxx
服务器ip:192.168.0.100
服务器port:1521
表名:muser如何用java的RunTime类的exec函数,执行sql plus命令将muser表数据导出c:\test.txt文件中,字段间以“,”间隔,每条记录为一行。。万分感谢!!!

解决方案 »

  1.   

    问题的关键是如何在程序中执行sql plus命令??我查了很多网页,但是没有一个是说明详细的
      

  2.   

    把命令写进bat文件。java调用bat可以吗?package test;import java.io.IOException;public class Test { public static void main(String[] args) {
    try {
    Runtime   r   =   Runtime.getRuntime();   
    Process   p   =   r.exec("cmd.exe /c"+"start /min d:\\a.bat");
    } catch (IOException e) {
    e.printStackTrace();
    }
    }}
      

  3.   

    r.exec("cmd.exe /c"+"start /min exp username/password@servicename file=filename ...");
    直接使用一条exp就可以了。
      

  4.   

    谢谢xiaopeipei2004(小裴) 的回答,但是我的命令不是固定的,难道每次都再生成一个bat文件,好像有点麻烦!我想用spool命令doer_ljy(可战) 你的方法我知道,这个exp外部命令生成的是dmp文件,而且不能对数据进行筛选。所以不行啊。
      

  5.   

    如果不是想导成dmp,直接调用pl/sql生成一个自定义格式的文件。
    另外,如果仅限于单表的数据导出,exp是可以有过滤条件的。
    这一点,可不能乱说。
      

  6.   

    oracle我不是很熟,我java还行,有java这边的想法的话,你跟贴说好了^_^
      

  7.   

    doer_ljy(可战) ,xiaopeipei2004(小裴) :
    谢谢你们的热情回答!
    我想还想问一下doer_ljy(可战):
    我做的是一个数据库监控程序,一个为办公区,另一个为后台区,两者都有各自的Oracle数据库。我的程序是先在后台区,查找某个时段(比如一天)的数据,把数据个数发送给办公区,然后办公区的服务端接受到消息,它也查找同一时段的数据量,如果发现两者不同,那么发送消息给后台区。后台区变把这个时段的所有数据取出来,发送给办公区,从而实现两者的数据同步。(传输过程是TCP)
    问题是:
    我准备用sql plus的spool把数据取出来,但是用sql loader的replace把数据导进去的时候总有问题。把原来的数据都删除了,但是新数据也没有导进去。感觉plus和loader总是不能完美的运行。如果用exp能否实现我所说的功能?
      

  8.   

    这是loader的一段消息:
    SQL*Loader: Release 9.2.0.1.0 - Production on 星期四 2月 1 16:16:47 2007Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.控制文件: back.ctl
    数据文件: C:\\testMUser.txt
    错误文件: testMUser.bad
    废弃文件: 未作指定

    (可废弃所有记录)加载数: ALL
    跳过数: 0
    允许的错误: 50
    绑定数组: 64 行,最大 256000 字节
    继续:    未作指定
    所用路径:       常规表MUSER
    已加载从每个逻辑记录
    插入选项对此表REPLACE生效   列名                        位置      长度  中止 包装数据类型
    ------------------------------ ---------- ----- ---- ---- ---------------------
    MUSER_ID                            FIRST     *   ,       CHARACTER            
    CREATED                              NEXT     *   ,       CHARACTER            
    ISACTIVE                             NEXT     *   ,       CHARACTER            
    NAME                                 NEXT     *   ,       CHARACTER            
    BUREAU_ID                            NEXT     *   ,       CHARACTER            
    ORG_ID                               NEXT     *   ,       CHARACTER            
    PASSWORD                             NEXT     *   ,       CHARACTER            
    EMAIL                                NEXT     *   ,       CHARACTER            
    TITLE                                NEXT     *   ,       CHARACTER            记录 1: 被拒绝 - 表 MUSER 的列 ISACTIVE 出现错误。
    在逻辑记录结束之前未找到列(使用 TRAILING NULLCOLS)
    记录 2: 被拒绝 - 表 MUSER 的列 CREATED 出现错误。
    在逻辑记录结束之前未找到列(使用 TRAILING NULLCOLS)
    记录 3: 被拒绝 - 表 MUSER 的列 CREATED 出现错误。
      

  9.   

    对于这个错误,怀疑是两边数据库的字段类型有出入造成的。
    exp的话,语法大概是 exp userid/passwd@连接名 .... tables=tablename query='where 条件部分'
    倒入的话,使用imp倒入即可。不过我倒不推荐使用这种方法。
    如果sqlloader不行,可以考虑使用pro*c把格式好的数据倒入到DB中。
    大概的思路:
    使用plsql生成一个自定义格式的文件比如说.csv(逗号分割)
    使用pro*c读取生成生的.csv文件,把数据insert到数据库中。
      

  10.   

    现在oracle支持java存储过程,这是个好东西,你可以试试也许可以解决你说的问题!