小编典典

如何在where子句中包含USER_VIEWS.TEXT列

sql

看来应该很容易找出来,但我一直在努力寻找任何答案。

我希望能够对Oracle中的USER_VIEWS表进行查询,以查找使用特定表的其他视图。

就像是:

SELECT view_name,来自user_views的文本,其中文本类似’%MY_TABLE%’

我收到错误消息:ORA-00932:数据类型不一致:预期的NUMBER个很长

TEXT的数据类型为LONG,在TOAD中显示为WIDEMEMO。

我尝试过将其转换为to_char并进行串联。我尝试仅使用TEXT数据创建另一个表,但得到ORA-00997:LONG数据类型的非法使用。

有任何想法吗?

谢谢!


阅读 255

收藏
2021-04-07

共1个答案

小编典典

从技术上讲,您可以使用该DBMS_METADATA程序包在CLOB中获取视图的DDL,然后解析该表以查找对表的引用。但是,比查看视图定义要容易得多的解决方案。

甲骨文保持在大约对象相关信息的USER_DEPENDENCIES视图(或ALL_DEPENDENCIESDBA_DEPENDENCIES根据您的权限级别,以及是否你想跟踪所有模式的依赖)。您最好使用这些视图

SQL> create table base_table (
  2    col1 number
  3  );

Table created.

SQL> create view my_view
  2  as
  3  select *
  4    from base_table;

View created.

SQL> select name, type
  2    from user_dependencies
  3   where referenced_name = 'BASE_TABLE';

NAME                           TYPE
------------------------------ ------------------
MY_VIEW                        VIEW

如果您使用的是USER_DEPENDENCIES视图,则还可以使用从属对象树来做更复杂的事情。如果我创建一个依赖于第一个视图的第二个视图,则可以很容易地看到两个视图最终都使用了基表。

SQL> create view my_view2
  2  as
  3  select *
  4    from my_view;

View created.

SQL> ed
Wrote file afiedt.buf

  1  select level, name, type
  2    from user_dependencies
  3  start with referenced_name = 'BASE_TABLE'
  4* connect by referenced_name = prior name
SQL> /

     LEVEL NAME                           TYPE
---------- ------------------------------ ------------------
         1 MY_VIEW                        VIEW
         2 MY_VIEW2                       VIEW
2021-04-07