我们有一个Oracle存储过程(Package_1.Procedure_1
),它根据特定条件更改表和索引。完成此操作后,引用该表的所有其他对象(包,视图等)将变为无效。即使Oracle在下次使用时自动编译无效对象,某个包仍然无效(Package_2
)。
在下一次操作中不会直接调用此Package_2
,而是在Package_2.Procedure_1
内调用Package_1
。
我在Package_1
中使用以下语句来编译无效对象,然后再进行下一步操作:
execute immediate 'Exec dbms_utility.compile_schema(Schema_Name, false)';
包编译但我收到错误:
ORA-00900执行时无效的SQL语句(对于上面的代码)。
感谢任何帮助。
感谢。
答案 0 :(得分:1)
为什么使用execute immediate执行此活动。您可以直接在包中使用该实用程序。如果您不知道模式名称的值,则可以将变量传递给实用程序。
DECLARE
v_user VARCHAR2(100);
BEGIN
v_user := 'DUMMY_USER_NAME';
DBMS_UTILITY.COMPILE_SCHEMA(v_user);
END;
以上代码对我来说运行良好。