2013-10-30 76 views
1

我們一直在構建移動應用程序與PHP打服務層一個MySQL database.I在考慮去一個遠一點實現MySQL數據庫存儲過程來執行獲取數據的任務進行交互。在那裏,從PHP代碼中刪除任何SQL。MySQL的存儲過程PHP JSON響應

我在網上查了相關信息,但無法找到much.Following是我的一些顧慮:

  • MySQL存儲過程可以返回就像一個列表中的用戶定義的數據類型? (基於我可以搜索和發現的東西,似乎這些僅被接受爲IN參數)。
    • 將全部退回JSON格式的字符串(是的,我知道這將是稍重),會對性能產生負面影響?

我是比較新的PHP,MySQL和移動應用開發well.Based我與Oracle PL/SQL以往的經驗,我認爲在數據庫內,以書面查詢真的會是有利的。

+0

據我所知,MySQL使用「功能」到「迴歸」的東西,它只返回有效的MySQL數據類型,根據文檔。 我想,選擇返回一個JSON格式的字符串還是在外面格式化,取決於你的服務器將會有多忙。 據我所知,我建議你也使用PostgreSQL,它比MySQL更靈活,更快。 –

+0

感謝您的回覆穆罕默德!在這種情況下,我想探索包含整個結果集的字符類型的返回值。 –

回答

1

存儲函數嚮應用程序返回單個標量值(可能表示需要的任何值),存儲過程可以通過其參數OUT返回值,但對我而言更有趣且有用的事實是a過程可以使用過程主體中的一個或多個無界的SELECT語句將一個或多個結果集返回給客戶端。一個無界SELECT是沒有嵌套子查詢,遊標聲明中的不一部分,而不是一個SELECT ... INTO語句的一部分內SELECT

MySQL支持非常有用的擴展,它允許使用常規SELECT報表(也就是說,不使用遊標或局部變量)在存儲過程中。這種查詢的結果集只是直接發送給客戶端。多個SELECT語句會生成多個結果集,因此客戶端必須使用支持多個結果集的MySQL客戶端庫。

http://dev.mysql.com/doc/refman/5.6/en/stored-routines-syntax.html(在所有5.x的版本支持)

到客戶端,這看起來就像你會看到什麼,如果你已發出SELECT查詢...所以你可以返回一個元素表,您的應用程序可以用JSON來包裝。

還是......還有的MySQL用戶定義函數第三方庫(服務器擴展,用C/C++,不要與存儲功能相混淆),可以在服務器上生成JSON。

https://github.com/mysqludf/lib_mysqludf_json

我會嘗試嗎?是的,我會試試這個。將數據庫服務器中的JSON對象組裝成最有效或最好的處理方式?這當然是有爭議的,但我們可以整天思考和辯論這個理論方面的問題,而不是比我們開始時更接近解決方案。

+0

真的很感謝你的迴應Michael!我想進一步瞭解可能的返回類型,就像我可以像數組一樣返回數據類型而不是返回varchar。另外,希望你說的「一個過程可以返回一個或多個結果集給客戶端」的含義是通過將結果「提取到」一個變量並返回相同的參數。就像,如果我們要返回一個人名單和另一個城市名單,這些將成爲不同的參數。如果我錯了,請糾正我。謝謝。 –

+0

比這更好。您可以返回多個*結果集* - 實際合適的行和列集合,與使用一系列'SELECT'語句生成的結果相同 - 從存儲過程到客戶端。今天晚些時候我會給我的答案增加一個具體的例子。 –

+0

非常感謝Michael! –