【发布时间】:2015-02-20 10:07:18
【问题描述】:
我正在尝试构建一个正则表达式,它将识别括号内的参数并忽略 pl/sql cmets(单行 -- 和多行 /* */)
例如:
create or replace table_name ---sfjdslkfjslkfjslkfjdsfsdf
**(var1 in out number, var2 number)**
/* sdfls
sfdsd jfs
sfs f
sd f
sfsf */
AS
BEGIN
(var1 in out number, var2 number) 应该只匹配。它还应考虑以下情况:
- 没有 cmets(单行或多行)
- 参数前后只有单行 cmets
- 参数前后只有多行cmets
- 没有参数
假设:
- 参数始终用括号 () 括起来
- 过程有时可以没有参数,但在 AS BEGIN 子句之前有 cmets(单行或多行 cmets)
- 程序以
create or replace table_name开头 - 我们只想阅读直到
AS BEGIN子句
换句话说,我需要找到在任何 cmets(单行或多行)之外且位于 AS BEGIN 子句之前的第一个左括号 '(' 的索引。
更新:
我已经设法使用以下正则表达式匹配 cmets:
(?:\/\*(?:[\s\S]*?)\*\/)|(?:\-\-(?:.*)$)
例如这里它将匹配所有的 cmets:
create or replace table_name
-- sdlfksl kjs slkjslds js
/* lsdjfdkj
s fskjfs
sf sf
sdf;;''
sfs fs
*/
(hello number, var2 number)
--sdflksf
/*sl --sdflks s kdjfls())({fsfs */
AS
BEGIN
我现在可以在 Java 中执行此操作,以识别任何匹配组之外的第一个左括号。但是,如果我可以忽略匹配组并仅匹配括号中的一个参数,那会更容易。
编辑
这不是要求使用 pl/sql 或 sqlplus 或其他什么的解决方案。我有一些 pl/sql 过程存储在需要修改和添加新参数的文件中。我正在使用 Java 来做到这一点,并在 Java 中使用循环和正则表达式的组合。
【问题讨论】:
-
查询
USER_ARGUMENTS查看。看我的回答。 -
为什么要在 PL/SQL 中这样做?在 PL/SQL 中实现解析器是 PITA。我也怀疑它可以使用正则表达式来完成,调用约定不是那么简单。恐怕你需要一个真正的解析器。
-
检查这个项目:github.com/porcelli/plsql-parser。并使用“仅”生成的词法分析器。然后迭代从此词法分析器返回的标记。
-
有关可能的过程参数声明,请参阅 Oracle SQL 参考:docs.oracle.com/database/121/LNPLS/…
-
在问题中看到您的编辑。通过你的方法添加新参数后,PL/SQL程序编译成功的保证是什么?
标签: regex oracle plsql arguments