Фильтр "текст" столбец на все_вью - PullRequest
11 голосов
/ 10 февраля 2012

Можно ли как-то отфильтровать столбец text в таблице 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)   

Ответы [ 5 ]

17 голосов
/ 10 февраля 2012

К сожалению, вы не можете конвертировать в clob на лету с помощью оператора select. Функция to_lob работает с операторами INSERT, но это будет означать, что вам нужно будет настроить отдельную таблицу и выполнить вставку в использование to_lob.

Вы можете выполнять преобразования назначений в varchar в pl / sql, и большую часть времени вы обнаружите, что text_length в all_views <32767, так что это будет охватывать «большинство» случаев, хотя это не очень удобно, если просто выбрать : </p>

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'.

Надеюсь, это поможет.

9 голосов
/ 10 февраля 2012

К сожалению, вы не можете легко манипулировать столбцами LONG в SQL.

Для данной проблемы в качестве обходного пути вы можете использовать *_DEPENDENCIES представления, чтобы найти все представления, зависящие отстол:

SELECT * 
  FROM all_dependencies 
 WHERE type = 'VIEW' 
   AND referenced_owner = 'TABLE_OWNER'
   AND referenced_name = 'YOUR_TABLE';
0 голосов
/ 29 октября 2018

Если вы используете pre 12c (text_vc существует только в 12.1+), и вы можете в достаточной мере сканировать свои просмотры по первым 4000 символам, следующий запрос будет работать.

with parsed_all_views as (
  select owner, view_name, text_length, TEXT as VARCHAR_TEXT
  from xmltable( '/ROWSET/ROW' passing dbms_xmlgen.getXMLType(
    'select TEXT, owner, view_name, text_length  '
    ||' from all_views WHERE owner = ''**YOUR_SCHEMA_NAME**'' '
  ) columns  TEXT varchar2(4000), owner varchar2(32), view_name  
  varchar2(32), text_length  varchar2(32)) 
)

select * from parsed_all_views where upper(VARCHAR_TEXT) like '%DISTINCT%'
0 голосов
/ 20 июля 2018

Поиск по TEXT_VC вместо TEXT

SELECT * 
 FROM ALL_VIEWS 
 WHERE UPPER(TEXT_VC) LIKE '%FOO%';
0 голосов
/ 24 апреля 2017
  1. В Oracle Developer запустите и экспортируйте в Excel

    ВЫБРАТЬ view_name, текст из всех_обзоров, где owner = 'MyDb'

Oracle Developer

  1. Импорт файла Excel в SQL Server (в таблицу [ALL_VIEWS])

    SELECT [VIEW_NAME], [TEXT] ОТ [MyDb]. [Dbo]. [ALL_VIEWS] ГДЕ [ТЕКСТ] НРАВИТСЯ '% FOO%'

...