变量保留循环内的先前指定值

时间:2014-05-11 13:08:34

标签: sql stored-procedures firebird firebird2.5

我在存储过程中有变量有一个我不明白的行为,循环内的变量保留了前一个循环值!!

这是存储过程

v_no = 3;
v_counter = 1;
is_special = 1;

  while (:v_counter <= :v_no) do begin

    if (:is_special = 1) then begin

      select tmaster.axis, tdetail.dim_val
        from tdetail
        right outer join tmaster on (tdetail.sp_id = tmaster.sp_id)
        where (tmaster.sp_id = 17) And (tdetail.pos = :v_counter)
        into :v_axis, :v_dim_val;  /* variable retain previous loop values */

        /* ..... more code here */

    end

  end

我这里有两个表,tmaster作为主表,tdetail作为详细表。在上面的代码中单独执行Select语句时,v_counter = 1,2,而3应该导致

axis    dim_val
----------------
X       14
null    null
X       14

但是当v_counter = 2时,axis获得'X',dim_val获得14',作为解决方法,我将两个变量在每个循环的第一个中设置为null while语句,但是为什么变量:v_axis:v_dim_val在v_counter = 2时没有赋值为null,为什么它们保留以前的循环值?

1 个答案:

答案 0 :(得分:1)

我怀疑你tdetail pos = 2实际上没有记录,对吧?因此,select查询的结果是空结果集,而不是所有字段都为NULL的行。由于结果集中没有行,因此没有任何内容可以分配给变量(:v_axis:v_dim_val),因此它们会保留其值。