为了便于在任务中循环执行某些SQL语句实现多行数据的处理,EasySQLMAIL 1.0.1212版本中提供了@@RUNCMD方法,通过使用@@RUNCMD方法可以在任务的一个SQL命令中循环调用其它SQL命令。
例如,可以在一个SQL命令”命令A”中使用如下语法为查询到的每行数据调用一次”命令B”:
select process_instance_id from t_u #@@runcmd([命令B])#;
语句中的最后一个命令“@@runcmd([命令B])”表示为语句中的每一行查询结果调用一次“命令B“。调用时系统会将“命令A”的语句的查询结果逐行传递给被调用的命令,被调用的命令中可以用“@@sqldata(字段名)”方法获得传入的字段的值。
@@RUNCMD命令的使用方法您可以在SQL命令的语句中加入如下命令来调用RUNCMD命令:
#@@RUNCMD([要调用的命令名称])#
在任务运行时,系统会为
SQL查询的每一行数据调用一次@@RUNCMD中指定的SQL命令。2、使用@@RUNCMD时需要注意的问题被调用的命令的执行场景必须是"供其它命令调用"
(2) @@RUNCMD出现的位置:如果@@RUNCMD出现在SELECT语句中的分号(即语句结束符)前,则系统为SELECT语句的每一行查询结果执行一次@@RUNCMD方法;如果@@RUNCMD单独出现,则只运行一次被调用的命令且不会传递查询结果给被调用命令。
例如,下面的语句中的@@RUNCMD方法只会运行一次:
/*@@runcmd命令在select语句的分号后之后单独出现,只运行一次” 命令B”,且不会传递查询结果给被调命令*/
select * from t_u;
#@@runcmd([命令B])#
下面的语句中的@@RUNCMD方法会循环执行:
/*@@runcmd命令在select之中,系统会为每条查询结果循环调用” 命令B”*/
select * from t_u #@@runcmd([命令B])# ;
(3) 在SQL Server数据库的IF语句中使用@@RUNCMD时需要注意,@@RUNCMD需要与SELECT语句连用才能实现IF的条件为真时执行@@RUNCMD方法。例如,“当a=b时执行@@RUNCMD”的需求应该这样写:
IF a = b select 1 #@@runcmd([命令B])#;/*正确。条件成立时会运行一次@@RUNCMD命令*/
以下是错误的写法:
IF a = b #@@runcmd([读取审批实例详情])#;/*错误。任务运行时会因SQL语法错误而中止*/
(4) 一个SQL命令中可以出现多次@@RUNCMD调用,但每一条SQL语句中只允许出现一次@@RUNCMD调用。例如,可以为一个SQL命令中的多条语句分别调用不同的命令:
--以下是同一个SQL命令中的多条语句。可以在每条语句中出现一次@@runcmd调用
select * from t1 #@@runcmd([命令1])#;--语句1
select * from t2 #@@runcmd([命令2])#;--语句2
if t1 = 1 select 1 #@@runcmd([命令3])#;--语句3
下面的语句写法错误:
select * from t_u #@@runcmd([命令1])# #@@runcmd([命令2]);/*错误,一个语句中出现了多次@@RUNCMD调用*/
如果要在一个语句中调用多条命令,可以在@@RUNCMD中添加多个命令名,每个命令名之间用“,”(逗号)分隔,例如:
select * from t_u #@@runcmd([命令1,命令2,命令3])#;
(5) @@RUNCMD总是在所在的SQL语句执行后才开始运行。
例如,下面的写法中,@@RUMCMD仍然在SELECT语句运行之后才开始执行:
#@@runcmd([命令1])# select * from t_u;
(6) 当@@RUNCMD出现在UPDATE、INSERT、DELETE等语句中时,由于语句不会返回结果集,因此@@RUNCMD不会被执行,任务日志中会有如下记录:
@@RUNCMD命令被忽略时的日志记录
(7) @@RUNCMD方法两端的”#”号是变量定界符,默认为”#”。当数据源是SQL Server数据库时,也可以将变量定界符设置为”${}”以免与SQL Server的临时表符号产生混淆。
设置SQL语句中的变量定界符
上述设置后,@@RUNCMD的写法应变更为
${@@RUNCMD([命令1])}
(8) 如果修改了被调用的命令的名称,或是停用或删除了被调用的命令,则需要同时修改用@@RUNCMD方法调用了此命令的其它SQL命令的语句,否则任务执行时会因找不到被调用的命令而失败。
(9) 循环调用命令时,默认情况下如果某一次调用失败,会中止整个任务。如果需要在某次调用失败时忽略错误继续执行任务,可以在被调用的命令的配置中选择“当语句执行出错时忽略错误并跳过此SQL命令,继续运行任务的其他SQL命令”选项。
“忽略错误并跳过此SQL命令,继续运行任务的其他SQL命令”选项
为了让@@RUNCMD调用的SQL命令更快速地运行,EasySQLMAIL中提供了SQL命令快速运行模式。在使用@@RUNCMD调用SQL命令时,如果被调用的SQL命令符合以下条件,系统将自动使用“快速运行模式”来执行被调用的SQL命令:
(1) 被调用的SQL命令中只有一条SQL语句;
(2) 被调用的SQL命令的语句中的变量全部是“JDBC变量”格式。
例如通过@@RUNCMD命令调用下面的语句时,系统将自动使用“快速运行模式”执行被调用的SQL命令:
SQL命令中只包含了一个SQL语句,且参数全为JDBC变量的SQL命令
系统在执行此命令时将利用JDBC的批量运行功能来提高运行速度。在需要执行大量数据插入或更新(例如在数据源之间复制数据)的语句时,可以通过使用这种配置方法提高任务的运行速度。JDBC变量的使用方法参见“在SQL语句中使用JDBC变量”。
相关文档: