Ada tiga hal yang salah dengan SQL dinamis Anda.
- EXECUTE IMMEDIATE bukan fungsi:sintaks yang tepat adalah
execute immediate '<<query>>' into <<variable>>
. - Pernyataan INSERT mengambil klausa VALUES atau SELECT tetapi tidak keduanya. SELECT akan sangat salah dalam kasus ini. Perhatikan juga bahwa ini VALUES bukan VALUE.
- COLUMN_NAME adalah literal string dalam SQL dinamis sehingga harus dalam tanda kutip. Tetapi karena pernyataan SQL itu sendiri adalah sebuah string, tanda kutip dalam string dinamis perlu diloloskan sehingga seharusnya `'''||column_name||'''.
Jadi versi yang dikoreksi akan terlihat seperti ini
declare
Cursor C_TABLE is
select trim(table_name) as table_name
from all_tables
where table_name in ('T1', 'T2', 'T3');
V_ROWNUM number;
begin
for m in C_TABLE
loop
for i in ( select column_name
from (
select c.column_name
from all_tab_columns c
where c.table_name = m.table_name
and c.owner = 'owner1'
)
)
loop
execute immediate 'select count(*) from ' || m.table_name into V_ROWNUM;
execute immediate 'insert into MY_table values ( ''' || i.column_name || ''', ' || V_ROWNUM || ')';
end loop;
end loop;
end;
/
SQL dinamis sulit karena mengubah kesalahan kompilasi menjadi kesalahan runtime. Ini adalah praktik yang baik untuk menulis pernyataan terlebih dahulu sebagai SQL statis. Setelah Anda mendapatkan sintaks dasar yang benar, Anda dapat mengubahnya menjadi SQL dinamis.