我需要动态地给出假脱机文件名,我必须在调用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'
在这里,我尝试动态传递App Name,Database Name和Object Type。在运行SQLPLUS步骤之前,我动态创建文件夹(应用程序名称,数据库名称,对象类型都是文件夹,它将根据每个应用程序而有所不同).Below是我的script.sql的样子:
SPOOL &&AppName/&&DatabaseName/&&ObjectType/Output.csv
<<SQL Script>>
SPOOL OFF
这项工作非常重要。有人能告诉我需要改变什么。
答案 0 :(得分:0)
您要将要创建假脱机文件路径和名称的值作为脚本的参数传递,但您需要将它们作为位置参数引用:
SPOOL &1/&2/&3/Output.csv
或者,如果您要将其重新用于其他内容,您可以定义自己的变量,从位置参数设置:
DEFINE AppName=&1
DEFINE DatabaseName=&2
DEFINE ObjectType=&3
SPOOL &&AppName/&&DatabaseName/&&ObjectType/Output.csv
假脱机文件路径将相对于您运行脚本时所处的目录。如果那不是您想要的,那么将根目录放在假脱机命令中的第一个替换变量之前,无论您使用哪种形式。
您还可以在exit
文件中加入.sql
,这样您就不必回复它;并且你可以使用TNS别名而不是在命令行上传递所有连接信息 - 或者如果你可以使用服务名而不是SID,你可以使用简单连接语法,这有点简单:
sqlplus username/password@//hostname:1521/service_name @Script.sql 'AppName' 'DatabaseName' 'ObjectType'
答案 1 :(得分:0)
将您的appname,dbname,objecttype&#39;设置为环境变量,然后尝试如下
[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