Oracle 如何从另一个游标设置游标字段名?神谕
我需要从另一个游标获取游标字段名称,如下所示:Oracle 如何从另一个游标设置游标字段名?神谕,oracle,plsql,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
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;
我不确定,我理解您的问题是什么,您可以访问外部游标循环的记录,就像您从在当前游标循环上的作用域中声明的变量所期望的那样
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;
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将隐式转换该值,这可能会导致与您期望的值不同的值。如果这是我的代码,在考虑在数据库之外实现相同的功能并重新设计数据库结构以避免需要此类代码之后,我只会将此作为最后手段
根据注释中提到的错误注释,我修改了代码,以便使用绑定变量传递记录。否,我需要通过包含内部游标的名称访问外部游标记录字段。接收错误:必须声明标识符“rec1.name”。在我看来,记录rec1在executeimmediate中不可见。
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;