如何从另一个游标设置游标字段名称?神谕

时间:2011-07-21 11:59:58

标签: oracle plsql

我需要从另一个游标中获取游标字段名称:

FOR rec1 IN (SELECT * FROM table1) LOOP  
   FOR rec2 IN (SELECT * FROM table2) LOOP  
       IF rec1.[rec2.field_name] <> '*' THEN 
         ...                                          
       END IF;
   END LOOP;
END LOOP;

2 个答案:

答案 0 :(得分:2)

Oracle实际上并不是针对这种行为而设计的。我能想到的唯一方法是使用动态PL / SQL来生成您正在寻找的功能:

declare
  v_field_value varchar2(2000);
begin
  FOR rec1 IN (SELECT * FROM table1) LOOP  
     FOR rec2 IN (SELECT * FROM table2) LOOP  
         EXECUTE IMMEDIATE 'begin :value := :rec1.' 
                           || :rec2.field_name || '; end;' 
            USING OUT v_field_value, IN rec1;
         IF v_field_value  <> '*' THEN 
           ...                                          
         END IF;
     END LOOP;
  END LOOP;
end;

然而,仅仅因为这种方法可以起作用并不意味着你应该使用它。例如,如果您的字段不是字符串,Oracle将隐式转换该值,这可能会导致与您期望的值不同的值。如果这是我的代码,在考虑在数据库外部实现相同的功能并重新设计数据库的结构以避免需要这种类型的代码之后,我只会将其作为最后的手段。


根据注释中提到的错误注释,我修改了代码,以便使用绑定变量传递记录。

答案 1 :(得分:0)

我不确定,我明白你的问题是什么,你可以访问外部游标循环的记录,就像你期望在当前范围之上的范围内声明的变量一样。

for rec1 in (SELECT * FROM table1) loop
   for rec2 in (SELECT * FROM table2) loop
       if rec1.field = 1 and rec2.field_name <> '*' then
         ...                                          
       end if;
   end loop;
end loop;

有点像

declare
  i Integer;
begin
  declare 
     x Integer;
  begin
     i := x;
  end;
end;