【发布时间】:2013-09-05 08:08:39
【问题描述】:
当我尝试在 Oracle 数据库中编译我的项目时遇到问题。为了更简单,我有三个对象:2 个包(UTILS 和 TYPES)和 1 个视图(VIEW)。
包 UTILS 使用包 TYPES 中定义的类型。 Package TYPES 使用 VIEW 作为其中一种类型的基础。并且 VIEW 在其脚本中使用包 UTILS 中的函数。当我尝试对这些对象之一进行一些更改时,我无法编译,因为一切都处于无效状态。所以创建了某种对象依赖循环。
请帮我解决这个问题。
例如,有没有编译下面的代码?每个对象在语法上都是正确的,但是如何将它们全部编译在一起呢?
create or replace package my_types is
type type1 is table of number;
type type2 is table of my_view%rowtype;
end;
/
create or replace package my_utils is
function get_1 return number;
procedure do_something(parameter my_types.type2);
end;
/
create or replace package body my_utils is
function get_1 return number is
begin
return 1;
end;
procedure do_something(parameter my_types.type2) is
begin
null;
end;
end;
/
create or replace force view my_view as
select * from dual
where 1 = my_utils.get_1();
exec dbms_utility.compile_schema(user, false);
select object_name from user_objects where status <> 'VALID';
【问题讨论】:
-
打破循环?使函数的执行成为运行时效果(而不是嵌入到查询中)——例如:从字符串中执行函数。
-
所以打破循环是解决这个问题的唯一方法吗?我认为在编译包/视图以忽略其依赖项的无效状态时可能会有一些提示。
-
不知道——你会想要一些 oracle 无所不知的 :-) 我对 Postgres 比较熟悉,这就是我在那里的做法。 (它不会受到 exact 问题的影响,但您仍然可以创建依赖循环)。
-
唯一明智的方法是打破循环,正如@David-SkyMesh 所建议的那样。请您将代码添加到您的问题中吗?
-
@jonearles - 我相信你已经看过这个,但是
UTL_RECOMP无法直接或通过utlrp解决它,这很有趣。建议在我认为的这个版本中它是不可解决的,无论如何都不需要拆分。