2012-07-20 21 views
5

Teradata, nesneleri sorgulamak için kullanabileceğiniz dbc.tables adlı kullanışlı bir görünüme sahiptir. Bunu başarı ile RequestText sorgulamak için kullandım, ancak yordamları biraz farklı derlenmiş gibi görünüyor.Teradata'da bir prosedürün RequestTextini sorgulayabilir miyim?

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

bu yerde saklanan gerçek RequestText bir referans mı:

Ben bir prosedür (TableKind P) RequestText bakın, ben olsun hepsi böyle bir şeydir? Buna nasıl ulaşırım?

Ben gerçekten SQL ile sorgulamak istiyorum, bir metin dosyasına dökümü.

Bunun nedeni, belirli bir tablo adına yapılan başvuruları aramak için buna karşı bir LIKE deyimi çalıştırmam gerektiğinden kaynaklanır. Bir metin dosyasına dökmek ve sonra metin dosyasını elle aramak zorunda kalmamaya devam edecektir.

cevap

7

Saklanan Yordamlar, yürütülebilir bir nesne olarak derlenmiştir. Windows'da, DLL'lere derlenmiştir. Unix'te, Paylaşılan Nesneler olarak derlenmiştir. Bu nesneler sahip veritabanında saklanır.

İşte benzer bir soru Teradata Forums sordu. Onlar derlenmiş konum beri Orijinal Prosedür Kod

görüntüleniyor

yere gibi DBC.Tables yılında will biz görünmez orijinal kod, bu yüzden ne yazık ki buldum olarak, DBC.Tables karşı aşağıdaki sorgu olmaz iş.

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

Bunun yerine, saklı yordam kodunu almak için tek yol şu yürütülecek olan: bir Ne yapacağını için

Belirtilen İçeren Prosedürler Bulma

SHOW PROCEDURE mydb.procedurename; 

Teradata'ya ODBC üzerinden bağlanmak için VBScript veya VBA kullanın. VBA sonucu bir değişkene tasarrufu, ben her sonucu üzerinden döngü olur, Sonra

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

ve aşağıdakileri çalıştırın: Ben her şeyden önce procedure bir listesini almak için bu aday olacağını.

SHOW PROCEDURE <dbname>.<tablename>; 

Sonra kod metnin belli bir dize içerdiğinde bulmak için InStr() fonksiyonu gibi bir şey kullanmak.

Verilen bir şey, başlangıçta düşündüğünüzü düşündüğüm daha çok ilgili.

Alternatif Seçenek

alternatif bir seçenek, sizin için kullanılabilir iseniz, DBQL veritabanındaki tabloları yararlanmaktır.

Bu veritabanı, sistem üzerinde yürütülen tüm SQL deyimlerinin geçmişini görebileceğiniz bazı "günlük" tabloları içerir.

Bu şekilde, başlangıçta bir LIKE koşulunu kullanmayı umduğunuz sorgu türünü çalıştırabilirsiniz.

+2

Sana önerdi ve çok iyi olanı yapan bir .NET programı yazma sona erdi. Başkalarının yarar sağlayabileceği bir uyarı, 'tydData.cysproc' prosedürünü bir TdDatareader 'a göstermeli ve sonra da' (read.Read()) 'fonksiyonunu okumalısınız, çünkü sproc'deki her satır ayrı bir satırdır. Sadece bir skaler döndürmek yalnızca sprocin ilk satırını döndürür. Önerin için teşekkürler. – oscilatingcretin

0

SHOW PROCEDURE hilesi, Teradata 14.1 için test edilen Teradata 15'e kadar her zaman uygulanabilir olmayabilir; En son sürüm için emin değilim. Bunun nedeni, nesne adlarının (yani, Tablolar, Görünümler, Saklı Yordam, vb.) 30 karakterden daha uzun bir karakter uzunluğuna sahip olabilmesidir. Nesne adı bundan daha fazlaysa, DBC.Table görünümü, bir eşitlik koşulu kullanılarak filtrelenen TABLENAME için kaydı alamayacaktır. Bunun yerine bir "LIKE" anahtar kelime niteleyici kullanılması gerekebilir. DBC.Tables, görünümde hala adı 30 ile sınırlamak için bir SUBSTRING işlevine sahiptir. DBC.TVM aracılığıyla tam nesne/tablo adını alabilirsiniz; ancak sadece DBA dışındaki GRANT olmayan bir SELECT erişim ayrıcalığınız varsa.

Saygılarımızla, Win

+0

Yeni Unicode tabanlı sistem görünümleri kümesini TD12, "dbc.TablesV" yerine "dbc.Tables" yerine kullanmanız önerilir. – dnoeth

+0

Teşekkürler, bu bilgileri paylaştığınız için dnoeth. –

İlgili konular