declare
c integer := 0;
p1 varchar2(500);
p2 varchar2(500);
expr varchar2(500);
dblink varchar2(500);
part1_type integer;
object_number integer;
dp integer;
guard_error exception;
pragma exception_init(guard_error, -16224);
begin
:object_type := null;
:object_owner := null;
:object_name := null;
:sub_object := null;
expr := :part1;
if :part2 is not null then expr := expr || '.' || :part2; end if;
if :part3 is not null then expr := expr || '.' || :part3; end if;
loop
begin
sys.dbms_utility.name_resolve(name => expr,
context => c,
schema => :object_owner,
part1 => p1,
part2 => p2,
dblink => dblink,
part1_type => part1_type,
object_number => object_number);
if part1_type = 1 then :object_type := 'INDEX'; end if;
if part1_type = 2 then :object_type := 'TABLE'; end if;
if part1_type = 4 then :object_type := 'VIEW'; end if;
if part1_type = 5 then :object_type := 'SYNONYM'; end if;
if part1_type = 6 then :object_type := 'SEQUENCE'; end if;
if part1_type = 7 then :object_type := 'PROCEDURE'; end if;
if part1_type = 8 then :object_type := 'FUNCTION'; end if;
if part1_type = 9 then :object_type := 'PACKAGE'; end if;
if part1_type = 12 then :object_type := 'TRIGGER'; end if;
if part1_type = 13 then :object_type := 'TYPE'; end if;
if part1_type = 28 then :object_type := 'JAVA SOURCE'; end if;
if part1_type = 29 then :object_type := 'JAVA CLASS'; end if;
if :object_type is null then
select object_type into :object_type
from sys.dba_objects
where object_id = object_number;
end if;
exception
when guard_error then
raise;
when others then
null;
end;
c := c + 1;
if c > 9 then
dp := instr(expr, '.', -1);
if dp > 0 then
if :sub_object is not null then
:sub_object := '.' || :sub_object;
end if;
:sub_object := upper(substr(expr, dp + 1)) || :sub_object;
expr := substr(expr, 1, dp - 1);
c := 0;
end if;
end if;
exit when (:object_type is not null) or (c > 9);
end loop;
if :object_type is not null then
if p1 is null then
:object_name := p2;
elsif p2 is null then
:object_name := p1;
if :object_name = :part1 and :part2 is not null then
:sub_object := :part2;
end if;
if :object_name = :part2 and :part3 is not null then
:sub_object := :part3;
end if;
else
:object_name := p1;
:sub_object := p2;
end if;
return;
end if;
begin
if :part2 is null and :part3 is null then
select 'USER', null, :part1
into :object_type, :object_owner, :object_name
from sys.dba_users u
where u.username = :part1
and rownum = 1;
return;
end if;
exception
when no_data_found then
null;
end;
begin
if :part2 is null and :part3 is null and :deep != 0 then
select 'ROLE', null, :part1
into :object_type, :object_owner, :object_name
from sys.session_roles r
where r.role = :part1
and rownum = 1;
return;
end if;
exception
when no_data_found then
null;
end;
if :deep != 0 then
begin
if :part2 is null then
select constraint_type, owner, constraint_name
into :object_type, :object_owner, :object_name
from sys.dba_constraints c
where c.constraint_name = :part1
and c.owner = :cur_schema
and rownum = 1;
else
select constraint_type, owner, constraint_name, :part3
into :object_type, :object_owner, :object_name, :sub_object
from sys.dba_constraints c
where c.constraint_name = :part2
and c.owner = :part1
and rownum = 1;
end if;
if :object_type = 'P' then
:object_type := 'PRIMARY KEY';
end if;
if :object_type = 'U' then
:object_type := 'UNIQUE KEY';
end if;
if :object_type = 'R' then
:object_type := 'FOREIGN KEY';
end if;
if :object_type = 'C' then
:object_type := 'CHECK CONSTRAINT';
end if;
return;
exception
when no_data_found then
null;
end;
end if;
end;