2012-02-10 6 views
9

C'è un modo per filtrare la colonna del testo nella tabella all_views di Oracle?Filtra colonna "testo" su tutte_viste

Ad esempio:

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

Eccezione:

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

Edit:

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) 
+0

qual è il tipo di dati di campo 'Text' .. –

+0

cosa stai confrontando con i numeri quindi ?? vuoi trovare XX dal tavolo che ha 1 nel loro 'TEXT' ?? Per funzionare 'LIKE' campo deve essere varchar() tipo ... –

+0

potresti per favore esattamente fammi sapere cosa vuoi da questo tavolo ?? come voglio trovare il dipendente che 'SUPERVIEW_NAME' contiene' abc' –

risposta

14

Non si può convertire in un clob al volo tramite un'istruzione select purtroppo. La funzione to_lob funziona con le istruzioni INSERT, ma ciò significherebbe che avresti bisogno di impostare una tabella separata e inserire inserimenti nell'uso di to_lob.

È possibile eseguire conversioni di assegnazione su varchar in pl/sql, e il più delle volte si scopre che text_length in all_views è < 32767, quindi questo coprirà "la maggior parte" dei casi, anche se non è bello come solo selezionando:

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; 

Qui sto cercando il campo di testo per la stringa 'unione'.

Spero che questo aiuti.

9

Non è possibile manipolare le colonne LONG facilmente in SQL purtroppo.

per il vostro problema attuale, come soluzione alternativa, è possibile utilizzare i *_DEPENDENCIES vista per trovare tutte le viste collegate ad un tavolo:

SELECT * 
    FROM all_dependencies 
WHERE type = 'VIEW' 
    AND referenced_owner = 'TABLE_OWNER' 
    AND referenced_name = 'YOUR_TABLE'; 
0
  1. su Oracle Developer corsa e l'esportazione in Excel

    SELEZIONA nome_vista, testo da all_views dove

Oracle Developer

proprietario = 'MyDb'
  1. Importare il file Excel in SQL Server (nella tabella [ALL_VIEWS])

    SELECT [VIEW_NAME], [TESTO] FROM [MyDb]. [Dbo]. [ALL_VIEWS] WHERE [TESTO] LIKE '% FOO%'