使用PL / SQL中的数组更新多个表

时间:2012-09-10 23:19:49

标签: sql arrays oracle plsql

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

我想要:

而不是创建5个单独的(和慢的)查询
  1. 设置数组的每个索引是一个表名
  2. 遍历数组
  3. 使用字符串index
  4. 处的字符串值更新表

    我找不到任何东西,就像我在这里提出的概念一样,这让我觉得我完全咆哮着错误的树。

    尽管如此,这是我想要做的伪代码。

    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;
    

1 个答案:

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