mysql存儲過程傳參
1、存儲過程定義:
存儲過程是事先經過編譯並存儲在資料庫中的一段 SQL 語句的集合,調用存儲過程可以簡化應用開發 人員的很多工作,減少數據在資料庫和應用伺服器之間的傳輸,對於提高數據處理的效率是有好處的。 存儲過程思想上很簡單,就是資料庫 SQL 語言層面的代碼封裝與重用。
2、特點:
封裝,復用 : 可以把某一業務SQL封裝在存儲過程中,需要用到 的時候直接調用即可。
可以接收參數,也可以返回數據 :再存儲過程中,可以傳遞參數,也可以接收返回 值。
減少網路交互,效率提升 : 如果涉及到多條SQL,每執行一次都是一次網路傳 輸。 而如果封裝在存儲過程中,我們只需要網路交互一次可能就可以了。
3、基本語法
(1)創建:
(2)調用:
(3)查看:
(4)刪除
注意: 在命令行中,執行創建存儲過程的SQL時,需要通過關鍵字 delimiter 指定SQL語句的 結束符。
❷ mysql 存儲過程總結(二)if語句、參數
1、if :用於做條件判斷,具體的語法結構為:
在if條件判斷的結構中,ELSE IF 結構可以有多個,也可以沒有。 ELSE結構可以有,也可以沒有。
案列:
根據定義的分數score變數,判定當前分數對應的分數等級。
score >= 90分,等級為優秀。
score >= 80分,等級為良好
score >= 60分,等級為及格
score < 60分,等級為不及格。
上述的需求我們雖然已經實現了,但是也存在一些問題,比如:score 分數我們是在存儲過程中定義 死的,而且最終計算出來的分數等級,我們也僅僅是最終查詢展示出來而已。
那麼我們能不能,把score分數動態的傳遞進來,計算出來的分數等級是否可以作為返回值返回呢? 答案是肯定的,我們可以通過接下來所講解的 參數 來解決上述的問題。
2、參數的類型
主要分為以下三種:IN、OUT、INOUT。 具體的含義如下:
(1)in :該類參數作為輸入,也就是需要調用時傳入值 默認
(2)out:該類參數作為輸出,也就是該參數可以作為返回值
(3)inout:既可以作為輸入參數,也可以作為輸出參數
用法:
案例一:
案列二:
❸ mysql存儲過程傳入一個參數返回結果集
mysql中要獲得存儲過程的返回值,可以增加一個out參數,用來返回。
mysql中存儲過程的例子:
CREATE PROCEDURE addvoucher (
IN userid INT,
IN voucherid INT,
OUT result INT
)
BEGIN
SELECT
@endate_a := endate ,@batch_a := batch ,@c_count_a := c_count,
@isdead_a := isdead
FROM
t_voucher
WHERE
id = voucherid;
SET autocommit = 0;
IF EXISTS (
SELECT
*
FROM
t_user_voucher tuv,
t_voucher tv
WHERE
tv.id = tuv.voucherid
AND tv.batch =@batch_a
) THEN
SET result = 1;-- 已存在
SELECT
result;
ELSE
IF @c_count_a > 0 THEN
IF (
TO_DAYS(@endate_a) - TO_DAYS(NOW())
) > 0 THEN
❹ mysql的存儲過程怎麼傳入數組參數
沒試過往裡面傳數組,一般都是多傳幾個參數,把幾個參數放入SqlParameter[]中,然後cmd.Parameters.AddRange(pars);
創建方法:
SqlParameter[] paras = new SqlParameter[]
{
new SqlParameter("@PageIndex","ccc"),
new SqlParameter("@PageSize","ccc"),
new SqlParameter("@StrSql","ccc")
};
ccc就是你想傳入的值,帶@的就是你在存儲過程中定義的參數。
算是一種另類的數組吧。要不你就把所有條件組合成一個字元串,中間用特殊符號隔開,到資料庫用split方法再分回來,不過這個方法比較麻煩,不推薦
❺ Mysql 存儲過程,傳遞中文參數問題
應該是編碼問題。輸入
set names gbk;
這是使你輸入查詢取數據的傳輸的用的編碼。
不行的話可能你原先存的時候編碼就不對了。
所以就先drop你當前這資料庫,然後set names gbk; ,再建資料庫和表。再測試下應該就可以。
當然還要保證你的server client 底層存數據的默認編碼是utf8..至少要gbk,如果默認是latin1要改下。具體在配置文件my.ini里改 default-character-set=utf8 這個你可以搜索一下具體怎麼改
❻ mysql存儲過程傳多個參數,但並不是所有參數全輸入,這要怎麼寫,
mysql> DELIMITER //
mysql> CREATE PROCEDURE HelloWorld2(
-> IN vUserName VARCHAR(10),
-> OUT vOutValue VARCHAR(10),
-> INOUT vInOutValue VARCHAR(10))
-> BEGIN
-> SELECT CONCAT('Hello ', vUserName);
-> SET vOutValue = 'A';
-> SET vInOutValue = 'B';
-> END//
Query OK, 0 rows affected (0.00 sec)
mysql> call HelloWorld2('Edward', @a, @b)//
+-----------------------------+
| CONCAT('Hello ', vUserName) |
❼ mysql 存儲過程 資料庫表名欄位作為參數傳遞給存儲過程的方法
直接將資料庫表名欄位作為字元類型傳到存儲過程中,存儲過程拼接sql語句,再用exec執行。例如:
CREATE PROCEDURE [proc_test]
(@tablename varchar(100))
WITH
EXECUTE AS CALLER
AS
declare @sql varchar(1000);
set @sql='select * from '+@tablename
exec(@sql)
GO
再直接執行 exec proc_test '學生表'
❽ Mysql 存儲過程 UPDATE語句 欄位=傳遞過來的參數字元串參數
mysql存儲過程支持用表作為參數。
這個問題在MySQL 5.0以前非常麻煩,但是在MySQL 5.0.13版之後,由於引入了PREPARE語句,一切變得簡單了。
例子如下(已驗證):
DROP PROCEDURE IF EXISTS `newtable`;
CREATE PROCEDURE `newtable`(IN tname varchar(64))
BEGIN
SET @sqlcmd = CONCAT('CREATE TABLE ', tname, ' (id int NOT NULL AUTO_INCREMENT, name varchar(64) DEFAULT NULL, PRIMARY KEY (`id`))');
PREPARE stmt FROM @sqlcmd;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END;
call newtable('abc');