1

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

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

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

4

2 回答 2

4

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

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

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

于 2013-01-03T11:59:51.970 回答
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并添加noprintcolumn命令(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"
于 2013-01-03T12:50:40.927 回答