Your quote is correct. And all of your assumptions are also correct.
Ethereum blockchain is deterministic. It means it always contains all of the data required for processing and everyone is able to process the same transaction in exactly the same way. At any given point in time, all the data is known in the blockchain.
This poses certain...difficulties when creating a real-world usage of a smart contract. As the blockchain has no knowledge of anything outside the blockchain, it can't for example tell you the temperature in London at present moment.
So what to do when you want external information into the contract? You send it a transaction which contains that information. For example you can send the current temperature of London to the contract and after that others can query for it.
This is where oracles come in. You can ask an oracle to send a transaction to the blockchain with whatever data you want. That way you don't have to perform the transactions yourself. Here's how it roughly works:
1) Your contract calls an oracle contract with a data request (for example temperature in London)
2) The oracle provider's backend notices the request (probably through some event) and fetches the temperature from some regular online service.
3) The backend sends a transaction to the oracle contract with the temperature
4) The oracle contract forwards the data to your contract
So, oracles are not miracle workers, they can't do anything you couldn't do yourself, they just facilitate the process.