mysql存儲過程判斷空判斷
下面是一個最簡單的MySQL存儲過程,實現兩個數相加
delimiter $$
create procere proc_add(in a int,in 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;
end$$
delimiter ;
需要特別注意的是
1. declare語句只能放在存儲過程的開始位置,放在後面就會報錯
2. if 語句的後面必須有then,但是不需要begin,在if結束時需要end if
3. 判斷是否為NULL倒是和MSSQL一樣都有IS NULL
4. delimiter是定界符的意思在結束的end後面要添加定界符
5. end if之後必須跟分號,否則語法錯誤
下面是一個較常見的場景,判斷表中某列是否存在某值,如果存在執行某操作
delimiter $$
create procere proc_add_book(in $bookName varchar(200),in $price float)
begin
declare $existsFlag int default 0;
select bookId into $existsFlag from book where bookName = $bookName limit 1;
if bookId > 0 then
#if not exists (select * from book where bookNumber = $bookName) then
insert into book(bookNumber,price) values($bookName,$price);
end if;
end$$
delimiter ;
需要注意的是不能用if exists;exists可以在where後面或者在create object是使用,但是在if語句中不可以使用,只能用變通的方法。
while語句也需要注意,下面是一個while的簡單應用:
delimiter $$
create procere proc_add_books_looply(in $bookName varchar(200),in $price float,in $insertTimes INT)
begin
while $insertTimes>0 do
insert into book (bookName,price) values($bookName,$price);
end while;
end$$
delimiter ;
可以看到while後面跟條件,條件後面要跟一個do,在while循環體結束之後需要end while並以分號結束。
以上是一些簡單的總結,希望有用。
⑵ MySQL存儲過程中能不能用IF exists(SELECT * from form__rmms_pofm_fundsmanage) THEN ...END
你這個if是要判斷uisp_lw_100000表空間里是不是存在表form__rmms_pofm_fundsmanage。
你這樣判斷如果是不存在就直接報錯了。所以就不能運行通過。
你在上邊再聲明一個變數tb_name用來存放你要找的這個表名。
select table_name into tb_name from information_schema.tables where table_schema='uisp_lw_100000' AND TABLE_NAME='form__rmms_pofm_fundsmanage';
這樣你判斷tb_name是不是空就行了。判斷跟你的while跳出的判斷一樣。
⑶ mysql 存儲過程中的 if exists 判斷問題
SELECT沒有IF EXISTS 語法,你可以用select count(*) from information_schema.tables where table_schema='your_schema' and table_name='your_tab';看返回0還是1來判斷。
⑷ 該如何寫存儲過程,實現mysql返回多個結果,其中的結果可能為空
就跟寫Java代碼里有返回值的方法一樣,只是把語法換成Sql裡面的寫法就好了
aaa: 輸入參數
bbb: 輸出參數,一個表對象,或者一個結果集
包
proce getMySqlDate(aaa IN varchar2,
bbb OUT tmpTable%ROWTYPE) IS
本體
proce getMySqlDate(aaa IN varchar2,
bbb OUT tmpTable%ROWTYPE)
begin
--查詢數據
CURSOR curCc is
select a,b from tab1;
type typeCurCc of table curCc%ROWTYPE;
typeCurCc tabCurCc; -- 定義游標類型
--打開游標把查詢處理的數據,賦值到bbb的輸出參數就行了。
open 游標
....
bbb.a = 游標.a;
close 游標;
--存儲過程終了
END getMysql;
⑸ Mysql 存儲過程中如何判斷Cursor中結果集是否為空
0 通過定義一個上下文管理者(即declare continue handler)來實現
必須在游標定義後定義,並通過使用一個輔助變數來進行判斷。
1 示例如下:
delimiter $
drop procere if exists curdemo $
CREATE PROCEDURE curdemo(pid int)
BEGIN
DECLARE notfound INT DEFAULT 0; #定義一個輔助變數用於判斷
DECLARE a int; #定義游標輸出值賦予的變數
DECLARE cur1 CURSOR FOR SELECT id FROM test.t where id= pid; #定義游標
DECLARE CONTINUE HANDLER FOR NOT FOUND SET notfound = 1; #定義declare continue handler,這個會根據上下文是否有結果判斷是否執行SET notfound = 1
OPEN cur1;
FETCH cur1 INTO a;
if notfound = 1 then
select 'no result';
#寫業務邏輯
ELSE
select concat('result:', a);
#寫業務邏輯
end if;
CLOSE cur1;
END
$
delimiter ;
call curdemo(240);
⑹ mysql存儲過程的if判斷有多個條件該怎麼優化效率
這個應該不會太慢吧,我建議你看一下,你是不是循環做了太多次的插入/更新操作。
mysql默認的配置中,每次事務提交都要寫binlog和redo log,如果循環太多次——比如循環插入10w條記錄——就會非常慢。一般優化思路分兩種:
1 修改 sync_binlog為一個100-1000間的值,讓binlog每隔100-1000個事務後再寫一次;修改innodb_flush_log_at_trx_commit =2; 這么搞的好處是降低了寫log的次數和消耗的時間,缺點是,中間出錯的話,會丟失一部分的binlog和redolog導致無法通過他們來在出問題是恢復生產庫數據。
2 將所有的插入/更新操作放到一個事務中進行。這樣,顯然就只需要一次寫binlong和redolog咯。