DEFINE is not nearly so powerful as you think! But you can accomplish what you want with a COLUMN command.
COLUMN v_today_from_db NEW_VALUE v_today
select to_char(sysdate, 'yyyymmdd') v_today_from_db from dual;
COLUMN/NEW_VALUE is the only way to put the results of a query into a DEFINE variable. This is because DEFINE is a pure client-side text substitution rather than a typed SQL/PLSQL variable.
Check out the SQL*Plus reference.
That was great.