Python 正则表达式拆分 PL/SQL 指令

Posted

技术标签:

【中文标题】Python 正则表达式拆分 PL/SQL 指令【英文标题】:Python regex split PL/SQL instructions 【发布时间】:2013-02-15 10:42:18 【问题描述】:

我正在尝试拆分 PL/SQL 指令。我有以下模式:

splitter_re = '(DECLARE.+?END;)\n+|;\n+'

我有以下 PL/SQL 代码:

CREATE TABLE bk_temp1_kb AS
SELECT DISTINCT bk_c, bk_o, bk_r, bk_m
FROM www2013_02;


DECLARE
  time_val NUMBER;
BEGIN
  SELECT day INTO time_val
  FROM days
  WHERE day_desc = TO_CHAR(SYSDATE - 1);

  EXECUTE IMMEDIATE
  'DROP TABLE telep';

  EXECUTE IMMEDIATE
  'CREATE TABLE telep AS
  SELECT cc,
       dao,
       a,
       nam     
  FROM prodc
  WHERE timer = ' || time_val;
END;


DROP TABLE kart;

CREATE TABLE kart AS
SELECT b.dwp
FROM t_prod_new b
WHERE b.task = 'CARD';

split()的结果是:

['CREATE TABLE bk_temp1_kb AS\nSELECT DISTINCT bk_c, bk_o, bk_r, bk_m\nFROM www2
013_02', None, '', "DECLARE\n  time_val NUMBER;\nBEGIN\n  SELECT day INTO time_v
al\n  FROM days\n  WHERE day_desc = TO_CHAR(SYSDATE - 1);\n \n  EXECUTE IMMEDIAT
E\n  'DROP TABLE telep';\n \n  EXECUTE IMMEDIATE\n  'CREATE TABLE telep AS\n  SE
LECT cc,\n       dao,\n       a,\n       nam     \n  FROM prodc\n  WHERE timer =
 ' || time_val;\nEND;", 'DROP TABLE kart', None, "CREATE TABLE kart AS\nSELECT b
.dwp\nFROM t_prod_new b\nWHERE b.task = 'CARD';"]

它非常好,但我没有元素。模式有什么问题?

【问题讨论】:

您的正则表达式不起作用。如果我有一个名为“send”的表会怎样? 我要问,为什么?不要在 PL/SQL 中创建表,这比其他任何事情都表明数据库设计不好。它还在会话中进行隐式提交,这可能会使事情变得很混乱。其次,如果您尝试使用 Python 解析它,那么必须有充分的理由这样做。不这样做会更容易。 这只是一个例子。我还有很多其他的,包括普通的 SQL 指令和 DECLARE ... END;这是我的主要问题,而不是 SQL 代码本身。 SQL 不是常规语言。试图用正则表达式解析它注定要失败。 sqlparse 可能会起作用。 【参考方案1】:

您有 None 元素,因为您有由 () 创建的没有内容的组

'(x)|y' 
matches "x" with ("x", ...)
matches "y" with (None, ...)

因为第一个(x) 没有匹配项

改变

'(DECLARE.+?END;)\n+|;\n+'

'(?:DECLARE.+?END;)\n+|;\n+'

删除无。

(?:x)|y
is the same as
x|y 

括号不分组

【讨论】:

感谢您的回复,但是通过此修复,我失去了整个 DECLARE...END;表达。 '(?:DECLARE.+?END;)\n+'怎么样 您能给我一些建议吗?不知道怎么处理。 result = [x for x in result if x] 真正的问题是正如@Wooble 所说:这种语言不能被正则表达式解析。仅在大多数情况下。有时你可能不知道end 属于什么。

以上是关于Python 正则表达式拆分 PL/SQL 指令的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQL 正则表达式检查

正则表达式背后的 pl/sql 否定查看

在 oracle 中使用正则表达式查找 POBOX - PL/SQL

PL/SQL 中的正则表达式

pl/sql 正则表达式验证

PL/SQL 正则表达式不起作用