5

dbc.tablesTeradata には、オブジェクトのクエリに使用できると呼ばれる便利なビューがあります。これを使用しRequestTextてビュー内を正常にクエリしましたが、プロシージャは少し異なる方法でコンパイルされているようです。

RequestTextプロシージャ (TableKind P)を見ると、次のようなものしか得られません。

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

これは、別の場所に保存されている実際の RequestText への参照ですか? どうすればそれにたどり着くことができますか?

テキストファイルにダンプするのではなく、実際にSQLでクエリを実行したい。

その理由は、特定のテーブル名への参照を検索するために、それに対して LIKE ステートメントを実行する必要があるためです。それをテキスト ファイルにダンプし、そのテキスト ファイルを手動で検索するのは不便です。

4

2 に答える 2

8

ストアド プロシージャは、実行可能なオブジェクトになるようにコンパイルされます。Windows では、これらは DLL にコンパイルされます。Unix では、共有オブジェクトにコンパイルされます。これらのオブジェクトは、所有データベース内に保管されます。

Teradata フォーラムで同様の質問が寄せられています。

元のプロシージャ コードの表示

それらはコンパイルされているため、元のコードは のような場所には表示されDBC.Tablesません。そのため、残念ながら、おわかりのように、次のクエリは機能しDBC.Tablesません。

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

代わりに、ストアド プロシージャ コードを取得する唯一の方法は、次を実行することです。

SHOW PROCEDURE mydb.procedurename;

特定の文字列を含むストアド プロシージャを検索する方法

私がすることは、ODBC 経由で Teradata を使用VBScriptまたはVBA接続することです。最初にこれを実行して、すべてのストアド プロシージャのリストを取得します。

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

次に、各結果をループして以下を実行し、結果を VBA の変数に保存します。

SHOW PROCEDURE <dbname>.<tablename>;

次に、 InStr()関数のようなものを使用して、コードに特定のテキスト文字列が含まれている場合を見つけます。

確かに、これはあなたが最初に望んでいたと思うよりもはるかに複雑です。

代替オプション

別のオプションは、データベース内のテーブルを利用するDBQLことです (利用可能な場合)。

このデータベースには、システムで実行されたすべての SQL ステートメントの履歴を確認できる「ログ」テーブルがいくつか含まれています。

そうすれば、最初に条件を使用することを望んでいたタイプのクエリを実行できますLIKE

于 2012-07-21T00:03:12.677 に答える