Edmonton learned before the game that Horcoff will have surgery this week to repair a torn labrum in his left shoulder. The 29-year-old forward has 50 points in 53 games this season.
"There are only two ways you can deal with losing your best player," defenseman Steve Staios said. "One is to use it as a crutch and an excuse and the other way is to come out and give your best. And we did that tonight. Every aspect of our game was going tonight."
The Oilers' second win in five games moved them within six points of the eighth playoff spot in the Western Conference.
"It's a game we needed and points that we needed," Edmonton's Jarret Stoll said. "On the day that [Horcoff] made it official that he's gone for the season, it shows that we're not going to give up."
Curtis Joseph made his first start in goal for the Flames after signing with the team last month. He made 23 saves.
Calgary has dropped two in a row after winning four straight.
"I would have liked to have come out of the first with nothing against," Joseph said. "That gave them some life, you could tell. As a goaltender you want to make the big saves."
Edmonton took the lead 6:24 in when Andrew Cogliano hit Pisani with a pass in front of the net. Joseph made the initial stop but Pisani slid the rebound under his pads.
The Oilers extended their lead with just 35 seconds remaining in the opening period as Geoff Sanderson took a rebound behind the net and made a deft no-look feed to Penner, who beat Joseph with a hard wrist shot to his glove side.
Edmonton made it 3-0 5 minutes into the second on the power play. Joseph allowed a big rebound on a point shot by Stoll. Gagner's follow shot caromed off of Hemsky and in.
Calgary had a chance to get back into the game early in the third when Stoll took a double-minor for high-sticking, but the Flames were unable to put a puck past Garon.
"We just didn't have any life in the beginning, I have no idea why," Calgary coach Mike Keenan said. "That's the coach's responsibility to make sure the team's ready and they weren't ready so I take full responsibility for the really poor outing."
A fight-filled game nearly got out of hand with 7 minutes gone in the third.
Flames forward Eric Godard gave Garon a shove into the post, sparking several altercations. Joseph even skated the length of the ice before things calmed.
"I don't think there is any point in fighting the other goalie," Garon said. "The last year the same thing happened and we didn't fight then either."
Oilers coach Craig MacTavish called the scene a "circus show."
"It's maybe a strange tactic for a team like Calgary that depends so heavily on [Miikka Kiprusoff] to be targeting the opposition's goaltender," he said. "Those kinds of things have a way of coming back at you."
Keenan said he wasn't sure what Godard was thinking.
"It was a very undisciplined play that will cost him in the end because he's going to be suspended, that's his third game misconduct and he probably knows that so I have no idea why he acted the way he did," he said. "It's certainly not condoned by our coaching staff and our team."
Edmonton ended up with a 7-minute power play as a result, and the Oilers put the game out of reach with a pair of power-play goals just over a minute apart. The fourth goal came on a point blast from Staios, quickly followed by a goal on a wrist shot by Gagner.
Curtis Glencross made his Oiler debut. The 25-year-old rookie was acquired in a trade with Columbus for defenseman Dick Tarnstrom on Friday. ... With his next victory, Joseph will move into a tie with Terry Sawchuk for fourth spot on the NHL's career list with 447. Only Patrick Roy, Martin Brodeur and Ed Belfour have more career regular-season wins.