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中几乎总是一个错误。为什么你需要在运行时创建新对象?
某些函数调用物化视图来获取信息。那么我可以直接使用execute来创建这些视图吗? – sealz
@ harper89 - 您需要使用动态SQL(很可能是'EXECUTE IMMEDIATE')来发出任何需要发布的DDL,包括'CREATE VIEW'或'CREATE MATERIALIZED VIEW'调用。每次在代码中引用这些对象时,您还需要使用动态SQL(再次,最有可能是'EXECUTE IMMEDIATE')。这将编译检查推迟到运行时,尽管它确实会使您的代码更难编写和调试。 –
@ harper89:你似乎误解了物化视图的本质。它们被设计为一次创建,然后根据需要刷新。 – Allan