Conectarse a dos bases de datos diferentes y comparar el resultado de la tabla usando un script de shell

Tengo la tarea de copiar los datos de una base de datos a otra. No tengo privilegios para crear DB Link. Entonces, logré esta tarea usando el comando COPY en el script de shell. Pero ahora, necesito comparar el recuento de registros entre las bases de datos. Solía ​​hacer esto manualmente. Pero ahora, quiero automatizar esto.

Según mi conocimiento, Sqlplus me permite conectarme a una base de datos a la vez. Pero quiero algo como

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

¿Es posible omitir la cadena sqlplus y agregarla en la consulta?

Gracias, Savitha

preguntado el 22 de mayo de 12 a las 08:05

Esto no te dirá nada. ¿Cómo sabe de qué base de datos proviene el conteo? Además, necesita un enlace DB para hacerlo. Es mejor conectarse a cada base de datos por turnos, devolver el valor al script de shell y comparar allí. Aún mejor, grite hasta que obtenga un enlace a la base de datos (si no rompe ningún procedimiento de seguridad). -

@Ben: Intenté mucho obtener un enlace DB pero mi esfuerzo fue en vano. :( Pero bien por mí. Tengo que aprender el comando COPY. :) Ahora, debería aprender a devolver el valor al script de shell y comparar lo mismo. Gracias por la respuesta. :) -

¿Puedes explicar lo que quieres tener? ¿Qué quieres comparar y qué parametrizar? -

3 Respuestas

Es posible que desee utilizar variables de sustitución de sqlplus para almacenar los resultados de la consulta: http://docs.oracle.com/cd/B19306_01/server.102/b14357/ch5.htm#sthref1114

Estas variables son globales para una instancia de SQL*Plus, por lo que conservan sus valores al conectarse a otra base de datos.

Ejemplo:

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> 

También podemos verlos así:

SQL> print :var2 :var1

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


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

SQL> 

Y úsalos en 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>

contestado el 22 de mayo de 12 a las 11:05

parece que esto resuelve mi problema. Intentaré ponerme al día sobre esto. Gracias. :) - Savitha

También verifique exp_dp/imp_dp como @David Aldridge ha mencionado a continuación. - Iľja

puedes apresurar algo como esto:

Un archivo sql, llamémoslo tmp.sql:

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

Un archivo sh, llamémoslo tmp.sh:

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

./tmp.sh saldría algo como:

Enter password:

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

Enter password:

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

(chmod +x tmp.sh)

Estos scripts se pueden mejorar, pero esto puede ser un comienzo.

contestado el 22 de mayo de 12 a las 09:05

El comando COPY está obsoleto en SQL*Plus y tiene muchas limitaciones.

La bomba de datos sería una forma mucho más robusta de manejar esta situación.

contestado el 22 de mayo de 12 a las 11:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.