连接到两个不同的数据库并使用shell脚本比较表结果

时间:2012-05-22 07:32:58

标签: oracle shell

我的任务是将数据从一个数据库复制到另一个数据库。我没有创建DB Link的权限。所以,我已经在shell脚本中使用COPY命令完成了这个任务。但现在,我需要比较数据库之间的记录数。我曾经手动这样做。但现在,我想自动化这个。

据我所知,Sqlplus允许我一次连接到一个数据库。但我想要像

这样的东西
sqlplus -s un/pwd@sid <<EOF
 SELECT count(*) FROM table1 WHERE column1 = 'abc'  -- first database
 UNION ALL
 SELECT count(*) FROM table1 WHERE column1 = 'abc';  -- second database
exit
EOF

是否可以省略sqlplus字符串并将其添加到查询中?

谢谢, Savitha

3 个答案:

答案 0 :(得分:2)

您可能希望使用sqlplus替换变量来存储查询结果: http://docs.oracle.com/cd/B19306_01/server.102/b14357/ch5.htm#sthref1114

这些变量是SQL * Plus实例的全局变量,因此它们在连接到另一个数据库时会保留其值。

示例:

SQL> variable var1 number
SQL> variable var2 number
SQL> conn a/b@ccc
Connected.
SQL> begin
  2  select 1111 into :var1 from dual;
  3  end;
  4  /

PL/SQL procedure successfully completed.

SQL> print var1

      VAR1
----------
      1111

SQL> conn a/b@ddd
Connected.
SQL> print var1

      VAR1
----------
      1111

SQL> begin
  2  select 2222 into :var2 from dual;
  3  end;
  4  /

PL/SQL procedure successfully completed.

SQL> print :var2

      VAR2
----------
      2222

SQL> 

我们也可以这样看:

SQL> print :var2 :var1

      VAR2
----------
      2222


      VAR1
----------
      1111

SQL> 

在PL / SQL中使用它们:

SQL> set serveroutput on
SQL> declare
  2  v1 number := :var1;
  3  v2 number := :var2;
  4  begin
  5     dbms_output.put_line('The difference is: '||to_char((v2-v1)));
  6  end;
  7  /
The difference is: 1111

PL/SQL procedure successfully completed.

SQL>

答案 1 :(得分:0)

你可以赶紧这样的事情:

一个sql文件,我们将它命名为tmp.sql:

select count(*) from user_tables;
--SELECT count(*) FROM table1 WHERE column1 = 'abc';
exit;

一个sh文件,我们将其命名为tmp.sh:

echo pass1 | sqlplus -s user1@sid1 @tmp.sql
echo pass2 | sqlplus -s user2@sid2 @tmp.sql

./tmp.sh会输出如下内容:

Enter password:

  COUNT(*)
----------
      1717

Enter password:

  COUNT(*)
----------
        68

(chmod + x tmp.sh)

可以改进这些脚本,但这可以是一个开始。

答案 2 :(得分:0)

COPY命令在SQL * Plus中已弃用,并且有很多限制。

数据泵将是处理这种情况的一种更强大的方式。