Maybe something is missing in the environment? Missing another variable you need to export?
You could also try to add a 2>&1 in the end of the sqlplus line, just in case to catch everything.
Is the SQL statement running fine when being run on the command line? If yes, then maybe I'd go for a missing environment variable.
$ more rec.sql
select sum (balancechange)
from thistory INNER JOIN account ON
accounthistory.subscriberid = account.subscriberid
where ((account.msisdn not like'200%')
and (account.msisdn not like '100%'))
and changedate between to_date(SYSDATE) and to_date(SYSDATE + 1)
and UPDATEMETHODID in ('334');
exit;
Also where do I add 2>&1 in the .sql file (before the semi colon or not)?
Just as a sidenode: Even if you run it from the oracle crontab you would have to set up all environmental things like for example
. ./.profile
. ./someenv
export ...
When running a crontab, there will be no environmental stuff used like when you log in normal with that user.
If you run this script for testing purpose in the crontab of user oracle, including sourcing it's .profile and environment files, it would be interessting if it works.
If yes, then something in the environment of root might be still missing.