【问题标题】:How to include the column USER_VIEWS.TEXT in a where clause如何在 where 子句中包含 USER_VIEWS.TEXT 列
【发布时间】:2011-04-04 19:25:57
【问题描述】:

这似乎应该很容易弄清楚,但我正在努力寻找任何答案。

我希望能够针对 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 数据类型。

有什么想法吗?

谢谢!

【问题讨论】:

    标签: sql oracle oracle10g ora-00932 ora-00997


    【解决方案1】:

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

    Oracle 在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
    

    【讨论】:

    • 这玩意太糟糕了!不知道我过去如何不必使用它。这非常有效。感谢您花时间回答。我会对两者都投赞成票,因为它们都有效,但是,这是最好的答案。谢谢!
    【解决方案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

    【讨论】:

    • +1 这也很好用。 USER_DEPENDENCIES 无需额外的表等即可工作。不过谢谢!
    【解决方案3】:

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

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

    我正在使用 TOAD 10.5.1.3

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多