動的SQLには3つの問題があります。
- EXECUTEIMMEDIATEは関数ではありません。適切な構文は
execute immediate '<<query>>' into <<variable>>
です。 。 - INSERTステートメントはVALUES句またはSELECTを取りますが、両方は取りません。この場合、SELECTは非常に間違っています。また、それはVALUEではなくVALUESであることに注意してください。
- COLUMN_NAMEは動的SQLの文字列リテラルであるため、引用符で囲む必要があります。ただし、SQLステートメント自体は文字列であるため、動的文字列の引用符はエスケープする必要があり、 `'''|| column_name||'''にする必要があります。
したがって、修正されたバージョンは次のようになります
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は、コンパイルエラーをランタイムエラーに変えるため、困難です。最初にステートメントを静的SQLとして記述することをお勧めします。基本的な構文を正しく理解したら、それを動的SQLに変換できます。