5

Teradata 有一个有用的视图dbc.tables,您可以使用它来查询对象。我已经使用它RequestText成功地查询了 in 视图,但过程的编译似乎有点不同。

当我查看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;

如何查找包含特定字符串的存储过程

我要做的是使用VBScriptVBA通过 ODBC 连接到 Teradata。我将首先运行它以获取所有存储过程的列表:

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

然后,我将遍历每个结果并运行以下命令,将结果保存到 VBA 中的变量中。

SHOW PROCEDURE <dbname>.<tablename>;

然后我会使用类似InStr()函数的东西来查找代码何时包含某个文本字符串。

当然,这比我认为您最初希望的要复杂得多。

备用选项

另一种选择是利用DBQL数据库中的表,如果它们可供您使用的话。

该数据库包含一些“日志”表,您可以在其中查看系统上执行的所有 SQL 语句的历史记录。

这样,您可以运行您最初希望使用LIKE条件的查询类型。

于 2012-07-21T00:03:12.677 回答
0

在经过测试的 Teradata 15 之前,SHOW PROCEDURE 技巧现在可能并不总是适用于 Teradata 14.1;虽然不确定最新版本。这是因为对象名称(即表、视图、存储过程等)现在的字符长度可以超过 30 个字符。如果对象名称不止于此,则 DBC.Tables 视图将无法检索使用相等条件过滤的 TABLENAME 的记录。可能需要使用“LIKE”关键字限定符。DBC.Tables 在视图中有一个 SUBSTRING 函数,仍然将名称限制为 30。您仍然可以通过 DBC.TVM 获取完整的对象/表名称;但前提是您具有 SELECT 访问权限,除了 DBA 之外通常不会授予该权限。

最好的问候,赢

于 2016-03-30T01:37:39.633 回答