SQL*Plus 中带有多个参数的假脱机输出
Posted
技术标签:
【中文标题】SQL*Plus 中带有多个参数的假脱机输出【英文标题】:Spooled output in SQL*Plus with multiple parameters 【发布时间】:2020-06-18 13:11:20 【问题描述】:我正在尝试使用 Powershell 脚本启动带有 SQL*Plus 的 .sql。由于某种原因,当我在命令行中使用第二个参数时,脚本不会生成输出。当我只使用一个时它确实有效。谁能告诉我我做错了什么?
im用来启动sqlplus的Powershell行如下:
Run-LocalProcess SQLPLUS "$USER/PASS @$SQLPATH\something.sql $1STPARAMETER $2NDPARAMETER"
LocalProcess 是我们用来在 CLI 中启动进程的函数。第一个参数是假脱机输出的文件路径,末尾没有 \。第二个参数是我们试图添加到假脱机输出文件名的数字。
我们使用的.sql如下:
set heading off
set pause off
set verify off
set termout off
set trimspool on
set feedback off
set linesize 500
set pagesize 0
set escape ^
column sys_date heading "SystemDate" new_value sys_date format a20;
select to_char(sysdate,'YYYYMMDDHH24MISS') sys_date
from dual;
column db_name heading "DatabaseName" new_value db_name format a12;
select d.name db_name
from v$database d;
spool &1\&2something_&db_name._&sys_date..txt
SOMETHING
spool off
我将转义设置为 ^ 的原因是 SQLPLUS 的标准转义是反斜杠。
【问题讨论】:
【参考方案1】:假脱机命令应该在查询执行开始之前启动。
【讨论】:
【参考方案2】:你应该使用 Sqlplus 是静默模式,因此你不要把横幅的内容放在你的输出文件中
Run-LocalProcess SQLPLUS -S "$USER/PASS @$SQLPATH\something.sql $1STPARAMETER $2NDPARAMETER"
就像@Sagi 所说,您需要在查询之前放置线轴。
【讨论】:
您好,查询在线轴之后。我只是输入“SOMETHING”而不是查询。当只使用一个参数 (&1) 时,阀芯确实会生成输出。但是当我也使用第二个时它不会。也试过在静默模式下运行,但不能解决问题。【参考方案3】:第二个参数不需要定界吗?而不是“&2something”。不应该是'&2.something'吗?
doit.sql 的内容:
set echo on feedback on verify on trimsp on lines 256 pages 5
Prompt Parm 1 is &1
prompt parm 2 is &2
prompt combined is &1\&2something
prompt combined delimited is &1\&2.something
运行时间:
SQL> @doit
SQL> set echo on feedback on verify on trimsp on lines 256 pages 5
SQL> Prompt Parm 1 is &1
Parm 1 is bob
SQL> prompt parm 2 is &2
parm 2 is carol
SQL> prompt combined is &1\&2something
Enter value for 2something: fubar
combined is bob\fubar
SQL> prompt combined delimited is &1\&2.something
combined delimited is bob\carolsomething
【讨论】:
这解决了问题。我知道它会像这样简单哈哈。感谢您的帮助!【参考方案4】:这是我的例子
cat myscript.sql
set heading off
set pause off
set verify off
set termout off
set trimspool on
set feedback off
set linesize 500
set pagesize 0
set escape ^
column sys_date heading "SystemDate" new_value sys_date format a20;
select to_char(sysdate,'YYYYMMDDHH24MISS') sys_date
from dual;
column db_name heading "DatabaseName" new_value db_name format a12;
select d.name db_name
from v$database d;
spool &1.\_\&2._something_&db_name._&sys_date..txt
select * from dual;
spool off
现在我执行
sqlplus -S "/ as sysdba" @myscript.sql "first" "second"
我明白了
[ftpcpl@scglvdoracd0006 ~]$ ls -ltr firs*
-rw-r--r-- 1 ftpcpl dms 2 Jun 18 16:13
first_second_something_ODCGRC1R_20200618161359.txt
[ftpcpl@scglvdoracd0006 ~]$ cat first_second_something_ODCGRC1R_20200618161359.txt
X
问候
【讨论】:
以上是关于SQL*Plus 中带有多个参数的假脱机输出的主要内容,如果未能解决你的问题,请参考以下文章