當前位置:首頁 » 存儲配置 » mysql存儲過程參數

mysql存儲過程參數

發布時間: 2023-01-31 08:18:14

A. mysql 怎麼執行帶有參數的存儲過程

直接用call調用存儲過程,如:call getUserInfo(參數1,參數2...);

B. 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的到來吧!

C. 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

D. 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:既可以作為輸入參數,也可以作為輸出參數

用法:

案例一:

案列二:

E. mysql存儲過程支持用表作為參數嗎

mysql存儲過程支持用表作為參數。

這個問題在MySQL 5.0以前非常麻煩,但是在MySQL 5.0.13版之後,由於引入了PREPARE語句,一切變得簡單了。
例子如下(已驗證):

DROPPROCEDUREIFEXISTS`newtable`;
CREATEPROCEDURE`newtable`(INtnamevarchar(64))
BEGIN
SET@sqlcmd=CONCAT('CREATETABLE',tname,'(idintNOTNULLAUTO_INCREMENT,namevarchar(64)DEFAULTNULL,PRIMARYKEY(`id`))');
PREPAREstmtFROM@sqlcmd;
EXECUTEstmt;
DEALLOCATEPREPAREstmt;
END;
callnewtable('abc');

F. 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

G. MySQL存儲過程里怎麼定義一個參數類型和表的變數類型一樣

MySQL存儲過程中,定義變數有兩種方式:
  1、使用set或select直接賦值,變數名以@開頭,可以在一個會話(即連接)的任何地方聲明,作用域是整個會話,稱為用戶變數。例如:set @var=1;
  2、 以declare關鍵字聲明的變數,只能在存儲過程中使用,稱為存儲過程變數,主要用在存儲過程中,或者是給存儲傳參數中。例如: declare var1 int default 0;

兩者的區別是:
    在調用存儲過程時,以declare聲明的變數都會被初始化為null。而會話變數(即@開頭的變數)則不會被再初始化,在一個會話(連接)內,只須初始化一次,之後在會話內都是對上一次計算的結果,就相當於在是這個會話內的全局變數。

H. mysql存儲過程的基本用法有哪些

mysql存儲過程的基本用法有哪些
在外部程序訪問資料庫時(例如 PHP),要組織很多 SQL 語句。

特別是業務邏輯復雜的時候,一大堆的 SQL 和條件夾雜在 PHP 代碼中,讓人不寒而慄。現在有了 MySQL 存儲過程,業務邏輯可以封裝存儲過程中,這樣不僅容易維護,而且執行效率也高。

一、MySQL 創建存儲過程

"pr_add" 是個簡單的 MySQL 存儲過程,這個MySQL 存儲過程有兩個 int 類型的輸入參數 "a"、"b",返回這兩個參數的和。
復制代碼 代碼如下:
drop procere if exists pr_add;

計算兩個數之和
復制代碼 代碼如下:
create procere pr_add
(
a int,
b int
)
begin
declare c int;
if a is null then
set a = 0;
end if;
if b is null then
set b = 0;
end if;
set c = a + b;
select c as sum;
/*
return c;
不能在 MySQL 存儲過程中使用。return 只能出現在函數中。

*/
end;

二、調用 MySQL 存儲過程
復制代碼 代碼如下:
call pr_add(10, 20);

執行 MySQL 存儲過程,存儲過程參數為 MySQL 用戶變數。
復制代碼 代碼如下:
set @a = 10;
set @b = 20;
call pr_add(@a, @b);

三、MySQL 存儲過程特點

創建 MySQL 存儲過程的簡單語法為:
復制代碼 代碼如下:
create procere 存儲過程名字()
(
[in|out|inout] 參數 datatype
)
begin
MySQL 語句;
end;

MySQL 存儲過程參數如果不顯式指定"in"、"out"、"inout",則默認為"in"。習慣上,對於是"in" 的參數,我們都不會顯式指定。

1. MySQL 存儲過程名字後面的"()"是必須的,即使沒有一個參數,也需要"()"

2. MySQL 存儲過程參數,不能在參數名稱前加"@",如:"@a int"。下面的創建存儲過程語法在 MySQL 中是錯誤的(在 SQL Server 中是正確的)。 MySQL 存儲過程中的變數,不需要在變數名字前加"@",雖然 MySQL 客戶端用戶變數要加個"@"。
復制代碼 代碼如下:
create procere pr_add
(
@a int, -- 錯誤
b int -- 正確
)

3. MySQL 存儲過程的參數不能指定默認值。

4. MySQL 存儲過程不需要在 procere body 前面加 "as"。而 SQL Server 存儲過程必須加 "as" 關鍵字。
復制代碼 代碼如下:
create procere pr_add
(
a int,
b int
)
as -- 錯誤,MySQL 不需要 "as"
begin
mysql statement ...;
end;

5. 如果 MySQL 存儲過程中包含多條 MySQL 語句,則需要 begin end 關鍵字。
復制代碼 代碼如下:
create procere pr_add
(
a int,
b int
)
begin
mysql statement 1 ...;
mysql statement 2 ...;
end;

6. MySQL 存儲過程中的每條語句的末尾,都要加上分號 ";"
復制代碼 代碼如下:
...
declare c int;
if a is null then
set a = 0;
end if;
...
end;

7. MySQL 存儲過程中的注釋。
復制代碼 代碼如下:
/*
這是個
多行 MySQL 注釋。
*/
declare c int; -- 這是單行 MySQL 注釋 (注意 -- 後至少要有一個空格)
if a is null then # 這也是個單行 MySQL 注釋
set a = 0;
end if;

I. mysql的存儲過程怎麼傳入數組參數

沒試過往裡面傳數組,一般都是多傳幾個參數,把幾個參數放入SqlParameter[]中,然後cmd.Parameters.AddRange(pars);
創建方法:
SqlParameter[] paras = new SqlParameter[]
{
new SqlParameter("@PageIndex","ccc"),
new SqlParameter("@PageSize","ccc"),
new SqlParameter("@StrSql","ccc")
};
ccc就是你想傳入的值,帶@的就是你在存儲過程中定義的參數。
算是一種另類的數組吧。要不你就把所有條件組合成一個字元串,中間用特殊符號隔開,到資料庫用split方法再分回來,不過這個方法比較麻煩,不推薦

J. 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)
熱點內容
官式訪問 發布:2024-04-27 10:04:00 瀏覽:521
國產高配置有哪些 發布:2024-04-27 09:18:26 瀏覽:947
建行手機app忘記密碼如何修改 發布:2024-04-27 08:58:59 瀏覽:393
蟻群演算法的數學模型 發布:2024-04-27 08:58:39 瀏覽:994
androidactivity生命 發布:2024-04-27 07:33:48 瀏覽:84
win2008伺服器搭建網站 發布:2024-04-27 07:26:51 瀏覽:640
java的vector 發布:2024-04-27 07:05:00 瀏覽:204
舊電腦共享伺服器 發布:2024-04-27 06:32:21 瀏覽:339
java程序練習 發布:2024-04-27 06:24:00 瀏覽:438
sql30 發布:2024-04-27 06:22:10 瀏覽:55