2013-02-15 42 views
0

我想分裂PL/SQL入侵。Python正則表達式分裂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'; 

分割(的結果)是:

['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';"] 

而且這是相當不錯的,但我有無元素。模式有什麼問題?

+0

你的正則表達式是行不通的。如果我有一個名爲「send」的表,會發生什麼? – m0skit0 2013-02-15 10:45:39

+0

我不得不問,爲什麼?不要在PL/SQL中創建表,這是最糟糕的數據庫設計的標誌。它也會在會話中進行隱式提交,這會使事情變得非常混亂。其次,如果你試圖用Python解析這個,那麼必須有一個很好的理由來這樣做。不會更容易。 – Ben 2013-02-15 10:45:40

+0

這只是一個例子。我有很多其他的包括正常的SQL指令和DECLARE ... END;這是我的主要問題,而不是SQL代碼本身。 – connexion20000 2013-02-15 10:52:27

回答

0

你有沒有元素,因爲你必須()製造集團不具備內容

'(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 

括號不羣然後

+0

感謝您的回覆,但通過此修復,我失去了我的整個DECLARE ... END;表達。 – connexion20000 2013-02-15 10:59:03

+0

怎麼樣?(?:DECLARE。+?END;)\ n +'' – User 2013-02-15 11:02:11

+0

請給我一些建議嗎?我不知道如何處理它。 – connexion20000 2013-02-15 11:04:42