如何从PL / SQL包主体文件中提取表名?

时间:2019-04-06 05:31:34

标签: sql oracle plsql notepad++

我需要在pl / sql软件包文件中查询表名。

我知道regex在Notepad ++中为此提供了一个选项,但是我不知道要申请哪种正则表达式来获取表名(我知道必须是一些正则表达式才能使用关键字“ FROM”并获取下一个串后接空格,我认为是这样)。

对于下一个示例代码:

CREATE OR REPLACE PACKAGE BODY pac_example AS

FUNCTION f1 RETURN NUMBER IS
BEGIN
  SELECT * FROM table1;
  RETURN 1;
END f1;

FUNCTION f2 RETURN NUMBER IS
BEGIN
  SELECT * FROM table2;
  RETURN 1;
END f2;

END pac_example;

然后我希望全部替换并仅使用表名获取文件

table1
table2

5 个答案:

答案 0 :(得分:2)

如果您只对直接从PACKAGE BODY引用的表名感兴趣,则简单而直接的方法是查询all_dependenciesuser_dependencies

SELECT owner,
       referenced_name as table_name
FROM all_dependencies
WHERE type IN (
     'PACKAGE BODY'
) AND name IN (
     'PAC_EXAMPLE'
) AND referenced_type = 'TABLE';

DEMO

答案 1 :(得分:2)

据我所知,没有人能100%地做到这一点。您获得的最接近的是ALL / DBA_DEPENDENIES,但不会告诉您是否在SELECT,INSERT,UPDATE或DELETE中访问了表。

但是它将解析同义词。

缺点是它不包括动态SQL中引用的表。

如果您的数据库对表使用特定的命名约定(例如Tnnn_XXXXX),则可以执行以下操作:

SELECT DISTINCT c.text, c.name, c.type, t.table_name
FROM user_source c, user_tables t
WHERE UPPER(t.text) like '%' || t.name_name || '%' -- Maybe REGEXP_LIKE better
ORDER BY 2, 1, 4;

几十年前,我从事一个项目,他们想要一个CRUD程序矩阵(PLSQL,SQL,Oracle Forms / Reports,Pro C,Pro COBOL)以及每个表都可以访问。

当时唯一可用的解决方案是我编写一个解析器(用C语言编写),该解析器对代码库进行解析以查找SQL并对其进行处理。我什至报告了列和表格。 C程序分析了源代码,寻找关键字和字符来控制状态引擎。花费了几周的时间来完善和使用所有不同的代码库类型。

最后,它唯一不能做的就是动态查询,其中表名是根据变量值构建的。但是这里的解决方法是捕获tkprof文件并对其进行处理。

可悲的是,我没有这个的源代码了。

但是,如果我要再做一次,我将使用Lex / Yacc / Bison解析SQL并围绕这些工具构建系统。

通过快速搜索发现:

https://github.com/jgarzik/sqlfun

https://www.oreilly.com/library/view/flex-bison/9780596805418/ch04.html

一项不小的任务。

答案 2 :(得分:1)

  • Ctrl + H
  • 查找内容:(?:\A(?:(?!FROM).)*|\G)FROM\s+(\w+(?:\s*,\s*\w+)*)(?:(?!FROM).)*
  • 替换为:" #a空格和双引号
  • 检查环绕
  • 检查正则表达式
  • 检查. matches newline
  • 全部替换

说明:

(?:                 # start non capture group
  \A                # beginning of file
  (?:(?!FROM).)*    # Tempered greedy token, make sure we haven't FROM before
 |                  # OR
  \G                # restart from last match position
)                   # end group
FROM\s+             # literally FROM followed by 1 or more spaces
(                   # start group 1
  \w+               # 1 or more word characters (table name)
  (?:\s*,\s*\w+)*   # non capture group spaces comma spaces and 1 or more word characters, optional more tables
)                   # end group
(?:(?!FROM).)*      # Tempered greedy token, make sure we haven't FROM 

替换:

$1          # content of group 1, table name

屏幕截图:

enter image description here

答案 3 :(得分:0)

您可以使用以下正则表达式搜索表名。

正则表达式: FROM\s([^;]+)

替换: \n%\1%\n

enter image description here

然后按照 this answer 替换文件中的其他数据。

答案 4 :(得分:0)

前面提到的表格

df['new'] = df['meta'].str.get('total_expense').astype(int)
df = df.sort_values('new').drop('new', axis=1)

可以列出前面提到的依赖项,但是不会涵盖动态查询。如果在记事本中使用“ from”之类的关键字进行搜索,则仅覆盖“ From”语句之后的语句所引用的表。

可以考虑使用以下代码段进行全面分析:-逐行,逐字并分析表(指您提到的示例)

all_dependencies or user_dependencies 

以类似的方式可以根据需要更改查询以查找通过更改基本表而被贬低的视图或同义词-all_views,all_synonyms(根据需要)。

这就像最简单的方法-可能需要更多处理时间,取决于包装尺寸 如果需要,可以使用UNIX脚本完成相同的操作 如果需要直接从文件中检查,则可以使用UNIX脚本(也可以使用UTF_file操作)从文件中逐行获取,并使用sql会话进行上述验证并显示结果

但希望这将提供最准确的结果。