2012-07-20 40 views
5

Teradata ma użyteczny widok o nazwie dbc.tables, którego można użyć do zapytania obiektów. Używałem tego do sprawdzania RequestText w widokach z powodzeniem, ale procedury wydają się być skompilowane nieco inaczej.Czy mogę zapytać o tekst procedury RequestText w Teradata?

Kiedy patrzę na RequestText procedury (TableKind P), wszystko mam coś takiego:

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

Jest to odniesienie do rzeczywistego RequestText, który jest przechowywany w innym miejscu? Jak się do niego dostać?

Chcę faktycznie zapytać go za pomocą SQL, a nie zrzucić go do pliku tekstowego.

Powód jest taki, że muszę wykonać polecenie LIKE przeciwko niemu, aby wyszukać odniesienia do konkretnej nazwy tabeli. Niewłaściwe byłoby zrzucenie go do pliku tekstowego, a następnie ręczne przeszukanie pliku tekstowego.

Odpowiedz

7

Procedury składowane są kompilowane jako obiekt wykonywalny. W systemie Windows są one kompilowane do bibliotek DLL. W systemie Unix są one kompilowane w Shared Objects. Obiekty te są przechowywane w własnej bazie danych.

Oto podobne pytanie na temat Teradata Forums.

Przedstawiamy oryginału Kodeks postępowania

Ponieważ są one opracowywane, oryginalny kod nie będzie się widoczny w gdzieś jak DBC.Tables, więc niestety jak już stwierdzono, poniższa kwerenda przeciwko DBC.Tables nie będzie praca.

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

Zamiast tego, jedynym sposobem, aby pobrać zapisanego kodu procedury jest wykonanie następujących czynności:

SHOW PROCEDURE mydb.procedurename; 

Jak znaleźć procedur zawierających określony

Co chciałbym zrobić, to użyj VBScript lub VBA, aby połączyć się z Teradata poprzez ODBC. Chciałbym najpierw uruchomić to, aby uzyskać listę wszystkich procedur przechowywanych:

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

Potem będzie pętli każdego wyniku i uruchom następujące, zapisując wynik do zmiennej w VBA.

SHOW PROCEDURE <dbname>.<tablename>; 

bym wtedy użyć coś jak funkcja InStr() znaleźć, gdy kod zawiera pewien ciąg tekstu.

To jest o wiele bardziej zaangażowane, niż sądzę, że początkowo miałeś nadzieję.

Alternatywny Opcja

Opcją alternatywną jest wykorzystanie tabel w bazie danych DBQL, jeśli są one dostępne.

Ta baza danych zawiera tabele "rejestrowania", w których można zobaczyć historię wszystkich instrukcji SQL wykonywanych w systemie.

W ten sposób można uruchomić typ zapytania, który początkowo miał nadzieję na użycie warunku LIKE.

+2

skończyło się na napisanie narzędzia .NET, który robi to, co zaproponował i działa bardzo dobrze. Jedynym zastrzeżeniem, z którego mogą skorzystać inni, jest to, że należy przeczytać 'show procedure mydb.mysproc' na TdDatareader, a następnie zrobić' while (read.Read()) ', ponieważ każda linia w sproc jest oddzielnym wierszem. Po prostu zwrócenie skalara zwróci tylko pierwszą linię sproc. Dzieki za sugestie. – oscilatingcretin

0

Sztuczka SHOW PROCEDURE może nie zawsze być stosowana teraz w Teradata 14.1 do czasu testowania Teradata 15; nie jest to jednak pewne na najnowszą wersję. Dzieje się tak, ponieważ nazwy obiektów (tj. Tabele, widoki, procedura składowana itp.) Mogą mieć teraz długość znaku większą niż 30 znaków. Jeśli nazwa obiektu jest większa, widok DBC.Tables nie będzie w stanie pobrać rekordu dla TABLENAME przefiltrowanego przy użyciu warunku równości. Może być konieczne użycie kwalifikatora słowa kluczowego "LIKE". DBC.Tables ma funkcję SUBSTRING w celu ograniczenia nazwy do 30. Nadal można uzyskać pełną nazwę obiektu/tabeli przez DBC.TVM; ale tylko wtedy, gdy masz uprawnienie dostępu SELECT, które zwykle nie jest PRZYJMOWANE inne niż DBA.

poważaniem, Win

+0

Było zalecenie, aby użyć nowego zestawu widoków systemowych opartych na Unicode od TD12, 'dbc.TablesV' zamiast' dbc.Tables'. – dnoeth

+0

Dzięki, dnoeth, za udostępnienie tej informacji. –