mysql存儲過程遞歸
如何創建MySQL存儲過程可以返回一個表類型的數據
首先需要知道「另一個存儲過程」的結果集的所有列的類型。
假設「另一個存儲過程」的名字是sp1,沒有參數,返回的結果集共3列,全部為int型,那麼「存儲過程」里添加一個與結果集列數相同的臨時表或表變數用於接收「另一個存儲過程」的結果集
如下
CREATE PROCEDURE sp2
AS
DECLARE @t table(a int,b int,c int)
INSERT INTO @t(a,b,c)
EXEC sp1
SELECT * FROM @t
使用SQLSERVER存儲過程可以很大的提高程序運行速度,簡化編程維護難度,現已得到廣泛應用。
創建存儲過程
和數據表一樣,在使用之前需要創建存儲過程,它的簡明語法是:
引用:
Create PROC 存儲過程名稱
[參數列表(多個以「,」分隔)]
AS
SQL 語句
例:
引用:
Create PROC upGetUserName
@intUserId INT,
@ostrUserName NVARCHAR(20) OUTPUT -- 要輸出的參數
AS
BEGIN
-- 將uName的值賦給 @ostrUserName 變數,即要輸出的參數
Select @ostrUserName=uName FROM uUser Where uId=@intUserId
END
其中 Create PROC 語句(完整語句為Create PROCEDURE)的意思就是告訴SQL SERVER,現在需要建立一個存儲過程,upGetUserName 就是存儲過程名稱,@intUserId 和 @ostrUserName 分別是該存儲過程的兩個參數,注意,在SQL SERVER中,所有用戶定義的變數都以「@」開頭,OUTPUT關鍵字表示這個參數是用來輸出的,AS之後就是存儲過程內容了。只要將以上代碼在「查詢分析器」里執行一次,SQL SERVER就會在當前資料庫中創建一個名為「upGetUserName」的存儲過程。你可以打開「企業管理器」,選擇當前操作的資料庫,然後在左邊的樹型列表中選擇「存儲過程」,此時就可以在右邊的列表中看到你剛剛創建的存儲過程了(如果沒有,刷新一下即可)。
二、存儲過程的調用
之前已經創建了一個名為「upGetUserName」的存儲過程,從字面理解該存儲過程的功能是用來取得某一個用戶的名稱。存儲過程建立好了,接下來就是要在應用程序里調用了,下面看一下在ASP程序里的調用。
❷ 在mysql中,存儲過程和函數的主要區別是函數可以返回一個值,而存儲過程不能。
答案:
在MySQL中,存儲過程和函數的主要區別在於函數可以返回一個值,而存儲過程則不能。下面將詳細解釋這一區別以及其他相關點。
存儲過程與函數的區別:
1. 返回值差異:函數的主要特點是它可以返回一個值,這個值可以是單一結果集、一個數值或者一個字元串等。而存儲過程則不直接返回值,它主要是通過輸出參數來傳遞結果。存儲過程可以包含多個輸出參數,用於返回多個結果或狀態信息。
2. 使用場景不同:存儲過程通常用於執行一系列復雜的操作或修改資料庫中的數據,而函數則更多地用於計算或返回某個特定的數據值。由於函數可以返回結果,因此在查詢語句中可以直接使用函數來簡化操作或得到計算結果。
3. 聲明方式差異:在MySQL中,創建函數需要使用“CREATE FUNCTION”語句,而創建存儲過程則使用“CREATE PROCEDURE”語句。此外,函數可以在SQL查詢中直接調用,而存儲過程則需要通過“CALL”語句來調用執行。
4. 性能考量:雖然函數在某些情況下可以提供便利,但在處理大量數據時,由於函數調用可能需要額外的處理時間,可能會影響到查詢性能。而存儲過程由於其執行流程的控制和優化,可能在處理復雜邏輯和大量數據時表現出更高的性能。
綜上所述,雖然存儲過程和函數在MySQL中都用於封裝代碼邏輯,但由於它們的設計目的和使用場景不同,因此在返回值、使用方式、性能等方面存在差異。在實際應用中,應根據具體需求和場景選擇合適的工具。
❸ mysql 存儲過程 異常 是否自動 回滾
是滴,默認是隱式的開始與提交,出現異常會默認自動回滾到開始位置,任何一個使用JDBC操作資料庫的SQL命令,在默認情況下,隱式開始與提交事務。當顯示的調用事物時,就必須顯示使用commit當使用rollback後也要進行commit;
❹ MySQL怎麼寫存儲過程查詢某個表的某一條記錄,並把這條記錄的所有列名對應的值以json格式返回呢
給你個思路吧,既然你能問出這種問題應該是有了思路就會自己做的人,就不幫你寫代碼了。
首先,你確定這個表的所有欄位中沒有二進制內容,如果沒有的話,下面這個思路你可以試試,但是如果有的話估計就需要對二進制進行特別的處理了,如果你有的話再追問吧。
思路開始:
1.如果你是對一張確定的表(提前已經知道表結構)進行這樣的處理,那就查詢出來一條記錄,通過Mysql的字元串拼接函數CONCAT,按照JSON格式,慢慢的拼一個字元串,最後通過select這個字元串返回這個字元串就行了。
2.如果之前你並不知道,這個表的結構,甚至你根本不知道自己要處理的是那張表,那麼存儲過程中你需要傳遞一個表名進來,然後查詢information_schema資料庫中的COLUMNS表,從而獲得這個表的具體欄位信息,以及各個欄位的先後順序(為後面拼接字元串使用),剩下的就跟1中描述的思路一樣了。
雖然不知道你的用處是什麼,不過,以我個人的經驗,這種返回JSON的方式並不可取,這樣會增加資料庫的負擔,理論上應該是將數據出來後自己在程序中拼接。