get only 2-3 columns instead of all columns
One way: use a record variable:
DO $$
DECLARE
   _rec record;
BEGIN
SELECT INTO _rec
            id, name, surname FROM t WHERE id = ?;
END $$;
Note that the structure of a record type is undefined until assigned. So you cannot reference columns (fields) before you do that.
Another way: assign multiple scalar variables:
DO $$
DECLARE
   _id int;
   _name text;
   _surname text;
BEGIN
SELECT INTO _id, _name, _surname
             id,  name,  surname FROM t WHERE id = ?;
END $$;
As for your first example: %ROWTYPE is just noise in Postgres. The documentation:
(Since every table has an associated composite type of the same name,
  it actually does not matter in PostgreSQL whether you write %ROWTYPE
  or not. But the form with %ROWTYPE is more portable.)
So:
DO $$
DECLARE
   my_data t;  -- table name serves as type name, too. 
BEGIN
   SELECT INTO my_data  * FROM t WHERE id = ?;
END $$;