1

如果员工是管道工,我想更新我的员工数据库以将 batch_id 设置为“P-1000”。

我不想创建 5 个单独的(且缓慢的)查询,而是:

  1. 设置数组的每个索引都是一个表名
  2. 遍历数组
  3. 使用字符串索引处的字符串值更新表

我什至找不到任何与我在这里提出的概念类似的东西,这让我认为我完全找错了树。

尽管如此,这是我正在尝试做的伪代码。

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;
4

1 回答 1

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 语句(或打印出来)之类的操作。这通常使调试更容易。

于 2012-09-10T23:27:16.967 回答