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 动态假脱机文件名的主要内容,如果未能解决你的问题,请参考以下文章

SQLPlus – 使用假脱机创建视图结构文件

SQLPlus 假脱机追加

sqlplus 假脱机在不同的文件中

在 sqlplus 中使用假脱机运行多个查询

如何使用 SQLPLUS 假脱机到 CSV 格式的文件?

将假脱机文件的名称从 shell 脚本传递给 sqlplus