Halladay allowed four hits and struck out four, throwing 44 of his 64 pitches for strikes.
"I was a lot more aggressive and threw a lot more strikes early in the count," Halladay said. "I probably threw fewer cutters and curves than last time out."
Halladay did not walk a batter and threw first-pitch strikes to 14 of his 19 hitters.
"It was a good day for him to pitch," Blue Jays manager John Gibbons said. "It helps to get him in shape."
Pittsburgh starter Ian Snell went four innings and gave up five hits, including Stairs' two-run double. He walked two, struck out four and threw 44 of his 75 pitches for strikes.
"I'm glad they brought out a lot of their big hitters," Snell said. "It's going to make me better this season."
Pirates reliever Elmer Dessens (back) made his first appearance of the spring, allowing one hit in one inning. He threw 13 pitches, 10 for strikes.
Gibbons has no concerns that DH Frank Thomas is hitting .071 this spring.
"He's off balance and just jumping at the ball," Gibbons said. "He just has a little movement in his swing right now."
Lyle Overbay went 2-for-3 with a double and Chip Cannon had a solo homer for Toronto.
Shawn Camp got the save with a scoreless ninth.
Toronto closer B.J. Ryan (left elbow) reported no problems and said he felt good after striking out two in one inning Friday. "Two days off and he will pitch again on Monday," pitching coach Brad Arnsberg said. Ryan is scheduled to pitch one inning again on Monday against the Pirates in Bradenton. "He's a little sore, just normal body soreness," general manager J.P. Ricciardi said. "I think he felt good just to get in a game situation with the adrenaline flowing."