15

オラクルのall_viewsテーブルのテキスト列をフィルタリングする方法はありますか?

例えば:

SELECT * 
  FROM ALL_VIEWS 
  WHERE UPPER(TEXT) LIKE '%FOO%';

例外:

ORA-00932: inconsistent datatypes: expected NUMBER got LONG
00932. 00000 -  "inconsistent datatypes: expected %s got %s"

編集:

DESC ALL_VIEWS
Name             Null     Type           
---------------- -------- -------------- 
OWNER            NOT NULL VARCHAR2(30)   
VIEW_NAME        NOT NULL VARCHAR2(30)   
TEXT_LENGTH               NUMBER         
TEXT                      LONG()         
TYPE_TEXT_LENGTH          NUMBER         
TYPE_TEXT                 VARCHAR2(4000) 
OID_TEXT_LENGTH           NUMBER         
OID_TEXT                  VARCHAR2(4000) 
VIEW_TYPE_OWNER           VARCHAR2(30)   
VIEW_TYPE                 VARCHAR2(30)   
SUPERVIEW_NAME            VARCHAR2(30)   
4

5 に答える 5

20

残念ながら、select ステートメントを介してオンザフライで clob に変換することはできません。to_lob 関数は INSERT ステートメントで機能しますが、それは別のテーブルをセットアップし、to_lob を使用して挿入を行う必要があることを意味します。

pl/sql で varchar への割り当て変換を行うことができます。ほとんどの場合、all_views の text_length は < 32767 であることがわかります。したがって、これは「ほとんどの」ケースをカバーしますが、選択するだけではうまくいきません。

declare

  l_search varchar2(1000) := 'union';
  l_char varchar2(32767);

begin
  for rec in (select * from all_views where text_length < 32767)
  loop
    l_char := rec.text;
    if (instr(l_char, l_search) > 0) then
      dbms_output.put_line('Match found for ' || rec.owner || '.' || rec.view_name);
    end if;
  end loop;

end;

ここでは、テキスト フィールドで文字列 'union' を検索しています。

それが役立つことを願っています。

于 2012-02-10T15:26:40.553 に答える
12

残念ながら、SQL で LONG 列を簡単に操作することはできません。

現在の問題の回避策として、ビューを使用し*_DEPENDENCIESて、テーブルに依存するすべてのビューを見つけることができます。

SELECT * 
  FROM all_dependencies 
 WHERE type = 'VIEW' 
   AND referenced_owner = 'TABLE_OWNER'
   AND referenced_name = 'YOUR_TABLE';
于 2012-02-10T14:28:34.553 に答える