there is no contradiction here.
A well formed transaction typically touches more than one object. A modification statement (insert, update, delete) touches one object. If you need to insert into t1, update t2, delete from t3 for your transaction - you need three statements.
Pl/sql is the way to bundle those statements into a single call into the database (more efficient, more clear, infinitely reusable)
What you would NOT do, if your transaction was "move data from T1 to T2" would be:
begin
for x in ( select * from T1 ) loop
insert into t2 values X;
end loop;
end;
you would:
begin
insert into t2 select * from t1;
end;
do not do procedurally what you can do in a single sql statement.