You've got two LOOPs, but only one END LOOP. Also I hope you don't mind some style suggestions....
You loop through the pets table, regardless of how many rows you actually want. Add a where clause to the select based on food units. This way Oracle will only return the correct number of rows.
Then for each pet returned, you loop through the entire owner table (every time) to get the owner details. That's not the way to do it, consider this....
CREATE OR REPLACE PROCEDURE PETS_DAILY_FOOD(Food_Units IN number) IS
CURSOR curPF( bvUnits NUMBER) IS
FROM PETS p,
WHERE p.DailyFoodUnits > bvUnits AND
o.owner_id = p.owner_id;
OPEN curPF( Food_Units );
FETCH curPF INTO rowPF;
EXIT WHEN curPF%NOTFOUND;
DBMS_OUTPUT.PUT_LINE( rowPF.Name||' '||rowPF.Breed||' '||rowPF.DailyFoodUnits||' '||rowPF.fname||' '||rowPF.lName );
EXCEPTION WHEN OTHERS THEN
IF curPF%ISOPEN THEN