Het probleem is de ;
teken in 'SELECT * FROM DUAL;'
.
Uit documentatie :
execute_immediate_statement ::=
EXECUTE_IMMEDIATE dynamic_string
{
INTO { define_variable [, define_variable ...] | record_name }
| BULK COLLECT INTO { collection_name [, collection_name ...] | :host_array_name }
}
[ USING [ IN | OUT | IN OUT ] bind_argument
[, [ IN | OUT | IN OUT ] bind_argument] ... ] [ returning_clause ] ;
... waar dynamic_string
is (nadruk van mij):
Omdat het niet meerdere instructies accepteert, tenzij je ze in een enkel PL/SQL-blok plaatst, is de ;
scheidingsteken wordt niet verwacht.
Er is een betere uitleg op De EXECUTE IMMEDIATE-instructie gebruiken in PL/SQL :