Answer
Create a dedicated Permission Set with read-only grants to the specific database objects needed, set up on the permission set's Database tab, plus a grant to the FND_RUNTIME role for basic database connectivity — and make sure Company/Site (and any other row-level-security context the queried objects depend on) is properly set up for the user, so the read-only queries actually return data. To fully prevent that user from logging into the front-end application while still allowing the backend ODBC database connection, set the user's Directory ID to null or an arbitrary/unused value in the user creation screen — this blocks application login specifically without affecting their direct database access.