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;