A、B两台电脑都装了oracle XE、Compiere,部署成了生产、测试两个应用环境。
现在需要把测试环境XE里的某一些表的记录复制到生产环境里去,尝试过几种办法,均未成功。 1,利用Compiere的导入导出数据库脚本。
从测试环境下导出是可以的,但当移到生产环境下导入时,会提示有一些警告,偶尔还会出现错误。 2,在Compiere系统里导出语言包。
在测试环境下登录Compiere,利用其导出语言包功能,发现一些如filed表格会出现只导出部份的异常情况。
命令行下执行导出语言包脚本一样如此。其原因应该是由于该表某些字段含有影响xml格式的字符。 3,sqldeveloper导入导出。
用最新版的sqldeveloper连接测试环境和生产环境的XE,导出测试环境的某些表为xls、csv、sql、xml格式,
然后在生产环境的XE里导入,均发生问题:
xls---能载入导出的文件,但在预览数据的界面里单击“下一步”没反应。
csv---因为有些表的记录里包含双引号或逗号,所以没法用。
xml---sqldeveloper不支持。
sql---在导入时执行这个sql文件会提示很多的输入“BRADSTREET”、“DIGITS” 在以上办法都不奏效之后,我又想到了使用SQL的 update 语句,在查询了一些资料之后,也发现一个问题:一般情况下,update是针对本机的数据库之间进行update操作,那么,如何从远程的数据库中update本库的数据? 或者说,有什么办法来完成我的需求?

解决方案 »

  1.   

    若A电脑配置为:
    OS:Ubuntu Server 8.04.1
    IP:192.168.0.2
    Com Name:Prod
    Oracle SSID:XE
    SYS Password: dbpwB电脑配置为:
    OS:win2k3
    IP:192.168.0.3
    Com Name:Test
    Oracle SSID:XE
    SYS Password: dbpw且B电脑上装有sqldeveloper,可否大概说一下操作步骤?
      

  2.   

    dblink使用参考http://www.stanford.edu/dept/itss/docs/oracle/10g/server.101/b10759/statements_5005.htm下面是我抄来的详细记录,我测试过可以使用,按照步骤一步步的来测试条件:
    假设某公司总部在北京,新疆有其下属的一个分公司。在本次测试中,新疆的计算机为本地计算机,即本要的IP地址为:192.168.1.100北京的总部有一个集中的数据库,其SID是SIDBJ,用户名:userbj,密码:bj123,北京的IP地址是:192.168.1.101。
    在本地(新疆)的分公司也有一个数据库,其SID是SIDXJ,用户:userxj,密码:xj123,新疆的IP地址是:192.168.1.100。
    要将本地新疆的SIDXJ数据库中访问到北京的数据库SIDBJ中的数据。
    也就是说,在sidxj的数据库中,用户userxj(192.168.1.100)需要建立DBLINK,以userbj的用户身份访问sidBJ(192.168.1.101)中的数据。测试环境:两个数据库均建立在WINXP上,ORACLE的版本均为Oracle817
    建立环境时,要注意关闭两台计算机上的Windows的防火墙,否则,会出现能ping通,但Oracle连接不通的情况。1、问:如何返回数据库的GLOBAL_NAME?
    执行SELECT * FROM GLOBAL_NAME;
    北京的数据库的GLOBAL_NAME为SIDBJ.US.ORACLE.COM
    新疆的数据库的GLOBAL_NAME为SIDXJ2、问:如何查看Global_name参数是true还是False?
    答:执行:SQL> show parameter global_name;
    执行的结果如下:
    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    global_names                         boolean     TRUE表示该参数是true.也可以通过查看v$option视图,如果其中Advanced replication为TRUE,则支持高级复制功能;否则不支持。
    执行语句为:select * from v$option;3、问:如何检查Oracle的版本是否支持同步功能?
    答:执行select * from v$option where PARAMETER='Advanced replication'语句,
    如何返回值为True,那么就是支持,否则就是不支持。在两个数据库中都是检查是否支持才行。
    建立步骤:1、在本地建立一个Oracle的客户端连接tns_xj_to_bj,用于连接北京的数据库。
    2、新建一个连接tnsxj,用于连接本地的sidxj数据库,以tnsxj/userxj/xj123登录到PLSQL中。下面开始创建连接到北京的远程数据连接DBLink。
    create database link SIDBJ.US.ORACLE.COM connect to userbj identified by bj123 using 'tns_xj_to_bj';
    其中:SIDBJ.US.ORACLE.COM是远程的数据库的global_name,userbj是连接SIDBJ的用户名,bj123是userbj的密码,
    tns_xj_to_bj是本地建立的连接到北京的数据库的服务名。3、测试连接是否成功:
    select * from [email protected]
    如果返回结果如下则表示连接成功了。
    DUMMY
    -----
    X4、查询已经建立的远程连接名:
    SQL> select owner,object_name from dba_objects where object_type='DATABASE LINK';OWNER                          OBJECT_NAME
    ------------------------------ --------------------------------------------------------------------------------
    SYSTEM                         SIDBJ.US.ORACLE.COM
    USERXJ                         DBLINK_XJ_TO_BJ
    USERXJ                         SIDBJ
    5、至此,在新疆的计算机上建立了一个DBLINK,用于连接到北京的数据库上,
    在北京的数据库中,建立一个表用于测试。
    create table USERBJ.BJ_TEST
    (
    STU_ID   NUMBER,
    STU_NAME VARCHAR2(100)
    )
    在其中增加一条记录:
    insert into BJ_TEST (STU_ID, STU_NAME)
    values (1, '钟德荣');
    在新疆的数据库中查询北京的数据库中表的信息:
    select * from [email protected]
    查询结果:
        STU_ID STU_NAME
    ---------- --------------------------------------------------------------------------------
             1 钟德荣表示查询是正常的。
    说明:该查询是用
    以上脚本全部通过测试。
      

  3.   

    在SQL*PLUS 中执行COPY命令吧,这样也可以将远程数据库上的数据复制到本地机器上来.
    (设:远程服务器上的数据库的网络服务名为: MDMS,本地数据库的网络服务名为:BOOK)
    命令:copy from user1/password1@mdms to user2/password2@book append <your tablename>(column name list) using <select ...>
    执行以上的命令,就可以将远程服务器上的数据库中的数据复制到本地服务器的数据库上了.这种方法可以有比较好的执行效率.
      

  4.   


    嗯,copy from相当不错,但有一个问题:我的两个数据库用的是oracle XE,它们的sid都是XE,这样的话,命令就变成了copy from user1/password1@XE to user2/password2@XE ....
    这可怎么处理?
      

  5.   

    当我在A机上执行:
    copy from sys/dbpw@(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.3)(PORT = 1521)))(CONNECT_DATA = (SERVICE_NAME = XE))) to sys/dbpw@XE replace AD_MENU_TRL using select * from AD_MENU_TRL;出错如下:
    SP2-0758: FROM clause missing username
      

  6.   

    是网络服务名,不是数据库的实例名(SID).
    所以,即便你的两个数据库的SID是相同的,也没有关系啊.因为你的两个数据库不在同一台服务器上啊.
      

  7.   

    你是不是不知道网络服务名是什么东东啊,
    网络服务名就是在你的TNSNAMES.ORA文件中的那个名称
      

  8.   

    好吧,我承认,我确实不知道网络服务名是啥东东,我之前只知道SID。
    然后我就google了一番,看到了这篇文章,但我发现,对于Oracle XE,我实在不知道如何来处理,包括tnsnames.ora,我找不到这个文件。
      

  9.   

    在win2k3下,tnsnames.ora文件是这样的:
    XE =
      (DESCRIPTION =
        (ADDRESS = (PROTOCOL = TCP)(HOST = lynnpc)(PORT = 1521))
        (CONNECT_DATA =
          (SERVER = DEDICATED)
          (SERVICE_NAME = XE)
        )
      )EXTPROC_CONNECTION_DATA =
      (DESCRIPTION =
        (ADDRESS_LIST =
          (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC_FOR_XE))
        )
        (CONNECT_DATA =
          (SID = PLSExtProc)
          (PRESENTATION = RO)
        )
      )ORACLR_CONNECTION_DATA = 
      (DESCRIPTION = 
        (ADDRESS_LIST = 
          (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC_FOR_XE)) 
        ) 
        (CONNECT_DATA = 
          (SID = CLRExtProc) 
          (PRESENTATION = RO) 
        ) 
      )
    可以看出这时ORACLE 的网络服务名是:XE,假若我要修改网络服务名为TXE,是不是只要更改第一行的 XE 为 TXE?
    另外,若我要连接另一台电脑的ORACLE XE,那是不是要把另一台电脑的这个文件的第一段复制到这个文件里来?