SQLPLUS连接到不同的dbs

时间:2016-12-30 13:21:38

标签: oracle sqlplus

您好我想在循环中连接到以下dbs并在每个上执行语句:

conn support/support@sp0666to 
conn support/support@sp0667to 
conn support/support@sp0668to 

有没有办法在sqlplus中执行此操作?

提前感谢您的回答!

3 个答案:

答案 0 :(得分:3)

创建一个包含您要执行的大部分操作的脚本(doWork.sql):

conn &1/&2@&3

select EMPLOYEE, AUTHORIZED, TIME, DAT, WORKSTATION
  from EMPLOYEE
 where status = 25;

在单独的脚本(goToWork.sql)中:

set lines 1500 pages 10000
set colsep ';'
set sqlprompt ''
set heading on
set headsep off
set newpage none column tm new_value file_time noprint 

select to_char(sysdate, 'DDMMYYYY_HH24.MI') tm from dual;

accept user
accept pass

spool C:\Users\NANCHEV\Desktop\parked.csv

@@doWork &user &pass sp0666to 
@@doWork &user &pass sp0667to 
@@doWork &user &pass sp0668to 

spool off;
exit

如果您需要单独的文件,请将两个假脱机命令移动到doWork.sql文件。

答案 1 :(得分:2)

假设您要为每个数据库运行相同的查询集,我将创建一个包含这些语句的脚本文件(例如main_statements.sql)。

然后,如果数据库列表是静态的,我将在同一目录中创建第二个脚本文件(例如run_me.sql),内容如下:

connect &&user/&&password@db1
@@main_statements.sql

connect &&user/&&password@db2
@@main_statements.sql

connect &&user/&&password@db3
@@main_statements.sql

...

但是,如果数据库是静态的,但列表包含在某个地方的数据库中,那么我将编写一个生成脚本的脚本(例如run_me.sql),如:

set echo off
set feedback off
set verify off

spool databases_to_run_through.sql

select 'connect '||username||'/'||password||'@'||database_name||chr(10)||
       '@@main_statements.sql'
from   list_of_databases_to_query;

spool off;

@@databases.run_through.sql

N.B。未经测试。另外,我假设您的表包含需要连接的每个数据库的用户名和密码;如果不是这样,你将不得不弄清楚如何处理它们;也许它们都是一样的(在这种情况下,你可以对它们进行硬编码 - 或者更好的是,使用替换变量(例如&&username)来避免将它们存储在普通文件中。然后你必须输入他们在运行时。

您还需要从同一目录运行脚本,否则您最终可能无法在与main_statements.sql等效脚本相同的目录中创建生成的脚本。

答案 2 :(得分:0)

是的,您可以使用oracle DBLink连接到不同的dbs,就像您的示例一样。