package body Outer is
package Inner is
function Foo return Integer;
end Inner;
package body Inner is
V : Integer; -- V is visible within the body of
-- Inner, e.g. to Foo
function Foo return Integer is
.
.
.
end Inner;
function Foo renames Inner.Foo;
end Outer;
...gives you what you want. Here, Inner exists just to hide V. If you added more things to Inner, they could also see V; this would then be wider visibility than a function static variable.
If you don't care about hiding V to other things in the body of Outer, you can dispense with Inner (and the rename-as-body) altogether:
package body Outer is
V : Integer;
function Foo return Integer is
.
.
.
end Foo;
end Outer;