SELECT MAX(DATALENGTH(S_Col1)) AS S_Col1_LEN, MAX(DATALENGTH(S_Col2)) AS S_Col2_Len, ...
FROM OPENQUERY(...
should be fine, I think.
Better to do the DATALENGTH tests at the SQL end (i.e. outside the OPENQUERY function), rather than at the Oracle end (which would be inside the OPENQUERY SQL statement) because maybe MS SQL is converting the Oracle data in some way that is increasing the length of the fields (compared to how Oracle sees them)
You might also try:
SELECT *
INTO #TEMP
FROM OPENQUERY(...
but beware this will place a Create Table Lock on TEMPDB for the duration of the OPENQUERY (in case that blocks other people!!)
That should give you the #TEMP table to play around and interrogate - which may be useful if the OPENQUERY takes ages and you want to try several different things.
Either that or put a LIMIT on the rows within the Oracle query to debug your tests with only a few rows:
SELECT ...
FROM OPENQUERY(MyOracleConnection,
'SELECT *
FROM
(
SELECT Col1, Col2, ...
FROM MyOracleTable
WHERE ....
) X WHERE ROWNUM <= 100'
)