MySQL與存儲過程的相關(guān)資料
MySQL是“世界上最為流行的開放性數(shù)據(jù)庫”,至少對于MySQL Web站點會這樣。但無論MySQL如此流行,很多公司都對MySQL的使用抱有抵觸情緒。這種現(xiàn)象來自幾個原因,其中有些人錯誤地認(rèn)為開放性源代碼只不過相當(dāng)于小孩子的積木游戲,而另一些人認(rèn)為任何免費的東西都不會是好東西。也許這些想法都是誤解,然而有一種抱怨卻是合理的,即與其它對應(yīng)的產(chǎn)品不一樣,比如Oracle或者 DB2,MySQL不能夠支持存儲過程(stored procedures)。
最新的MySQL 5.0能夠支持存儲過程。如果你對存儲過程還沒有熟悉,那么你可以認(rèn)為它們只是存儲在數(shù)據(jù)庫服務(wù)器端的SQL命令和程序邏輯的集合。這些存儲過程可以被應(yīng)用程序調(diào)用,使得不同技術(shù)水平的開發(fā)人員能夠建立自己的SQL。
優(yōu)點 存儲過程能夠允許絕大部分的數(shù)據(jù)庫訪問邏輯與程序邏輯分離開來。使用存儲過程的其中一個間接的優(yōu)點是,程序的代碼變得更加小巧和容易理解。存儲過程的另一優(yōu)點是,SQL可以被預(yù)先編譯,由此提高了程序的速度。因為存儲過程包含程序邏輯,可以在數(shù)據(jù)庫服務(wù)器端更多地執(zhí)行更多的處理。同樣,當(dāng)執(zhí)行一個n-tier程序時,存儲過程被用于將數(shù)據(jù)層與服務(wù)層分離開來。
安全性也是存儲過程的另一優(yōu)點。當(dāng)不能直接訪問表格時,程序可以將執(zhí)行優(yōu)先級別分配給存儲過程。不幸的是,在這時候,MySQL不支持“授予執(zhí)行(GRANT EXECUTE)”。這就意味著除非程序具有訪問表格的權(quán)限,否則調(diào)用訪問相同表格的一個存儲過程也是不行的。使用這一特性有點像在做一個很有趣的賭博。
標(biāo)準(zhǔn) 與Oracle或者微軟的相關(guān)數(shù)據(jù)庫不一樣,MySQL和IBM的DB2能夠遵循存儲程序的SQL:2003語法。在理論上這意味著,如果數(shù)據(jù)庫結(jié)構(gòu)相同,存儲程序可以在不同數(shù)據(jù)庫中使用。
可支持的SQL聲明 雖然MySQL不能支持存儲程序,但它卻可以完成很多任務(wù),如表A所示。除此之外,MySQL的stored procedure documentation(存儲過程文檔)描述了可用于Oracle的PL/SQL和SQL Server的 T-SQL的很多兼容特性。我對存儲過程支持的印象是,它執(zhí)行比較緩慢,目的是避免任何影響大型軟件開發(fā)工程的步驟。
表A
MySQL 5.0支持存儲過程語句。
重要的是,請記住當(dāng)前的MySQL對存儲過程的支持沒有Oracle,SQL Server或者DB2的成熟。同樣記住,具有少量的特性但卻操作良好,這比具有大量特性但卻錯誤百出的強(qiáng)得多,這一點更加重要。我知道這是一個比較奇怪的概念,但社區(qū)里的很多人有時候卻被其它一些概念所迷惑。