Oracle: Dynamischen SQL Befehl in einer LOOP

In Oracle können Sie auch dynamische SQL Statements als Datenquelle für SQL Abfragen nutzen. Aber nicht nur diese Technik wird im folgenden Beispiel erklärt. Zusätzlich können Sie die Daten des dynamischen SQL Statements auch in einer Schleife (Loop) abarbeiten lassen und dadurch auch mehrere Befehl für jeden Datensatz (Record) verarbeiten. Sie haben dadurch die Möglichkeit, komplexe Verarbeitungen (Befehle) in mehrere einzelne Befehle auszuteilen (zu splitten):

create or replace PROCEDURE TEST (in_Filter IN number)
IS
  Ssql varchar2(2000);
  TYPE c1 IS REF CURSOR;
  the_cursor c1;
BEGIN
  -- SQL Basis (Basisstatement)
  Ssql := 'select distinct kunde.id as kunde_id 
      FROM customer kunde
      WHERE kunde.status = 1';

  -- Filter and das Statement anhängen (wenn ein Filter vorhanden)
  if (in_Filter is not null) then
    Ssql := Ssql || ' AND kunde.code = ' || in_Filter;
  end if;

  -- Daten auslesen
  OPEN the_cursor FOR Ssql;

  -- Für jeden gefundenen Kunden Aktionen verarbeiten
  LOOP
    fetch the_cursor into tmp_kunde_id;
    EXIT WHEN the_cursor%NOTFOUND;

    -- Historie löschen
    delete from customer_state
    where customer = tmp_kunde_id
    and week < (select TO_NUMBER(TO_CHAR(SYSDATE,'IW')) as week from dual);

    -- Stati des Kunden kopieren
    insert into customer_invoices (customer,status,week)
      select cust_id, state_id, week
      from state_tbl
      WHERE status > 0
  end loop;
  close the_cursor;
END;