8.3 Variables and parameters

本文主要介绍了变量和参数相关知识。变量代表存储位置,有类型之分,包括局部变量、字段等,使用前需赋值。参数有值参数、引用参数等四种,值参数修改不影响原参数,引用参数作为调用者提供参数的别名,修改会影响对应参数。
8.3 Variables and parameters                                           
                                               
Variables represent storage locations. Every variable has a type that  
                                               
determines what values can be stored in                                
                                               
the variable. Local variables are variables that are declared in
methods,                                              
properties, or indexers. A local                                       
                                               
variable is defined by specifying a type name and a declarator that    
                                               
specifies the variable name and an                                     
                                               
optional initial value, as in:                                         
                                               
int a;                                                                 
                                               
int b = 1;                                                             
                                               
but it is also possible for a local variable declaration to include    
                                               
multiple declarators. The declarations of a                            
                                               
and b can be rewritten as:                                             
                                               
int a, b = 1;                                                          
                                               
A variable must be assigned before its value can be obtained. The
example                                              
class Test                                                             
                                               
{                                                                      
                                               
static void Main() {                                                   
                                               
int a;                                                                 
                                               
int b = 1;                                                             
                                               
int c = a + b; // error, a not yet assigned                            
                                               
.                                                                      
                                               
}                                                                      
                                               
}                                                                      
                                               
results in a compile-time error because it attempts to use the variable
a                                              
before it is assigned a value. The                                     
                                               
rules governing definite assignment are defined in §12.3.             
                                               
A field (§17.4) is a variable that is associated with a class or
struct,                                              
or an instance of a class or struct. A field                           
                                               
declared with the static modifier defines a static variable, and a
field                                               
declared without this modifier                                         
                                               
defines an instance variable. A static field is associated with a type,
                                               
whereas an instance variable is                                        
                                               
associated with an instance. The example  
using Personnel.Data;
class Employee { private static DataSet ds; public string Name;
public decimal Salary;
.
}
shows an Employee class that has a private static variable and two public
instance variables.
Formal parameter declarations also define variables. There are four kinds
of parameters: value parameters,
reference parameters, output parameters, and parameter arrays.
A value parameter is used for .in. parameter passing, in which the value of
an argument is passed into a
method, and modifications of the parameter do not impact the original
argument. A value parameter refers to
its own variable, one that is distinct from the corresponding argument.
This variable is initialized by copying
the value of the corresponding argument. The example
using System;
class Test
{
static void F(int p) {
Console.WriteLine("p = {0}", p);
p++;
}
static void Main() {
int a = 1;
Console.WriteLine("pre: a = {0}", a);
F(a);
Console.WriteLine("post: a = {0}", a);
}
}
shows a method F that has a value parameter named p. The example produces
the output:
pre: a = 1
p = 1
post: a = 1
even though the value parameter p is modified.
A reference parameter is used for .by reference. parameter passing, in
which the parameter acts as an alias
for a caller-provided argument. A reference parameter does not itself
define a variable, but rather refers to
the variable of the corresponding argument. Modifications of a reference
parameter impact the
corresponding argument. A reference parameter is declared with a ref
modifier. The example
using System;
class Test
{
static void Swap(ref int a, ref int b) {
int t = a;
a = b;
b = t;
}
static void Main() {
int x = 1;
int y = 2;
Console.WriteLine("pre: x = {0}, y = {1}", x, y);
Swap(ref x, ref y);
Console.WriteLine("post: x = {0}, y = {1}", x, y);
}
}
shows a Swap method that has two reference parameters. The output produced
is:
<think>我们之前讨论了Kettle连接Oracle11g的驱动名称,现在用户的新问题是:如何在Kettle8.3的job流程中通过转换中的分支条件中断JOB的执行。分析:在Kettle中,Job是由多个Entry(如转换、作业等)组成的工作流。转换(Transformation)是Job中的一个步骤,用于数据处理。用户希望在一个转换中根据某个分支条件来中断整个Job的执行。注意:转换本身不能直接中断整个Job,因为转换是Job的一个步骤,而中断通常需要在Job层面控制。因此,我们需要通过以下方法实现:1.在转换中设置一个标志变量,表示是否满足中断条件。2.将这个标志变量传递给Job。3.在Job中根据这个标志变量来决定是否中断后续步骤。具体步骤:1.在转换中使用“设置变量”步骤将条件结果设置到一个变量中(例如:INTERRUPT_FLAG)。2.在转换中,这个变量可以被设置,比如使用“JavaScript”步骤或“过滤记录”步骤来评估条件,然后通过“设置变量”步骤设置变量值。3.在Job中,在转换步骤之后,使用“检查条件”步骤(或者使用“Evaluatevariables”和“Hopconditions”跳转条件)来判断变量值,如果满足中断条件,则跳转到错误处理或者直接停止Job。但是,用户希望的是在转换中根据分支条件中断整个Job。一个更直接的方法是使用“中止”(Abort)步骤,但要注意:-在转换中,如果使用“中止”步骤,那么当执行到该步骤时,整个转换会被中止,并且会将整个转换标记为失败。-在Job中,如果转换步骤失败了,我们可以通过设置Job的跳转逻辑来控制Job的流程。例如,我们可以设置当转换步骤失败时,执行一个清理步骤然后停止Job。因此,我们可以这样做:方案1:在转换中使用“中止”步骤来强制转换失败,然后在Job中利用错误处理跳转来中断Job。方案2:在转换中设置一个变量,然后在Job中根据该变量的值使用“停止作业”步骤来停止整个Job。考虑到用户是在转换中判断条件,我们更倾向于在转换中直接触发一个失败,然后在Job中处理这个失败。详细方案1:步骤1:在转换中,使用一个“过滤记录”步骤将数据流分成两个分支:满足条件和不满足条件。步骤2:在满足条件的分支上,连接一个“中止”步骤(Abort),这样当有数据流入该步骤时,转换会立即中止并标记为失败。步骤3:在Job中,配置该转换步骤的“当错误发生时”跳转。例如,当转换步骤失败时,我们可以跳转到一个“发送邮件”步骤(通知)然后停止整个Job,或者直接停止整个Job。详细方案2(通过变量控制):步骤1:在转换中,使用一个“设置变量”步骤将条件结果设置到Job的一个变量中(注意:在Job中定义的变量,在转换中可以通过“设置变量”步骤来设置,但要注意作用域)。具体做法:在转换中添加“设置变量”步骤,选择“Validintheparentjob”(在父作业中有效),设置变量名为INTERRUPT_FLAG,值为条件满足时的值(比如true)。步骤2:在转换之后,添加一个“作业”(Job)步骤,该步骤是一个特殊的步骤,如“停止作业”(HaltJob)或“条件执行”步骤(ConditionalExecute)。注意:在Kettle中,有一个“停止作业”(Job->Haltjob)步骤,它会使整个作业停止。但是我们无法在条件分支中直接使用该步骤,所以我们需要一个“条件判断”来控制跳转。具体做法:a)在Job中,转换步骤之后添加一个“检查条件”步骤(Checkconditions),或者使用“Evaluatevariables”步骤(评估变量)?b)实际上,在Job中我们可以使用“Evaluatevariables”步骤来检查变量值,但通常我们使用“条件”跳转(Hopconditions)。然而,在Job步骤之间的跳转是自动的,我们可以设置跳转条件。在Job中,步骤之间的连接线可以设置条件,通过双击连接线进行设置。因此,我们可以:在转换步骤后添加一个“写日志”步骤(用于调试,可选),然后添加一个“停止作业”步骤。从转换步骤到“停止作业”步骤画一条线,双击这条线,设置条件:当变量INTERRUPT_FLAG等于true时,执行跳转(即执行停止作业步骤)。同时,从转换步骤到正常的下一个步骤也画一条线,设置条件为:当变量INTERRUPT_FLAG不等于true(或未设置)时跳转。但是,在Job步骤之间的连接线设置条件,需要开启“Enableconditions?”(默认是禁止的)。在Job设计界面,在空白处右键,选择“Changetohopconditions”,然后就可以在连接线上设置条件了。方案比较:方案1:通过转换失败和Job错误处理来实现。转换中满足条件时使用“中止”步骤导致转换失败,然后在Job中捕获这个失败,进行中断。这种方法简单直接,但转换的失败状态可能会在日志中记录为错误,有时可能不符合需求(比如我们不想记录为错误,而只是想正常中断)。方案2:使用变量控制Job流程。这种方式比较灵活,可以更精确地控制流程,且不将转换标记为失败。由于用户没有明确中断是作为错误情况还是正常情况,这里提供两种方案的实现步骤。实现步骤(方案1:转换中止):1.在转换中:步骤1:获取或计算出条件值(比如通过一个表输入步骤或者一个计算步骤)。步骤2:使用“过滤记录”步骤将数据分成两股:条件成立和条件不成立。步骤3:在条件成立的那股流后面添加一个“中止”步骤(在“流程”分类下,名为“Abort”)。注意:如果有多条记录满足条件,那么只要有一条记录进入“中止”步骤,转换就会立即中止。因此,过滤记录步骤的条件设置要确保只有需要中断时才流入中止步骤。2.在Job中:将该转换步骤添加进Job。在转换步骤的后面,添加一个正常的步骤(比如“发送成功通知”)和一个处理中断的步骤(比如“发送中断通知”,然后停止Job)。在转换步骤和“发送中断通知”步骤之间画一条线,然后在线上右键选择“当错误发生时跳转”(或者双击连接线,在“条件”选项卡中选择“当步骤执行结果为错误”)。然后,正常步骤的连线设置为“当步骤执行结果正确时跳转”。这样,当转换中被条件触发中止后,转换步骤会标记为错误,然后跳转到中断处理步骤,从而中断Job。实现步骤(方案2:使用变量):1.在转换中:步骤1:获取或计算出条件值。步骤2:使用一个“设置变量”步骤(在“作业”分类下),将条件结果设置到变量中。在“设置变量”步骤的配置中:-“作用范围”选择“父作业”(ParentJob)。-“变量名称”设置为INTERRUPT_FLAG。-“值”设置为条件成立的值(比如true)。注意:如果条件成立,则设置变量。但要注意,如果有多条数据,可能会多次设置。为了避免多次设置,我们可以通过“过滤记录”步骤确保只有一条记录,或者使用“只选择一个”步骤(UniqueRows)等。另外,也可以使用“分组”步骤取最大值或最小值等,具体根据条件逻辑。2.在Job中:首先,在Job的开始步骤中(或者在转换之前),我们需要初始化变量INTERRUPT_FLAG,比如设置为false。然后,添加转换步骤。接着,我们在转换步骤后添加一个“停止作业”步骤(在“作业”分类下,名为“HaltJob”)。然后,我们需要在转换步骤和“停止作业”步骤之间建立条件跳转:在Job设计界面空白处右键,选择“Changetohopconditions”(切换为条件跳转)。然后从转换步骤画一条线连接到“停止作业”步骤。双击这条线,在“条件”选项卡中设置条件:当变量INTERRUPT_FLAG等于true时执行跳转。同时,从转换步骤画一条线连接到正常的后续步骤(比如“继续下一步”),并设置条件:当变量INTERRUPT_FLAG等于false(或未变化)时执行跳转。注意:在方案2中,如果转换中设置变量为true,那么Job就会跳转到“停止作业”步骤,从而整个Job会停止(停止作业步骤会停止整个Job)。如果没有设置,则继续执行后续步骤。方案选择建议:如果中断属于异常情况,建议使用方案1(中止转换,然后捕获错误),这样在日志中可以看到错误信息,符合常规的错误处理流程。如果中断属于正常情况(例如,满足某个条件就提前结束Job),则建议使用方案2,这样不会在日志中产生错误信息。根据用户要求,我们提供了两种方法。用户可以根据具体情况选择。以下给出一个方案2的简单示例图(文本描述):Job流程:开始->初始化变量(INTERRUPT_FLAG=false)->转换步骤(在转换中可能设置变量为true)->条件1:当INTERRUPT_FLAG==true->停止作业步骤(中断Job)条件2:当INTERRUPT_FLAG==false->正常下一步在转换中:数据输入->过滤记录(条件满足)->设置变量(作用域:父作业,变量名:INTERRUPT_FLAG,变量值:true)注意:在转换中,无论条件满足与否,转换都会执行完毕(除非有中止步骤),但这里我们使用设置变量步骤后,转换会继续执行直到结束。如果条件不满足,那么变量不会被设置(所以保持初始化时的false),因此Job中就会继续执行正常步骤。但是,如果转换中不设置变量(即条件不满足),那么变量保持为初始化值false,所以后续判断为false就会执行正常步骤。关于停止作业步骤:在Kettle8.3中,有一个“停止作业”步骤(在“作业”分类下),它的名字是“Haltjob”。当执行到这个步骤时,整个Job会立即停止,标记为停止(不是错误)。补充:在Job中,我们如何初始化变量?可以在Job的开始处使用“设置变量”步骤(Job分类下的“SetVariables”步骤)来初始化变量。但是注意,在Job中设置的变量对整个Job都有效。另外,也可以直接定义一个变量,然后在转换中修改它。注意:在Job中使用“设置变量”步骤(Job分类下的)可以设置或修改变量值。但是,我们要确保在转换步骤之前已经设置了初始值。另一种初始化方法:在Job的“开始”步骤上右键,选择“Properties”,然后在“Parameters”选项卡中定义变量并赋值(初始值)。由于时间有限,这里不展开。用户可以根据自己的习惯进行变量初始化。总结:方法一(转换中止):转换中使用“Abort”步骤触发转换失败,Job中捕获错误并中断。方法二(变量控制):转换中使用“设置变量”步骤将条件结果传递给Job,Job中通过条件跳转执行“停止作业”步骤来中断。请用户根据实际业务场景选择合适的方案。</think> ### 在 Kettle 8.3 Job 流程中通过转换分支条件中断 JOB 执行的方法 在 Kettle 8.3 中,可以通过以下两种方式实现转换中的分支条件中断整个 Job 执行: --- #### **方案一:通过错误处理机制中断(推荐)** 当转换检测到中断条件时,强制触发错误状态,在 Job 中捕获该错误并终止执行。 **实现步骤:** 1. **在转换中添加终止逻辑** 使用 `Abort` 步骤强制转换失败: ```plaintext 输入数据 → 过滤记录(分支条件) → Abort(条件满足时) ↗(条件不满足继续执行) ``` 2. **在 Job 中配置错误处理** 右键点击转换步骤 → `定义错误处理`: - 勾选 `当错误发生时` - 设置跳转到 `Stop` 或 `Job` > `Halt job` 步骤终止作业 ```mermaid graph TD Start -->|开始| Trans[转换步骤] Trans -->|执行成功| NextStep[后续步骤] Trans -->|错误| Halt[Halt job] Halt --> End[作业终止] ``` **关键点:** - `Abort` 步骤会使转换标记为失败(红色状态)[^1] - 通过错误处理机制将转换失败传递到 Job 层 - 需在 Job 的转换步骤属性中启用错误处理 --- #### **方案二:通过变量控制中断** 将中断标志存储在变量中,Job 根据变量值主动终止。 **实现步骤:** 1. **在转换中设置中断变量** ```plaintext 过滤记录(条件) → Set Variables → 变量名:ABORT_FLAG,值:Y ``` 2. **在 Job 中读取变量并判断** ```plaintext 转换步骤 → JavaScript(验证变量) → Halt job(当 ABORT_FLAG=Y) ``` **JavaScript 代码示例:** ```javascript if (ABORT_FLAG === "Y") { job.forceStopped(); // 强制终止作业 } ``` --- ### 关键注意事项 1. **作用域控制** - 转换中设置变量时选择 `Valid in the parent job`[^4] - 确保变量在 Job 层可访问 ```mermaid classDiagram class 转换步骤{ Set Variables → parent_job_scope } class Job{ 读取 parent_job_scope 变量 } ``` 2. **流程控制优化** - 使用 `Block this step` 避免无意义数据处理 - 在转换的过滤条件中设置 `Send &#39;true&#39; data to:&#39;中止分支&#39;` 3. **错误日志记录** 在 `Halt job` 前添加 `Write to log` 记录中断原因 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值