Creo que lo que intentas hacer es una variable dinamica (?) entonces en vez de arroba @ debiste poner & pero aun así eso solo reemplazaría el nombre de la variable lo cual no tendria sentido, es mas si vuelves a poner &var te volverá a pedir el nombre de la variable por segunda vez, para que solo pida una vez puedes uso de accept o bien &&, aunque como te digo no tiene sentido, en todo caso puedes poner & para el reemplazo de valores a variables.
declare
cadena varchar2(100);
begin
cadena := '&mensaje';
dbms_output.put_line(cadena);
end;
El seteo de variable con set es unicamente para variables de entorno propias de sqlplus tales como la cantidad de lineas a mostrar (linesize) la cantidad de registros para poner cabeceras (pagesize) cantidad de buffer, mostrar salidas con dbms_output (set serveroutput on), etc.
Como te dijo Gilberto te olvidaste de poner los : en la asignacion de variables.
Saludos DTB