The appointment date is in one table, and the time is in another? That's, well, goofy. Given that Oracle doesn't store date or time values, but datetime values, what is the date on those time values?
OK, if you haven't created the Calendar table yet, then this is a good time to do so. Actually, just make it a Numbers table, as that's more flexible. For your purposes, make it a two-column table. The first column contains the integers 0 through, say, 400. The second column is equal to the first column times 15.
In order to do your join, it should look like:
PROCEDURE ApptProc (startdate IN DATETIME, enddate IN DATETIME)
IS
BEGIN
SELECT
DATEADD("mi", Numbers.ID15, TRUNC(startdate)) AS ApptDate,
ApptDetails.*
FROM Numbers
LEFT JOIN ({{insert your existing SQL here}}) ApptDetails
ON Numbers.ID15 = DATEDIFF("mi",TRUNC(ApptDetails.ApptTime),ApptDetails.ApptTime)
END
Well, you'll actually need to add a WHERE clause to only show the times you want. But, that should give you the starting point.
The reason to use the left join is twofold. One, it is significantly more efficient, from a processing point of view. You are only processing the query once, and you are processing everything on the server. Two, it is significantly easier from a management point of view down the road. Even if the SQL above looks complicated to you, it's a lot easier to come back and modify a year from now than a jury-rigged collection of subreports will be. Take it from someone who's been there.