日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql 动态传入表名 存储过程_面试再问MySQL存储过程和触发器就把这篇文章给他...

發布時間:2025/3/20 数据库 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql 动态传入表名 存储过程_面试再问MySQL存储过程和触发器就把这篇文章给他... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Mysql存儲過程及觸發器trigger

存儲過程

一、一個簡單的存儲過程

1,一個簡單的存儲過程

delimiter $$create procedure testa()begin Select * from emp; Select * from dept; End;$$;delimiter ;-- 調用存儲過程call testa();

存儲過程的結構組成:

1,創建格式:create procedure 存儲過程名

2,包含一個以上代碼塊,代碼塊使用begin和end之間

3,在命令行中創建需要定義分隔符 delimiter $$

2,存儲過程的特點

1,能完成復雜的判斷和運算

2,可編程性強,靈活

3,SQL編程的代碼可重復使用

4,執行速度相對快

5,減少網絡之間數據傳輸,節省開銷

二、存儲過程變量

1,存儲過程中的變量

需求:編寫存儲過程,使用變量取empno=7369的用戶名

Delimiter $$;Create procedure testa();BEGIN DECLARE my_uname varchar(32) default ""; -- 定義變量my_uname SET my_uname='smith'; -- 為變量my_uname賦值 -- 查詢empno=7369的用戶名,并將值賦給my_uname select ename into my_uname from emp where empno=7369; -- 為變量賦值 select my_uname;-- 返回my_uname的值END;$$;Delimiter ;

特點:

1,變量的聲明使用declare,一句declare只聲明一個變量,變量必須先聲明后使用。

2,變量具有數據類型和長度,與mysql的SQL數據類型保持一致,還能指定默認值、字符集和排序規則等。

3,變量可以通過set來賦值,也可以通過select into的方式賦值。

4,變量需要返回,可以使用select語句,如:select 變量名

2,存儲過程變量應用示例

需求:統計表emp、dept的行數和emp表中最早,最晚的入職日期。

Delimiter $$;Create procedure stats_emp();BEGIN-- 統計emp和dept表中的記錄數 BEGIN DECLARE emp_sum int default 0; DECLARE dept_sum int default 0; select count(*) into emp_sum from emp; select count(*) into dept_sum from dept; select emp_sum,dept_sum; END;-- 統計最早、最晚入職日期 BEGIN DECLARE max_time TIMESTAMP ; DECLARE min_time TIMESTAMP; select max(hiredate),min(hiredate) into max_time,min_time from emp; select max_time,min_time; END;END$$;Delimiter ;

三、存儲過程的參數

1,存儲過程的傳入參數IN

需求:編寫存儲過程,傳入empno,返回該用戶的ename.

Delimiter $$;Create procedure test_param(IN my_empno int);--------BEGIN DECLARE my_ename varchar(32) default ''; select ename into my_ename from emp where empno=my_empno; select my_ename;END;$$Delimiter ;-- 調用Call test_param(7369);

提示:

1,傳入參數:類型為IN,表示該參數的值必須在調用存儲過程時指定,如果不顯示指定為IN,那么默認就是IN類型。

2,IN類型參數一般只用于傳入,在調用存儲過程中一般不作修改和返回。

3,如果調用存儲過程中需要修改和返回值,可以使用OUT類型參數。

2,存儲過程的傳出參數OUT

需求:調用存儲過程時,傳入empno,返回該用戶的ename。

Delimiter $$;create procedure test_param(IN my_empno int,OUT my_ename varcahr(32));--------BEGIN select ename into my_ename from emp where empno=my_empno; select my_ename;END;$$Delimiter ;-- 調用Set @uname=’’;Call test_param_out(7369,@uname);

提示:

1,傳出參數:在調用存儲過程中,可以改變其值,并可返回。

2,OUT是傳出參數,不能用于傳入參數值。

3,調用存儲過程時,OUT參數也需要指定,但必須是變量,不能是常量。

4,如果既需要傳入,同時又需要傳出,則可以使用INOUT類型參數。

3,存儲過程的可變參數INOUT

需求:調用存儲過程時,參數my_empno和my_ename,既是傳入,也是傳出參數。

Delimiter $$;create procedure test_param_inout(INOUT my_empno int,INOUT my_ename varchar(32));BEGIN set my_empno=7369; set my_ename="smith"; select ename,empno into my_ename,my_empno from emp where empno=my_empno;END;$$Delimiter ;-- 調用set @uname:='';set @empno:=7399;call test_param_inout(@empno,@uname);select @empno,@uname;

特點:

1,可變變量INOUT,調用時可傳入值,在調用過程中,可以修改其值,同時也可以返回值。

2,INOUT 參數集合了IN和OUT類型參數的功能

3,INOUT調用時傳入的是變量,而不是常量

四、存儲過程條件語句

1,存儲過程的條件語句

需求:編寫存儲過程,如果用戶empno是偶數則給出ename,其他情況只返回empno.

Delimiter $$;create procedure test_if(IN my_empno int);BEGINDECLARE my_ename VARCHAR(32) default ''; if(my_empno %2=0) then select ename into my_ename from emp where empno=my_empno;select my_ename; else select my_empno; end if;END;$$Delimiter ;-- 調用call test_if(7369);

特點:

1,條件語句最基本結構: if() then ... else ... end if;

2,if判斷返回邏輯真或者假,表達式可以是任意返回真或假的表達式

2,存儲過程的條件語句應用示例

需求:根據用戶傳入的empno參數判斷:

(1)如果用戶sal小于2000,則給用戶加薪200

(2)如果用戶sal小于1000,則給用戶加薪500

(3)其他情況加薪100

Delimiter $$;create procedure test_if_else(IN my_empno int);BEGINDECLARE my_sal int default 0; select sal into my_sal from emp where empno=my_empno; if(my_sal<1000) then update emp set sal=sal+500 where empno=my_empno; ELSEIF(my_sal<2000) then update emp set sal=sal+200 where empno=my_empno; else update emp set sal=sal+100 where empno=my_empno; end if;END;$$Delimiter ;-- 調用call test_if_else(7369);

特點:

多條件判斷結構:

If()

Then

...

Else if()

Then

...

Else

...

End if;

五、存儲過程循環語句

1,while循環

需求:使用循環語句,向表emp中插入10條empno連續的記錄。

Delimiter $$;create procedure test_while();BEGIN DECLARE i int default 0; while(i<10) DO BEGIN set i=i+1; insert into acc(id) values(i); END; END WHILE; END;$$Delimiter ;-- 調用call test_while();

特點:

1,while語句最基本結構: while() do begin ... end end while;;

2,while判斷返回邏輯真或者假,表達式可以是任意返回真或假的表達式

2,repeat循環語句

需求:使用repeat循環向表acc插入10條id連續的記錄

Delimiter $$;create procedure test_repeat();BEGIN DECLARE i int default 100; REPEAT BEGIN set i=i+1; insert into acc(id) values(i); END; UNTIL i>=110 END REPEAT;END;$$Delimiter ;-- 調用call test_repeat();

特點:

1,repeat語句最基本結構: repeat begin ... end until end repeat;;

2,while判斷返回邏輯真或者假,表達式可以是任意返回真或假的表達式

六、存儲過程游標的使用

1,什么是游標

需求:編寫存儲過程,使用游標,把uid為偶數的記錄逐一更新用戶名。

Delimiter $$;create procedure test_cursor();BEGIN DECLARE stopflag INT DEFAULT 0; -- 游標停止的標記 0:未停止 1:已停止 DECLARE my_uname VARCHAR(32) default ''; -- 存儲查詢出的用戶名 DECLARE uname_cursor CURSOR for select uname from acc where uid%2=0; -- 定義游標uname_cursor,并指定結果集 DECLARE CONTINUE HANDLER for NOT found set stopflag=1; -- 游標結束后stopflag設置為1 open uname_cursor; -- 打開游標 FETCH uname_cursor into my_uname; -- -- 游標向前走一步,取出一條記錄放到my_uname中my_uname WHILE(stopflag=0) DO BEGIN update acc set uname=CONCAT(my_uname,"_cur") where uname=my_uname; FETCH uname_cursor into my_uname; END; end WHILE; close uname_cursor;END;$$Delimiter ;-- 調用call test_repeat();

特點:

declare uname_cur Cursor for select uname from acc where uid%2=0;

1,游標是保存查詢結果的臨時內存區域

2,游標變量uname_cur保存了查詢的臨時結果,實際上就是查詢結果集

Declare continue handler for not found set stopflag=1;

3,當游標變量中保存的結果都查詢一遍(遍歷),到達結尾,把變量stopflag設為1。

4, FETCH uname_cursor into my_uname; -- 游標向前走一步,取出一條記錄放到my_uname中

Mysql函數

一、一個簡單函數

需求:編寫函數,傳入一個uid,返回用戶的uname

Delimiter $$; CREATE FUNCTION f01_simple(my_uid int) RETURNS varchar(32) CHARSET utf8BEGIN DECLARE my_uname varchar(32) default ''; select uname into my_uname from acc where uid=my_uid;RETURN my_uname;END$$Delimiter ;-- 調用Select f01_simple(2);

特點:

1,創建函數使用 create function 函數名(參數) return 返回值

2,函數體放在begin和end之間

3,return 指定函數的返回值

4,函數調用: select 函數名(實參);

二、自定義函數綜合應用示例

1,自定義函數示例01

需求:輸入用戶uid,獲得accountid,uid,uname組合的uuid值,作為用戶的唯一標識。

Delimiter $$; CREATE FUNCTION test_uuid(my_uid int) RETURNS varchar(32) CHARSET utf8BEGIN DECLARE uuid varchar(32) default ''; select CONCAT(accountid,"_

總結

以上是生活随笔為你收集整理的mysql 动态传入表名 存储过程_面试再问MySQL存储过程和触发器就把这篇文章给他...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。