<%=odiRef.getSession("SESS_NO")%> will have a unique number for a specific session. If you have 5 parallel sessions, each of them will have its own session number. If you want to have one unique session number across all of them, then you may refresh the <%=odiRef.getSession("SESS_NO")%> in an ODI variable in the parent session and pass the variable to all child sessions. Does that make sense?
You should probably describe a bit more the packages and how they call each others and what you would expect.
In my experience getSession("SESS_NO") works fine even with // scenarios so I guess issue is more with your usage and expectations or you should raise an SR.
No here I have 5 different packages which run concurrently first step of each package will be the
Refresh vaiable : select '<%=odiRef.getSession("SESS_NO")%>' from dual and store as global_session
and use this global session to run the email package.
As I run sessions concurrently it is refreshing 5 times and getting the last refresh value to all my email messages.
It seems that your variable is using "Keep History" and you are just using it in the email package (without passing it). This is how it works: If you refresh the variable in each parallel scenario and then call the email scenario WITHOUT passing the variable to the email scenario AND if it has Keep History, the email scenario will use the latest refreshed value. If you want to avoid it, you need to pass the id variable when calling the email scenario. In this way, ODI will pick the passed variable and not the History one. If you are still having trouble, double click the refresh variable and change history to NEVER and then see what happens. I bet the email job will display the session id as null, since (it seems) that you are not passing it when calling the email scenario.