在 pl/sql 正文包文件中获取函数和描述注释

Posted

技术标签:

【中文标题】在 pl/sql 正文包文件中获取函数和描述注释【英文标题】:Get function and description comment in a pl/sql body package file 【发布时间】:2019-04-08 13:36:29 【问题描述】:

我需要在 Notepad++ 中从包体文件中提取对象名称(函数、过程等)和对象描述。

我知道这可以通过正则表达式实现,但有时 cmets 复合超过 3 行。

CREATE OR REPLACE PACKAGE BODY pac_example AS

/* *********************************************
*  Function f1
*  Description: Search for a data in table1
*  (another comments)
*  ******************************************* */
FUNCTION f1 RETURN NUMBER IS
BEGIN
SELECT * FROM table1;
RETURN 1;
END f1;



/* *********************************************
*  Function f2
*  Description: Search for a data in table2
*  (another comments)
*  (another comments)
*  (another comments)
*  ******************************************* */
FUNCTION f2 RETURN NUMBER IS
BEGIN
  SELECT * FROM table2;
RETURN 1;
END f2;

END pac_example;

在这种情况下,我只需要替换文档中的所有内容并获得如下内容:

/* *********************************************
*  Function f1
*  Description: Search for a data in table1
*  (another comments)
*  ******************************************* */
FUNCTION f1 RETURN NUMBER IS
/* *********************************************
*  Function f2
*  Description: Search for a data in table2
*  (another comments)
*  (another comments)
*  (another comments)
*  ******************************************* */
FUNCTION f2 RETURN NUMBER IS

或者(最好的情况)这个:

FUNCTION f1 Search for a data in table1
FUNCTION f2 Search for a data in table2

【问题讨论】:

所以您不需要过程签名的详细信息(参数、返回类型)? 【参考方案1】: Ctrl+H 查找内容:(?:\A.*?|\G)\*\h+((?:Function|Procedure)\h*\w+).*?Description:\h*([^\r\n]+\R)(?:(?!\*\h+(?:Function|Procedure)).)+ 替换为:$1 $2 取消选中匹配大小写 检查环绕 检查正则表达式 检查. matches newline 全部替换

说明:

(?:                         # non capture group
    \A                      # beginning of file
    .*?                     # 0 or more any character
  |                         # OR
    \G                      # restart from last match position
)                           # end group
\*                          # an asterisk
\h+                         # 1 or more horizontal spaces
(                           # start group 1
    (?:Function|Procedure)  # literally Function OR Procedure
    \h+                     # 1 or more horizontal spaces
    \w+                     # 1 or more word character
)                           # end group 1
.*?                         # 1 or more any character, not greedy
Description:\h*             # literally Description followed by horizontal spaces
(                           # start group 2
    [^\r\n]+                # 1 or more any character not linebreak
    \R                      # any kind of linebreak
)                           # end group 2
(?:                         # Tempered greedy token
    (?!                     # negative lookahead
        \*                  # an asterisk
        \h+                 # 1 or more horizontal spaces
        (?:Function|Procedure)  # literally Function OR Procedure
    )                       # end lookahead
    .                       # any character
)+                          # end group, appears 1 or more times

替换:

$1          # content of group 1, function or procedure
$2          # content of group 2, description

屏幕截图:

【讨论】:

【参考方案2】:

要在 Notepad++ 中执行此操作,我会:

    ^([ \t\*]+)(FUNCTION|PROCEDURE)([ \t]+)([A-Z_0-9]+) 的正则表达式。在标记选项卡上选择,然后单击全部标记。 现在搜索^([ \t\*]+)Description: (.+)。再次点击全部标记。 菜单 搜索 > 书签 > 复制书签行 粘贴到新文档中。

这将为您提供最佳方案的基础。使用正则表达式替换从那里整理行是一件简单的事情。

注意事项:

第一步从 cmets 中选择过程名称,即* Function f2。您关闭了大写,但至少它的顺序正确。否则,您需要为每一行切换过程名称和描述。 如果您需要签名详细信息(参数等),这并不好。然后您需要搜索^([ \t]*)(FUNCTION|PROCEDURE)([ \t]+)([A-Z_0-9]+) 并重新排序描述 我已经包含了制表符和空格模式,因为不清楚您的源代码是如何缩进的

【讨论】:

以上是关于在 pl/sql 正文包文件中获取函数和描述注释的主要内容,如果未能解决你的问题,请参考以下文章

包括编写在不同文件中的过程以打包在 PL/SQL 中

PL/SQL:子程序或游标“P_STATUS_UPDATE”在包规范中声明,并且必须在包主体中定义

PL/SQL,如何将包的通用代码行放在共享包中

PL/SQL 包编译错误:PLS-00323

通过 TTS 导出 PL/SQL 包

使用 PL/SQL 函数体返回 SQL 查询