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 存儲過程 資料庫表名欄位作為參數傳遞給存儲過程的方法
直接將資料庫表名欄位作為字元類型傳到存儲過程中,存儲過程拼接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帶參數存儲過程
CREATE DEFINER= XXXX @ % PROCEDURE PRO_proct_pass_rate (IN start_date date, #統計開始日期
IN end_date date, #統計結束日期
IN proct_id VARCHAR(3000), #產品ID,多個用「,」分隔
IN show_type VARCHAR(2), #顯示模式 1:按時間段只顯示1筆通過率 2:跨月時間段按月顯示通過率
OUT result_status VARCHAR(30), #返回處理狀態
OUT result_info VARCHAR(100) #返回處理信息
)
BEGIN
DECLARE v_cnt1 INT;
DECLARE v_cnt2 INT;
DECLARE pid_list VARCHAR(3000);
END IF;
END
❹ MySQL存儲過程里怎麼定義一個參數類型和表的變數類型一樣
MySQL存儲過程中,定義變數有兩種方式:
1、使用set或select直接賦值,變數名以@開頭,可以在一個會話(即連接)的任何地方聲明,作用域是整個會話,稱為用戶變數。例如:set @var=1;
2、 以declare關鍵字聲明的變數,只能在存儲過程中使用,稱為存儲過程變數,主要用在存儲過程中,或者是給存儲傳參數中。例如: declare var1 int default 0;
兩者的區別是:
在調用存儲過程時,以declare聲明的變數都會被初始化為null。而會話變數(即@開頭的變數)則不會被再初始化,在一個會話(連接)內,只須初始化一次,之後在會話內都是對上一次計算的結果,就相當於在是這個會話內的全局變數。
❺ mysql 存儲過程 DDL 參數
MySQL8.0 開始支持原⼦ DDL(atomic DDL),數據字典的更新,存儲引擎操作,寫⼆進制日誌結合成了一個事務。在沒有原⼦DDL之前,DROP TABLE test1,test2;如遇到server crash,可能會有test1被drop了,test2沒有被drop掉。下面來看下在MySQL8.0之前和MySQL8.0 數據字典的區別
在MySQL8.0 之前,Data Dictionary除了存在與.FRM, .TRG, .OPT ⽂件外,還存在於系統表中(MyISAM ⾮事務引擎表中),在MySQL8.0 ,Data Dictionary 全部存在於Data Dictionary Storage Engine(即 InnoDB表中),這使crash recovery 維持原⼦性成為了可能
存儲引擎⽀持
目前,只有InnoDB存儲引擎⽀持原子DDL,為了實現原子DDL,Innodb要寫DDL logs 到 mysql.innodb_ddl_log 表,這是⼀個隱藏在mysql.ibd 數據字典表空間⾥的數據字典表。要看mysql.innodb_ddl_log 中的內容,需要
SET GLOBALLOG_ERROR_VERBOSITY=3;(MySQL 8.0 默認為2,error log 記錄Errors and
warnings,不不記錄notes)
SET GLOBAL innodb_print_ddl_logs=1;
CREATE TABLEt1 (c1 INT)ENGINE=InnoDB;
查看error log
[Note] [MY-011066] InnoDB: DDL loginsert: [DDLrecord:DELETE SPACE,id=30,
thread_id=25, space_id=9, old_file_path=./test/t1.ibd]
[Note] [MY-011066]InnoDB:DDL logdelete:by id30
[Note] [MY-011066]InnoDB:DDL loginsert: [DDLrecord: REMOVECACHE,id=31,
thread_id=25, table_id=1066, new_file_path=test/t1]
[Note] [MY-011066]InnoDB:DDL logdelete:by id31
[Note] [MY-011066]InnoDB:DDL loginsert: [DDLrecord: FREE,id=32, thread_
id=25, space_id=9, index_id=143, page_no=4]
[Note] [MY-011066]InnoDB:DDL log delete:by id32
[Note] [MY-011066]InnoDB:DDL logpost ddl :begin for thread id: 25
[Note] [MY-011066]InnoDB:DDL logpost ddl :end for thread id: 25
原子DDL 操作步驟
准備:創建所需的對象並將DDL⽇志寫入 mysql.innodb_ddl_log表中。DDL日誌定義了如何前滾和回滾DDL操作。
執行:執⾏DDL操作。例如,為CREATE TABLE操作執⾏創建。
提交:更新數據字典並提交數據字典事務。
Post-DDL:重播並從mysql.innodb_ddl_log表格中刪除DDL⽇志。為確保回滾可以安全執⾏⽽不引⼊不⼀致性,在此最後階段執⾏⽂件操作(如重命名或刪除數據文件)。這一階段還從 mysql.innodb_dynamic_metadata的數據字典表刪除的動態元數據為了DROP TABLE,TRUNCATE和其它重建表的DDL操作。
⽆論事務是提交還是回滾,DDL日誌都會mysql.innodb_ddl_log在Post-DDL階段重播並從表中刪除 。mysql.innodb_ddl_log如果伺服器在DDL操作期間暫停,DDL⽇志應該只保留在表中。在這種情況下,DDL⽇志會在恢復後重播並刪除。
在恢復情況下,當伺服器重新啟動時,可能會提交或回退DDL事務。如果在重做⽇志和⼆進制日誌中存在DDL操作的提交階段期間執⾏的數據字典事務,則該操作被認為是成功的並且被前滾。否則,在InnoDB重放數據字典重做日誌時回滾不完整的數據字典事務 ,並且回滾DDL事務。
原⼦DDL ⽀持類型
• DROP TABLES , all tables dropped or none
• DROP SCHEMA, all entities in the schema are dropped, or none
• Note that atomic DDL statements will be rolled back or committed even in case of crash, e.g. RENAME TABLES
• CREATE TABLE would be successfully committed or rolled back (no orphan ibd left)
• TRUNCATE TABLE (including InnoDB tables with FTS AUX tables) would be successfully committed or rolled back
• RENAME TABLES, all or none
• ALTER TABLE successful or not done
示例
結論
在MySQL8.0之前,alter table 操作在server crash的情況下,會遺留.frm,.ibd文件。MySQL8.0 能實現原⼦DDL(包括 DROP TABLE, DROP SCHEMA, CREATE TABLE, TRUNCATE TABLE, ALTER TABLE),alter table 操作,在server crash的情況下,不會遺留.frm,.ibd臨時文件。讓我們⼀起期待MySQL8.0 GA的到來吧!
❻ mysql 存儲過程參數
MySQL 存儲過程, 定義參數, 不需要加那個 @
例子代碼如下:
mysql> DELIMITER //
mysql> CREATE PROCEDURE HelloWorld1(vUserName VARCHAR(10))
-> BEGIN
-> SELECT CONCAT('Hello ', vUserName);
-> END//
Query OK, 0 rows affected (0.00 sec)
mysql> call HelloWorld1('Edward');
-> //
+-----------------------------+
| CONCAT('Hello ', vUserName) |
+-----------------------------+
| Hello Edward |
+-----------------------------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.02 sec)
❼ 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 存儲過程總結(一)
1、存儲過程定義:
存儲過程是事先經過編譯並存儲在資料庫中的一段 SQL 語句的集合,調用存儲過程可以簡化應用開發 人員的很多工作,減少數據在資料庫和應用伺服器之間的傳輸,對於提高數據處理的效率是有好處的。 存儲過程思想上很簡單,就是資料庫 SQL 語言層面的代碼封裝與重用。
2、特點:
封裝,復用 : 可以把某一業務SQL封裝在存儲過程中,需要用到 的時候直接調用即可。
可以接收參數,也可以返回數據 :再存儲過程中,可以傳遞參數,也可以接收返回 值。
減少網路交互,效率提升 : 如果涉及到多條SQL,每執行一次都是一次網路傳 輸。 而如果封裝在存儲過程中,我們只需要網路交互一次可能就可以了。
3、基本語法
(1)創建:
(2)調用:
(3)查看:
(4)刪除
注意: 在命令行中,執行創建存儲過程的SQL時,需要通過關鍵字 delimiter 指定SQL語句的 結束符。
❾ mysql存儲過程把欄位作為傳入參數
要對bankType1傳參就在 begin 後面添加
declare @bankType1 varchar(225)
set @bankType1=(select bankType1 from 表名)
❿ 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');