您好我想在循环中连接到以下dbs并在每个上执行语句:
conn support/support@sp0666to
conn support/support@sp0667to
conn support/support@sp0668to
有没有办法在sqlplus中执行此操作?
提前感谢您的回答!
答案 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,就像您的示例一样。