SQLPLus如果value不为null则解码

时间:2013-01-03 09:58:43

标签: oracle sqlplus

我有一个sqlplus脚本,如果变量不为null,那么我想执行一个脚本并传递该值。如果它为null,那么我想执行一个不同的脚本。我有以下内容:

col scr new_value script
set term off
select decode('&partitions', 'true', 'CreateTablesPartitions', 'CreateTables') scr from   dual;
set term on
@@&script &partitions

检查变量分区是否为true,然后执行CreateTablePartitions。如何检查变量分区是否为空?

2 个答案:

答案 0 :(得分:4)

只需在解码字符串中添加null和要解码的值。

select decode('&partitions', 'true', 'CreateTablesPartitions',
              null, 'itsnull', 'CreateTables') scr 
from   dual;

所以如果它为null,那么结果将是itsnull

答案 1 :(得分:1)

您可以在解码中包含null作为识别值:

col scr new_value script
set term off
set verify off
select decode('&partitions', null, 'CreateTables',
    'CreateTablesPartitions') as scr from dual;
set term on
@@&script &partitions

...如果输入的CreateTables值为空,将运行partitions

但是,因为你有termout off,所以你不会看到值的提示。您可能希望使用位置变量(&1等),具体取决于您打算如何调用它,但假设您确实希望在运行时提示,您可以离开termout on和将noprint添加到column命令(col scr new_value script noprint),这将在输出中显示一些空行;或者先设置partitions。你不能使用define因为它不喜欢空值。

最干净的方法可能是使用accept并提供自己的提示:

accept partitions prompt "Enter partitions: "

col scr new_value script noprint
set verify off
set term off
select decode('&partitions', null, 'CreateTables',
    'CreateTablesPartitions') as scr from dual;
set term on
@@&script &partitions

使用简单的虚拟脚本来调用,例如CreateTables.sql

prompt In CreateTables

...和CreateTablesPartitions

prompt In CreateTablesPartitions with passed value "&1"

......这给了:

Enter partitions: 
In CreateTables

......和:

Enter partitions: Test
In CreateTablesPartitions with passed value "Test"