Two different things here:
Same *apex* session is you returning to an existing apex session. But that is not the same as the same *database* session, which typically for apex will be a connection pool. Apex is stateless from the database point of view.
So it works something like this:
- you go to your first apex page
- database session "123" services that request
- you login to apex and hit Submit
- database session "456" services that request
- you now have apex session 47291274
Now you go to a new page.
- database session "345" services that request saying that apex session 47291274 has now moved to page 2 in the application
- you now click on another page
- database session "542" services that request saying that apex session 47291274 has now moved to page 3 in the application
So the database sessions are simply allocated from a pool of available sessions to service your "single" apex session. So the package you populated back in database session 123 is no longer applicable.
Which brings us back to the original answer
Options you could explore:
- Application Items (depends on how many values you have)
- A collection (see apex_collection)
https://docs.oracle.com/database/121/AEAPI/apex_collection.htm#AEAPI531 - a global context variable
https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:1578344046713#10171639368004 because these are things that can stored information *across* database sessions.