Проблемът е ;
символ в 'SELECT * FROM DUAL;'
.
От документация :
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 ] ;
... където dynamic_string
е (акцентът е мой):
Тъй като няма да приеме множество изрази, освен ако не ги затворите в един PL/SQL блок, ;
разделител не се очаква.
Има по-добро обяснение в Използване на командата EXECUTE IMMEDIATE в PL/SQL :