osc*_*tin 5 sql stored-procedures teradata
Teradata有一个有用的视图dbc.tables,可用于查询对象.我用它来查看RequestText视图中的成功,但程序似乎编译有点不同.
当我查看RequestText一个过程(TableKind P)时,我得到的是这样的:
ALTER PROCEDURE '468137'xn.'546321987654321345646556213165468654654654'xn COMPILE /* mydb.procedurename */;
Run Code Online (Sandbox Code Playgroud)
这是对存储在别处的实际RequestText的引用吗?我怎么做到的?
我想实际用SQL查询它,而不是将其转储到文本文件中.
原因是因为我需要对它运行LIKE语句来搜索对特定表名的引用.将它转储到文本文件然后手动搜索文本文件是不方便的.
存储过程被编译为可执行对象.在Windows上,它们被编译成DLL.在Unix上,它们被编译为共享对象.这些对象存储在拥有的数据库中.
这是Teradata论坛上提出的类似问题.
查看原始过程代码
由于它们是经过编译的,原始代码不会在某个地方看到DBC.Tables,所以不幸的是,您发现,以下查询DBC.Tables将无效.
SELECT *
FROM DBC.Tables
WHERE TableKind = 'P'
AND RequestText LIKE '%abc%';
Run Code Online (Sandbox Code Playgroud)
相反,检索存储过程代码的唯一方法是执行以下操作:
SHOW PROCEDURE mydb.procedurename;
Run Code Online (Sandbox Code Playgroud)
如何查找包含特定字符串的存储过程
我要做的是使用VBScript或VBA通过ODBC连接到Teradata.我首先运行它来获取所有存储过程的列表:
SELECT *
FROM DBC.Tables
WHERE TableKind = 'P';
Run Code Online (Sandbox Code Playgroud)
然后,我将遍历每个结果并运行以下内容,将结果保存到VBA中的变量.
SHOW PROCEDURE <dbname>.<tablename>;
Run Code Online (Sandbox Code Playgroud)
然后我会使用类似InStr()函数的东西来查找代码何时包含某个文本字符串.
当然,这是我认为你最初希望的更多参与.
替代选项
另一种选择是利用DBQL数据库中的表(如果它们可用).
此数据库包含一些"日志记录"表,您可以在其中查看系统上执行的所有SQL语句的历史记录.
这样,您可以运行最初希望使用LIKE条件的查询类型.