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 に答える