Cahill (7-2) gave up two hits and three walks while striking out a career-high 10 batters and recording his sixth straight victory.
Daric Barton had three doubles and Kurt Suzuki hit a solo home run for Oakland, which has won two straight but has dropped seven of its last 10 games.
Daniel McCutchen (0-3) -- brought up from Triple-A Indianapolis to start for the injured Zach Duke (elbow) -- went six innings, giving up four runs on seven hits and two walks for the Pirates, who lost their 16th consecutive road game and have yet to beat Oakland in eight tries.
Exploding whale video goes viral on Internet
Video of Victoria’s Secret models trying to 'twerk' hits Instagram