急!!!求助高手:如何同时从两个数据库上检索数据本人最近遇到一个问题,是这样的:公司有两个不同ORACLE数据库(但它们的表结构等完全相同),这是出于提高查询效率的需要考虑的(SFIS(数据库1)存放近3个月的数据,而SFIS1(数据库2)存放3个月之前的数据),在SFIS里检索需要的数据在速度上明显快于SFIS1;近来,有人提出要求,要求同时从SFIS和SFIS1里检索出他们所需要的数据,并在DELPHI报表上显示。本人现今实现的只是将它们分别显示(BDE DATABASE 、QUERY组件实现),从两个数据库里检索出来的数据是分开的,这里请懂这方面的兄弟姐妹帮帮忙,谢谢了。要求:实现同时在两个数据库上检索数据并合并,而不是连接哦
 

解决方案 »

  1.   


    使用连接服务器
    oracle不知道有没这个东东
      

  2.   

    用oracle最好的方法还是用dblink建库连接,然后建一view,这样就很方便在一个别名中查询了(我一直这样用)
    另外,如果用BDE,它有别名支持,不过在oracle的别名中没试过,你可试一下
    select * from SFIS
    union all
    select * from :ora1:SFIS
      

  3.   

    我试了一下,BDE别名方式不可用,如果你的数据量不大,还有一方法就是将两个表的数据合并到一个本地表
    不过我仍建议用dblink
      

  4.   

    就是因为数据量大,为了加快检索速度,才弄了两个数据库啊。dblink什么东东?在DELPHI里能这样操作吗:
    select * from SFIS
    union all
    select * from :ora1:SFIS
      

  5.   

    多线程+2个ADO,不就可以了吗
      

  6.   

    dblink是oracle特有的功能,它提供了在一个数据库中访问另一数据库的方法
    CREATE PUBLIC DATABASE LINK Linkname CONNECT TO username IDENTIFIED By password USING‘connectstring'
    其中:Linkname 数据库链接的名称
    Username 用户帐户
    password 口令
    connectstring 远程数据库的连接串
    这样你可方便地写
    select * from SFIS
    union all
    select * from SFIS1@Linkname
      

  7.   

    另外:
    1.to  mxlinux(mxlinux) 
    多线程+2个ADO是不能将两个数据集合并到一个数据集中的
    2.在delphi中,如果是用STANDARD数据驱动(如paradox,fox),是可以用
    select * from SFIS
    union all
    select * from :ora1:SFIS
    的,其中ora1是另一BDE的别名
    3.在delphi的bde中实现sql的union,我还是写一下:
    with Query1 do 
    begin
      close;
      sql.clear;
      sql.add('select * from SFIS');
      sql.add('union all');
      sql.add('select * from SFIS1@Linkname');
    //或用sql.text:=将所有的sql写成一行,用空格格开
      open;
    end;
    4.dblink建一次就可以,它会一直存在,除非你删除它
      

  8.   

    To keiy>>>
    CREATE PUBLIC DATABASE LINK Linkname CONNECT TO username IDENTIFIED By password USING‘connectstring',这部分应该在哪里声明?
    我还是菜鸟,请多指教!
      

  9.   

    To  keiy  >  >  >  
    还有一个问题:
    select  *  from  SFIS  
    union  all  
    select  *  from  SFIS1@Linkname  
    from后面应该是表名啊,数据这样不行吧?
      

  10.   

    1.CREATE PUBLIC DATABASE LINK ...是在oracle的sqlplus上作的,先用system用户登录到数据库1,然后建dblink到数据库2
    2.select  *  from  SFIS1@Linkname  当然是可以的,oracle是分布式数据库,完全支持这样的语法(你可找一下plsql的资料)
      

  11.   

    打开sqlplus,输入数据库SFIS用户名sfism4,密码:sfism4,主机字符串:SFIS登陆,键入
    CREATE PUBLIC DATABASE LINK Linkname CONNECT TO sfism4 IDENTIFIED By sfism4 USING‘connectstring' 
    Linkname名字随便取吗?connectstring又该怎么样?这样会在SFIS1里创建DBLINK?
      

  12.   

    linkname随便取,connectstring为你数据库SFIS1的连接串(注意,不是实例名)
    这样会在SFIS中创建一个SFIS1的DBLINK(而非在SFIS1中)
      

  13.   

    to keiy()>>>
    “先用system用户登录到数据库1”,用数据库1的其中一个用户登陆不行吗?
    我的SFIS和SFIS1都有两个相同的用户sfism4、sfis1(密码分别是sfism4、sfis1),我查了一下书籍,connectstring好象可以直接这样写:‘sfis1’
      

  14.   

    可以,但好像不能建public dblink(public dblink对所有用户可用),我一般用system.
    connectstring与你的数据库有关,你可相关工具(如oracle自带的Network Administration)建一connectstring与你数据库的SID相连(如果你已能在SFIS所在服务器上访问到SFIS1,说明存在connectstring),一般人会将connectstring与SID设成相同,所以你的connectstring可能就是'sfis1’
      

  15.   

    哎呀 给错分了 上下条看错了 给了自己。
    keiy(),不好意思!