10克封装结构 - 限制参考

问题描述:

我构建一个相当大的Oracle 10g封装的全功能等10克封装结构 - 限制参考

问题是其中的一些功能从materilized视图的表或其它功能正在创建中提取信息。

即使某些功能找不到他们正在寻找的信息,是否有成功编译包的方法(但是这些功能在视图创建完成后才能工作?)。

尝试次数: 我查看了PRAGMA RESTRICT_REFERENCES,但至今没有成功。我是否在正确的轨道上,或者这甚至不可能?

不能将静态SQL引用到编译代码时不存在的对象。对此你无能为力。

您需要修改代码以使用动态SQL来引用在运行时创建的任何对象。你也许可以使用EXECUTE IMMEDIATE,即

EXECUTE IMMEDIATE 
    'SELECT COUNT(*) FROM new_mv_name' 
    INTO l_cnt; 

而不是

SELECT COUNT(*) 
    INTO l_cnt 
    FROM new_mv_name; 

话虽这么说,但我会有关涉及创建任何新表和物化视图的PL/SQL实现非常可疑运行。这在Oracle中几乎总是一个错误。为什么你需要在运行时创建新对象?

+0

某些函数调用物化视图来获取信息。那么我可以直接使用execute来创建这些视图吗? – sealz

+1

@ harper89 - 您需要使用动态SQL(很可能是'EXECUTE IMMEDIATE')来发出任何需要发布的DDL,包括'CREATE VIEW'或'CREATE MATERIALIZED VIEW'调用。每次在代码中引用这些对象时,您还需要使用动态SQL(再次,最有可能是'EXECUTE IMMEDIATE')。这将编译检查推迟到运行时,尽管它确实会使您的代码更难编写和调试。 –

+0

@ harper89:你似乎误解了物化视图的本质。它们被设计为一次创建,然后根据需要刷新。 – Allan