-- Redefine acs_object__name using dot notation so it will look
-- exactly like the Oracle version and no code divergency will be
-- needed anymore.
CREATE SCHEMA acs_object;
--
-- procedure acs_object__name/1
--
CREATE OR REPLACE FUNCTION acs_object.name(
name__object_id integer
) RETURNS varchar AS $$
DECLARE
object_name varchar;
v_object_id integer;
obj_type record;
obj record;
BEGIN
-- Find the name function for this object, which is stored in the
-- name_method column of acs_object_types. Starting with this
-- object's actual type, traverse the type hierarchy upwards until
-- a non-null name_method value is found.
--
-- select name_method
-- from acs_object_types
-- start with object_type = (select object_type
-- from acs_objects o
-- where o.object_id = name__object_id)
-- connect by object_type = prior supertype
select title into object_name
from acs_objects
where object_id = name__object_id;
if (object_name is not null) then
return object_name;
end if;
for obj_type
in select ot2.name_method
from acs_object_types ot1, acs_object_types ot2
where ot1.object_type = (select object_type
from acs_objects o
where o.object_id = name__object_id)
and ot1.tree_sortkey between ot2.tree_sortkey and tree_right(ot2.tree_sortkey)
order by ot2.tree_sortkey desc
loop
if obj_type.name_method != '' and obj_type.name_method is NOT null then
-- Execute the first name_method we find (since we're traversing
-- up the type hierarchy from the object's exact type) using
-- Native Dynamic SQL, to ascertain the name of this object.
--
--execute 'select ' || object_type.name_method || '(:1) from dual'
for obj in execute 'select ' || obj_type.name_method || '(' || name__object_id || ')::varchar as object_name' loop
object_name := obj.object_name;
exit;
end loop;
exit;
end if;
end loop;
return object_name;
END;
$$ LANGUAGE plpgsql stable strict;
CREATE OR REPLACE FUNCTION acs_object__name(
name__object_id integer
) RETURNS varchar AS $$
BEGIN
RETURN acs_object.name(name__object_id);
END;
$$ LANGUAGE plpgsql stable strict;