1

あるデータベースから別のデータベースにデータをコピーするタスクがあります。DB リンクを作成する権限がないため、シェル スクリプトで COPY コマンドを使用してこのタスクを達成しました。しかし今、データベース間のレコード数を比較する必要があります。私はこれを手動で行っていました。しかし今、私はこれを自動化したい。

私の知る限り、Sqlplus では一度に 1 つのデータベースに接続できます。しかし、私は次のようなものが欲しい

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 に答える