如果员工是水管工,我想更新我的员工数据库,将batch_id设置为“P-1000”。
我想要:
而不是创建5个单独的(和慢的)查询我找不到任何东西,就像我在这里提出的概念一样,这让我觉得我完全咆哮着错误的树。
尽管如此,这是我想要做的伪代码。
declare
type array_type is table of varchar2(100) index by binary_integer;
dmt_tables array_type;
begin
--fill dm_employeeTables array
dm_employeeTables(0) := 'dm_address';
dm_employeeTables(1) := 'dm_communications';
dm_employeeTables(2) := 'dm_identifier';
dm_employeeTables(3) := 'dm_name';
dm_employeeTables(4) := 'dm_qualifications';
-- loop through tables
for i in dm_employeeTables.FIRST .. dmt_tables.LAST
loop
update dm_employeeTables(i) a
set employee_batch_id = 'P-1000'
where a.employee_type = 'PLUMBER';
i=i+1;
end loop;
end;
答案 0 :(得分:2)
您需要使用动态SQL。像
这样的东西FOR i IN dm_employeeTables.FIRST .. dmt_tables.LAST
LOOP
EXECUTE IMMEDIATE 'UPDATE ' || dm_employeeTables(i) ||
' SET employee_batch_id = :1 ' ||
' WHERE employee_type = :2'
USING 'P-1000', 'PLUMBER';
END LOOP;
现在,从良好的编码角度来看,您可能希望声明一个新的局部变量(即l_sql_stmt
),该变量使用您要执行的SQL语句填充,然后传递给EXECUTE IMMEDIATE
。这允许您在执行SQL语句之前执行诸如记录SQL语句(或将其打印出来)之类的操作。这通常会使调试变得更加容易。