我的任务是将数据从一个数据库复制到另一个数据库。我没有创建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
答案 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中已弃用,并且有很多限制。
数据泵将是处理这种情况的一种更强大的方式。