2

这似乎应该是一件容易弄清楚的事情,但我正在努力寻找任何答案。

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

就像是:

SELECT view_name, text FROM user_views WHERE text LIKE'%MY_TABLE%'

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

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

我试过铸造它,to_char 和连接。我尝试仅使用 TEXT 数据创建另一个表,但得到 ORA-00997:非法使用 LONG 数据类型。

有任何想法吗?

谢谢!

4

3 回答 3

6

从技术上讲,您可以使用该DBMS_METADATA包在 CLOB 中获取视图的 DDL,然后对其进行解析以查找对您的表的引用。但是有比查看视图定义更简单的解决方案。

USER_DEPENDENCIESOracle 在视图中维护有关对象依赖关系的信息(ALL_DEPENDENCIES或者DBA_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
于 2011-04-04T19:36:09.747 回答
2

您不能将 LIKE 与 LONG 列一起使用。不过,您可以编写自己的自定义函数来执行搜索 - 请参阅http://www.techonthenet.com/oracle/questions/long_value.php 您还可以创建一个表并将 LONG 列转换为 CLOB 列:

create table my_tab as
select to_lob(text) from user_views;

另见http://www.dba-oracle.com/oracle_news/2005_5_9_converting_long_lob_data_types.htm

于 2011-04-04T19:35:05.510 回答
0

如果您只想在 TOAD 的数据网格中看到它,那么您可以打开预览:

查看 => Toad 选项 => 数据网格 => 数据 => [x] 预览 CLOB 和 LONG 数据

我正在使用 TOAD 10.5.1.3

于 2011-10-05T09:58:25.420 回答