问题描述
亲爱的团队,
我将尝试使用一个简单的测试用例来简化我们的场景:
为什么视图对TEST_FUNCTION有依赖?
谢谢。
我将尝试使用一个简单的测试用例来简化我们的场景:
SQL> create table test_20 ( a number) 2 / Table created. SQL> SQL> create or replace function test_function (p_1 in number) 2 return number 3 deterministic 4 is 5 begin 6 return 1; 7 end; 8 / Function created. SQL> SQL> create index test_20_a on test_20(test_function(a)) 2 / Index created. SQL> SQL> SQL> create view vw_test_20 as select 1 as cnt from test_20 2 / View created. SQL> select REFERENCED_NAME, REFERENCED_type, DEPENDENCY_TYPE 2 from user_Dependencies where name='VW_TEST_20' 3 / REFERENCED_NAME REFERENCED_TYPE DEPE ---------------------------------------------------------------- ------------------ ---- TEST_FUNCTION FUNCTION HARD TEST_20 TABLE HARD复制
为什么视图对TEST_FUNCTION有依赖?
谢谢。
专家解答
创建基于函数的索引时,Oracle数据库将添加一个隐藏的虚拟列以 “存储” 每一行的结果:
如果使函数无效,则无法再查询该表:
这当然意味着你也不能查询视图:
这里真正的问题是函数。修复它,一切都很好:
因此依赖关系
create table test_20 ( a number); create or replace function test_function (p_1 in number) return number deterministic is begin return 1; end; / create index test_20_a on test_20(test_function(a)); create view vw_test_20 as select 1 as cnt from test_20; select column_name, data_default, hidden_column, virtual_column from user_tab_cols where table_name = 'TEST_20'; COLUMN_NAME DATA_DEFAULT HIDDEN_COLUMN VIRTUAL_COLUMN ANO NO SYS_NC00002$ "CHRIS"."TEST_FUNCTION"("A") YES YES 复制
如果使函数无效,则无法再查询该表:
create or replace function test_function (p_1 in number) return number deterministic is begin return 1 end; / show err LINE/COL ERROR -------- ----------------------------------------------------------------- 7/1 PLS-00103: Encountered the symbol "END" when expecting one of the following: select count(*) from test_20; SQL Error: ORA-06575: Package or function TEST_FUNCTION is in an invalid state复制
这当然意味着你也不能查询视图:
select count(*) from vw_test_20; SQL Error: ORA-04063: view "CHRIS.VW_TEST_20" has errors复制
这里真正的问题是函数。修复它,一切都很好:
create or replace function test_function (p_1 in number) return number deterministic is begin return 1; end; / show err No errors. select count(*) from test_20; COUNT(*) 0 select count(*) from vw_test_20; COUNT(*) 0复制
因此依赖关系
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
Oracle RAC 一键安装翻车?手把手教你如何排错!
Lucifer三思而后行
597次阅读
2025-04-15 17:24:06
【纯干货】Oracle 19C RU 19.27 发布,如何快速升级和安装?
Lucifer三思而后行
576次阅读
2025-04-18 14:18:38
XTTS跨版本迁移升级方案(11g to 19c RAC for Linux)
zwtian
491次阅读
2025-04-08 09:12:48
Oracle数据库一键巡检并生成HTML结果,免费脚本速来下载!
陈举超
474次阅读
2025-04-20 10:07:02
【ORACLE】记录一些ORACLE的merge into语句的BUG
DarkAthena
459次阅读
2025-04-22 00:20:37
【ORACLE】你以为的真的是你以为的么?--ORA-38104: Columns referenced in the ON Clause cannot be updated
DarkAthena
434次阅读
2025-04-22 00:13:51
Oracle 19c RAC更换IP实战,运维必看!
szrsu
434次阅读
2025-04-08 23:57:08
【活动】分享你的压箱底干货文档,三篇解锁进阶奖励!
墨天轮编辑部
419次阅读
2025-04-17 17:02:24
火焰图--分析复杂SQL执行计划的利器
听见风的声音
367次阅读
2025-04-17 09:30:30
3月“墨力原创作者计划”获奖名单公布
墨天轮编辑部
358次阅读
2025-04-15 14:48:05