1

我的任务是将数据从一个数据库复制到另一个数据库。我没有创建 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 字符串并将其添加到查询中?

谢谢,萨维莎

4

3 回答 3

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>
于 2012-05-22T08:01:31.107 回答
1

你可以像这样赶时间:

一个 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)

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

于 2012-05-22T08:08:30.617 回答
1

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

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

于 2012-05-22T10:32:08.920 回答