sqlplus 动态假脱机文件名
Posted
技术标签:
【中文标题】sqlplus 动态假脱机文件名【英文标题】:sqlplus Dynamic Spool File Name 【发布时间】:2017-02-01 10:04:49 【问题描述】:我需要动态给出spool文件名,并且在调用sqlplus时必须传递参数。以下是我尝试过的
echo exit | sqlplus " Oracle_username / Oracle_pwd @(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(Host= Oracle_HostName )(Port=1521))(CONNECT_DATA=(SID= Oracle_SID )))" @Script.sql 'AppName' 'DatabaseName' 'ObjectType'
在这里,我尝试动态传递应用程序名称、数据库名称和对象类型。在运行 SQLPLUS 步骤之前,我动态创建文件夹(应用程序名称、数据库名称、对象类型都是文件夹,它会因每个应用程序而异)。下面是我的 script.sql 的样子:
SPOOL &&AppName/&&DatabaseName/&&ObjectType/Output.csv
<<SQL Script>>
SPOOL OFF
这确实有效。谁能告诉我需要改变什么。
【问题讨论】:
“不起作用”是什么意思 - 会发生什么?您是否在某处定义了替换变量? 当我像上面那样通过传递参数进行假脱机时,输出不会被导出。没有参数,当我执行脚本时,它可以工作。例如: SPOOL AppName/Databasename/Output.csv 。我从 Ansible playbook 运行所有这些步骤。我将在一个单独的 var 文件中声明所有这些的值。 【参考方案1】:您将要形成假脱机文件路径和名称的值作为参数传递给脚本,但您需要将它们称为位置参数:
SPOOL &1/&2/&3/Output.csv
或者,如果您要将它们重用于其他用途,您可以定义自己的变量,从位置参数设置:
DEFINE AppName=&1
DEFINE DatabaseName=&2
DEFINE ObjectType=&3
SPOOL &&AppName/&&DatabaseName/&&ObjectType/Output.csv
假脱机文件路径将相对于您在运行脚本时所在的目录。如果这不是您想要的,则将根放在 spool 命令中的第一个替换变量之前,无论您使用哪种形式。
您还可以将exit
包含在您的.sql
文件中,这样您就不必在其中回显它;并且您可以使用 TNS 别名而不是在命令行上传递所有连接信息 - 或者如果您可以使用服务名称而不是 SID,您可以使用更简单的简单连接语法:
sqlplus username/password@//hostname:1521/service_name @Script.sql 'AppName' 'DatabaseName' 'ObjectType'
【讨论】:
@@Alex - 这似乎不能解决我的问题。我希望它是完全自动化的,所以我给出了 SPOOL &&1/&&2/&&3/Output.csv 选项,然后我通过 sqlplus 传递了参数(与上面相同)。但是输出没有导出。目前正在使用 Ansible 执行所有操作,所以我没有在 TNS 中添加任何细节。【参考方案2】:将您的应用名称、数据库名称、对象类型设置为环境变量,然后像下面这样尝试
[oracle@ct-myhost-02 ~]$ export app_name=/stage
[oracle@ct-myhost-02 ~]$ export database_name=PSES
[oracle@ct-myhost-02 ~]$ sqlplus / as sysdba
SQL*Plus: Release 11.2.0.3.0 Production on Wed Feb 1 12:04:08 2017
Copyright (c) 1982, 2011, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL> spool $app_name/$database_name/out.csv
SQL> select * from dual;
D
-
X
SQL> spool off;
SQL> exit
Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
[oracle@ct-myhost-02 ~]$ ls -l /stage/PSES/out.csv
-rw-r-----. 1 oracle oinstall 286 Feb 1 12:04 /stage/PSES/out.csv
【讨论】:
@@Jayaprakash - 根据我的要求,我无法将其设置为环境变量。我必须跨多个数据库运行 SQL 脚本并将每个输出保存在不同的文件夹中。这就是我在 Spool 中给出动态参数的原因。它必须是全自动的。所以用过&&AppName以上是关于sqlplus 动态假脱机文件名的主要内容,如果未能解决你的问题,请参考以下文章