我有一个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。如何检查变量分区是否为空?
答案 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"