not being able to figure it out, I decided to build the validation in the oracle package/stored procedure and reloading the report if error. To my surprise, after the report was re-loaded, the validation started working! However, when loading a blank report, the validation still not works.
I narrowed down the issue to something with the tabs, when I specify the active tab in the URL, for example, &tabs_Dashboard=tab_NewAccount, the validation works!
Btw, I'm using Ajax Tabbing Style, the validation works fine when using RefreshPage