2010-01-21 114 views
5

我正在查看存儲過程。[MySQL]:存儲過程和選擇語句

根據this文章(第8頁)在MySQL網站的開發部分...

通常情況下,這是不正常的把 SELECT語句中存儲 過程,這是爲了說明。 我決定,有些程序應 簡單地從我們的表中選擇,這樣 當你調用過程將是 明顯,它的工作。

這是爲什麼?

正在使用存儲過程來簡化複雜的選擇語句而不是「最佳實踐」?

什麼是一些有利於使用存儲過程的特定情況?例?

回答

3

通常存儲過程旨在用於數據庫中的複雜處理。有關他們的好處的爭論正在激化。我從來沒有看到存儲過程中的SELECT是一件壞事,但我不希望每個必須寫入的SQL語句都進入存儲過程。它應該保留給涉及多個語句的處理,並且必須重複執行。

傑夫有關於他們的here咆哮。

爲了回答您的具體實例直接的問題,我發現,我避免了因便攜性問題的他們。我試圖完成我所有的處理應用程序。同時,我不必擔心應用程序中的網絡帶寬,因此每種情況都不相同。

+0

我的印象是,存儲過程的地方更便攜比應用驅動的查詢。就目前而言,您可以將查詢邏輯與應用程序分開。 – 2010-01-21 19:44:22

+0

但它們是用DBMS自己的語言編寫的。 SQL Server的存儲過程是用T-SQL和PL/SQL中的Oracle編寫的。不能將數據庫從一個平臺移動到下一個平臺。對於一些沒有什麼大不了,但對其他人來說...... – 2010-01-21 20:00:31

+0

絕對真實......從一個數據庫系統到下一個數據庫系統的可移植性是有風險的。我鏈接的pdf概述了一些特定於mysql的語法/特性(以及其他一些約定),爲了維護基於非mysql的數據庫的兼容性問題,您應該避免使用這些語法/特性。但是,如果我沒有弄錯,存儲過程便於從一種語言移植到另一種語言。 – 2010-01-21 20:32:31

3

的具體情況,其中,有利的是使用存儲程序/例程是,它可以提供錯誤在OO模式類似功能的參數檢查。它給加「封裝」

一個簡單的例子:

CREATE PROCEDURE select_table(IN @id INT) 
BEGIN 
    IF @id < O THEN 
    -- ERROR! do something here 
    ELSEIF 
    SELECT * from TABLE WHERE id = @id; 
    END IF 
END 
+0

注意。絕對是一個非常強大的功能。 – 2010-01-21 20:00:05