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 中带有多个参数的假脱机输出的主要内容,如果未能解决你的问题,请参考以下文章

在管道分隔的 sqlplus 中带有列标题的假脱机

ORACLE 如何使用具有动态假脱机位置的假脱机

如何将从文件上传小部件上传的假脱机文件传递到 C FILE *f 指针

假脱机输出查询中涉及的多个表

PL/SQL 过程中带有 IN OUT 参数的意外结果

Perl 中带有输出参数的子例程的最佳实践命名约定