2012-07-20 8 views
5

Teradata ha una vista utile denominata dbc.tables che è possibile utilizzare per eseguire query sugli oggetti. Ho usato questo per interrogare lo RequestText nelle viste con successo, ma le procedure sembrano essere compilate in modo leggermente diverso.Posso interrogare il RequestText di una procedura in Teradata?

Quando guardo il RequestText di una procedura (TableKind P), tutto quello che ottiene è qualcosa di simile:

ALTER PROCEDURE '468137'xn.'546321987654321345646556213165468654654654'xn COMPILE /* mydb.procedurename */; 

È questo un riferimento alla RequestText effettivo che è memorizzato altrove? Come ci arrivo?

Voglio realmente interrogarlo con SQL, non scaricarlo in un file di testo.

Il motivo è perché ho bisogno di eseguire un'istruzione LIKE contro di esso per cercare riferimenti a un nome di tabella specifico. Sarebbe inevitabile doverlo scaricare in un file di testo e quindi cercare manualmente il file di testo.

risposta

7

Le stored procedure sono compilate per essere un oggetto eseguibile. Su Windows, sono compilati in DLL. Su Unix, sono compilati in oggetti condivisi. Questi oggetti sono memorizzati nel database proprietario.

Ecco una domanda simile posta sullo Teradata Forums.

Visualizzazione del codice di procedura originale

Dato che sono compilati, il codice originale non è vero visibile in un posto come DBC.Tables, così purtroppo come hai trovato, la query seguente DBC.Tables non lo farà lavoro.

SELECT * 
FROM DBC.Tables 
WHERE TableKind = 'P' 
AND RequestText LIKE '%abc%'; 

Invece, l'unico modo per recuperare il codice di stored procedure è quello di eseguire il seguente:

SHOW PROCEDURE mydb.procedurename; 

Come trovare procedure che contiene un specificato

Quello che vorrei fare è quello di utilizzare VBScript o VBA per connettersi a Teradata tramite ODBC. Desidero in primo luogo eseguire questo per ottenere un elenco di tutte le stored procedure:

SELECT * 
FROM DBC.Tables 
WHERE TableKind = 'P'; 

Poi, vorrei ciclo attraverso ogni risultato ed eseguire il seguente, salvando il risultato in una variabile in VBA.

SHOW PROCEDURE <dbname>.<tablename>; 

Vorrei quindi usare qualcosa come la funzione InStr() di trovare quando il codice contiene una certa stringa di testo.

Concesso, questo è molto più coinvolto che penso che inizialmente stavate sperando.

opzione alternativa

Un'opzione alternativa è quella di utilizzare tabelle del database DBQL, se sono a vostra disposizione.

Questo database contiene alcune tabelle di "registrazione" in cui è possibile visualizzare una cronologia di tutte le istruzioni SQL eseguite sul sistema.

In questo modo, è possibile eseguire il tipo di query che si desiderava inizialmente utilizzando una condizione LIKE.

+2

ho finito per scrivere un programma di utilità .NET che fa quello che hai suggerito e funziona molto bene. Un avvertimento che altri potrebbero trarre beneficio è che è necessario leggere 'show procedure mydb.mysproc' in un TdDatareader e quindi eseguire' while (reader.Read()) 'poiché ogni riga nella sproc è una riga separata. Il semplice ritorno di uno scalare restituirà solo la prima riga della sproc. Grazie per il suggerimento. – oscilatingcretin

0

Il trucco SHOW PROCEDURE potrebbe non essere sempre applicabile ora per Teradata 14.1 fino a Teradata 15 come testato; non sono sicuro per la versione più recente. Questo perché i nomi degli oggetti (ad es. Tabelle, viste, stored procedure, ecc.) Ora possono avere una lunghezza di carattere superiore a 30 caratteri. Se il nome dell'oggetto è superiore a quello, la vista DBC.Tables non sarà in grado di recuperare il record per il TABLENAME filtrato utilizzando una condizione di uguaglianza. Potrebbe invece essere necessario utilizzare un qualificatore di parole chiave "LIKE". DBC.Tables ha una funzione SUBSTRING nella vista per limitare ancora il nome a 30. È comunque possibile ottenere il nome completo dell'oggetto/tabella tramite DBC.TVM; ma solo se si dispone di un privilegio di accesso SELECT che di solito non è GRANTATO diverso dal DBA.

Con i migliori saluti, Win

+0

Si consigliava di utilizzare il nuovo set di viste di sistema basato su Unicode dal TD12, 'dbc.TablesV' invece di' dbc.Tables'. – dnoeth

+0

Grazie, denomina, per condividere queste informazioni. –