Necesitas dynamic SQL
para ello y con Oracle podemos usar execute immediate
para hacerlo.
declare
type array_t is table of varchar2(10);
array array_t := array_t();
lo_stmt varchar2(2000);
begin
select distinct kind
bulk collect into array
from all_data;
for i in 1..array.count loop
--dbms_output.put_line(array(i));
lo_stmt :=
'create table '||array(i)||'_data '||
'as '||
'select kind,time_period,amount '||
' from all_data '||
' where kind = '''||array(i)||'''';
--dbms_output.put_line(lo_stmt);
execute immediate lo_stmt;
end loop;
end;
/
La demostración se puede ver aquí
O con una sola declaración
declare
type array_t is table of varchar2(4000);
array array_t := array_t();
lo_stmt varchar2(2000);
begin
select distinct 'create table '||kind||'_data '||
'as '||
'select kind,time_period,amount '||
'from all_data '||
'where kind = '''||kind||''''
bulk collect into array
from all_data;
for i in 1..array.count loop
--dbms_output.put_line(array(i));
execute immediate array(i);
end loop;
end;
/
También funciona aquí