Das Problem ist der ;
Zeichen in 'SELECT * FROM DUAL;'
.
Aus der Dokumentation :
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 ] ;
... wo dynamic_string
ist (Hervorhebung von mir):
Da mehrere Anweisungen nicht akzeptiert werden, es sei denn, Sie schließen sie in einen einzigen PL/SQL-Block ein, den ;
Trennzeichen wird nicht erwartet.
Es gibt eine bessere Erklärung unter Using the EXECUTE IMMEDIATE Statement in PL/SQL :