當前位置:首頁 » 存儲配置 » mysql存儲過程判斷空判斷

mysql存儲過程判斷空判斷

發布時間: 2023-09-19 12:26:12

⑴ 關於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咯。

熱點內容
源碼編譯安裝nginx 發布:2024-11-30 15:46:22 瀏覽:633
容性演算法 發布:2024-11-30 15:46:19 瀏覽:123
C語言cast 發布:2024-11-30 15:34:39 瀏覽:982
查看資料庫事務 發布:2024-11-30 15:29:34 瀏覽:56
python無線 發布:2024-11-30 15:24:49 瀏覽:359
安卓手機怎麼下符文之地 發布:2024-11-30 14:49:28 瀏覽:878
安卓ota在哪裡打開 發布:2024-11-30 14:46:55 瀏覽:102
mapreduce演算法 發布:2024-11-30 14:46:50 瀏覽:16
python的shell 發布:2024-11-30 14:46:49 瀏覽:730
變頻器什麼時候配置電抗器 發布:2024-11-30 14:46:37 瀏覽:700