Динамический SQL сложен, потому что он превращает ошибки компиляции в ошибки времени выполнения. Например, в этом случае вам не хватает начального пробела перед where
:
v1:='insert into emp3 as select * from emp'||i||'where 1=1;';
------------------------------------------------^
Это означает, что фактический SQL, который пытается выполнить ваш код, равен
insert into emp3 as select * from emp1where 1=1;
Что не является допустимым SQL и поэтому вы получаете ошибку.
Другая ошибка в том, что нам не нужно включать завершающий символ в конце строки. Таким образом, правильный код должен быть
v1:='insert into emp3 as select * from emp'||i||' where 1=1';
В будущем вам следует использовать код включения для отображения динамического оператора. Вы находитесь на полпути, присваивая инструкцию переменной до ее выполнения. Так что вам просто нужно войти в систему, что может быть так просто, как
dbms_output.put_line(v1);
Гораздо проще обнаружить шаровые объекты в собранной строке, чем пытаться интерпретировать объединение шаблонов и переменных.