Oracle SQL脚本中基于条件的条带生成

时间:2014-06-27 08:06:32

标签: sql oracle oracle11g oracle10g sql-scripts

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

仅当用户键入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.or如何删除生成的假脱机如何停止生成/

1 个答案:

答案 0 :(得分:0)

如果您可以将此控制部分放入其自己的脚本中,例如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文件,不会在脚本输出窗口中显示任何内容,也不会创建假脱机文件。