2015-06-28 5 views
5

Il mio problema è che ho un runner SQL personalizzato che colpisce un Oracle, in sola lettura db.Ottieni la definizione di Oracle View con controllo limitato

Voglio ottenere la definizione di una vista.

select TEXT 
FROM all_VIEWS 
and VIEW_NAME = '<view_name>'; 

Questo mi restituisce un testo limitato. Un massimo di tanti personaggi, forse 100. Tutte le visualizzazioni sono più lunghe di così.

Il file di aiuto che ho trovato mostrava l'aggiunta del "set long 10000" prima per acquisire l'intero campo, immagino.

SQL> set long 10000 

SQL> select TEXT 
    2 FROM all_VIEWS 
    3 and VIEW_NAME = '<view_name>'; 

Non ho accesso a colpire il set long 10000 da quando sto correndo attraverso un'altra finestra. C'è un altro modo per ottenere la definizione completa con la mia capacità limitata?

+0

Sembra esserci un errore di sintassi nella domanda. Non esiste una clausola WHERE, ma è stata utilizzata la parola chiave AND. La query corretta deve essere selezionare TEXT FROM all_VIEWS WHERE VIEW_NAME = ''; – Mandar

risposta

5

Il tuo problema è la colonna LONG contenente la definizione della vista.

È possibile utilizzare il pacchetto DBMS_METADATA per ottenere il testo vista come CLOB

select DBMS_METADATA.GET_DDL ('VIEW','view_name','owner') from dual; 
0

Utilizzando @ suggerimento di Marmite di DBMS_METADATA.GET_DDL, e supponendo che lo strumento che si sta utilizzando solo consente di recuperare 100 caratteri alla volta, il seguente dovrebbe recuperare la vista completa:

SELECT view_name, LEVEL "Line No", 
DBMS_LOB.SUBSTR(view_clob, 100 ,1 + (LEVEL-1)*100) line_text FROM (
    SELECT view_name, owner, 
    DBMS_METADATA.GET_DDL('VIEW', view_name, owner) view_clob 
    FROM all_views WHERE view_name = '<view_name>' 
) CONNECT BY LEVEL <= CEIL(LENGTHB(view_clob)/100) ORDER BY LEVEL;