【问题标题】:Spooled output in SQL*Plus with multiple parametersSQL*Plus 中带有多个参数的假脱机输出
【发布时间】: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 的标准转义是反斜杠。

【问题讨论】:

    标签: oracle powershell oracle-sqldeveloper 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
      

      问候

      【讨论】:

        猜你喜欢
        • 2020-07-02
        • 2011-02-03
        • 2019-04-22
        • 2013-05-19
        • 2021-10-11
        • 2012-07-30
        • 2020-07-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多