【发布时间】: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 可能会起作用。