Вы не можете использовать этот механизм; как показано в документации схема железной дороги:
![insert syntax](https://docs.oracle.com/en/database/oracle/oracle-database/12.2/sqlrf/img/single_table_insert.gif)
возвращаемое предложение допускается только для версии значений, но не для версии подзапроса.
Я интерпретирую ваше второе ограничение (относительно «размера таблицы») как количество столбцов, которое вы должны обработать, возможно, как отдельные переменные, а не количество строк - я не понимаю, как это будет быть актуальным здесь. Есть способы избежать использования множества локальных переменных для каждого столбца; Вы можете сначала выбрать переменную типа строки:
declare
v_item number;
v_row table1%rowtype;
begin
...
select null, description
into v_row
from table2 where pk2 = 2;
insert into table1 values v_row returning pk1 into v_item;
dbms_output.put_line(v_item);
...
или с помощью al oop, что может сделать вещи более сложными, чем необходимо, если у вас действительно есть только одна строка:
declare
v_item number;
begin
...
for r in (
select description
from table2 where pk2 = 2
)
loop
insert into table1 (notes) values (r.description) returning pk1 into v_item;
dbms_output.put_line(v_item);
...
end loop;
...
или с коллекцией ... как @Dan опубликовал, пока я отвечал, так что я не буду повторяться! - хотя, опять же, это может быть излишним или слишком сложным для одного ряда.