暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle user_dependency中的奇怪依赖: 视图依赖于未引用的函数

askTom 2018-02-20
731

问题描述

亲爱的团队,

我将尝试使用一个简单的测试用例来简化我们的场景:

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   
A                                       NO              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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论