Oracle SQL 脚本中基于条件的假脱机生成

Posted

技术标签:

【中文标题】Oracle SQL 脚本中基于条件的假脱机生成【英文标题】:Condition based spool generation in Oracle SQL script 【发布时间】:2014-06-27 08:06:31 【问题描述】:

我有一个场景,我们根据条件生成假脱机。

仅当用户键入 y 时才应生成假脱机。

column col noprint new_value elcm_script
select decode(lower('&gen'),'y','C:\ELCM.SQL','n', 'null') col from dual;

SPOOL c:\ELCM_DETAILS.SPL 
@&elcm_script
spool off

在上面它会生成假脱机文件,即使用户输入 n 喜欢错误读取文件..如果 n.或如何删除已生成的假脱机,如何停止生成假脱机/

【问题讨论】:

您可以将 SPOOL 命令放在脚本 ELCM.SQL 中吗? 澄清一下,您根本不想运行脚本;不只是你想运行它,但不想将输出假脱机到文件中? 除非用户键入“y”,否则我不想生成假脱机。 这并没有真正回答我的问题,但我假设您不想运行脚本,基于当前的解码。这是通过 SQL*Plus 运行的吗? 通过sql developer运行 【参考方案1】:

如果您可以将此控制部分放入自己的脚本中,例如elcm_ctl.sql,你可以这样做:

accept run_it char format a1 prompt "Run the script?"

set termout off

whenever sqlerror exit success rollback
exec if upper(nvl('&run_it', 'N')) != 'Y' then raise no_data_needed; end if;
whenever sqlerror continue

spool c:\elcm.sql
select 'select sysdate from dual;' from dual;
spool off

set termout on

spool c:\elcm_details.spl
@c:\elcm.sql
spool off

在我看来,accept command 比依赖替换提示要简洁一些,并且有点自我记录。这会使用指定的字符串提示用户,而不仅仅是'gen'。 (在 SQL*Plus 中,您可以扩展它并强制用户输入单个字符,如果他们输入更长的内容,则重新提示;如果他们只是按回车而不输入任何内容,则默认为“N”。但 SQL Developer 仅支持功能的子集)。

然后,如果输入的变量值不是'y''Y',则一个小的匿名块会引发异常- 哪个不重要。虽然它正在这样做,但我有 set termout off 所以你看不到实际的异常。我已经使用whenever sqlerror 使脚本在引发异常时退出,因此以后发生的任何事情都不会运行。这是控制脚本中的所有其他内容,不仅仅是下一个查询,但如果您需要更灵活,可以有多个子脚本。

但在 SQL Developer 中,termout 仅在您通过 @ 运行时才能按预期工作。如果您直接从 SQL 工作表运行 elcm_ctl.sql 的内容,您会看到引发了异常,这有点难看。因此,请保存该控制脚本并在一个空的工作表中执行以下操作:

@c:\elcm_ctl.sql

将该工作表作为脚本执行,它会提示您;如果您输入'Y',您将在脚本输出窗口中看到脚本的输出(除非您在控制脚本中留下set termout off),并且它将创建假脱机文件。如果您输入任何其他内容,它将不会运行elcm.sql 文件,不会在脚本输出窗口中显示任何内容,也不会创建假脱机文件。

【讨论】:

完美的亚历克斯..我还有一个问题。我正在我的脚本中生成 C:\ELCM.SQL。我也可以停止它吗? ? 你不需要decode,如果这就是你的意思吗?我展示的是我正在运行以验证这一点的完整脚本。 在我的脚本中。我像这样生成 t C:\ELCM.SQL。 SPOOL c:\ELCM.SQL select 'select sysdate from dual;从双; spool off column col noprint new_value elcm_script select decode(lower('&gen'),'y','C:\ELCM.SQL','n', 'null') col from dual; SPOOL c:\ELCM_DETAILS.SPL @&elcm_script spool off 如果用户键入 n,我不想生成 .sql 如果你在exec检查之后生成它,那么它也会被跳过,是的。 你的意思是说每当 sqlerror exit success rollback set termout off exec if upper(nvl('&run_it', 'N')) != 'Y' then "ALL MY .SQLgenation statements raise no_data_needed ; end if; 每当 sqlerror continue spool c:\elcm_details.spl @c:\elcm.sql spool off 时设置 termout .. 正确吗?

以上是关于Oracle SQL 脚本中基于条件的假脱机生成的主要内容,如果未能解决你的问题,请参考以下文章

如何在 sql*plus 中修复我的假脱机 csv 文件中的格式

Oracle SQL 自动并行假脱机

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

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

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

如果条件不匹配 SQL,则基于列生成更多行