這裏的存儲過程都是通過sql語句實現的,用來練習的表結構:
CREATE TABLE `test` (
`id` varchar(10) NOT NULL,
`name` varchar(50) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
代碼一、基本結構
DROP PROCEDURE IF EXISTS test;#如存在同名存儲過程則刪除
CREATE PROCEDURE test()
BEGIN#開始標識
declare _count int DEFAULT 0;
#聲明變量,建議變量名可用下劃線開頭不容易出錯
SELECT count(1) INTO _count FROM test;
#查找數據並存入變量
SELECT _count;#輸出變量
END#結束標識
代碼二:循環讀取數據
DROP PROCEDURE IF EXISTS test;#dsad
CREATE PROCEDURE test()
BEGIN
declare done int default false;
declare _id VARCHAR(10);
declare _name VARCHAR(50);
declare _cur cursor for (SELECT * FROM test);
#聲明遊標變量
declare continue HANDLER for not found set done = true;
#更新退出循環條件
open _cur;#打開遊標
loop1:loop#開始循環
fetch _cur into _id,_name;#賦值
if done then #退出
leave loop1;
end if;
SELECT _id,_name;
end loop loop1;
END
代碼三:新增數據
DROP PROCEDURE IF EXISTS test;
CREATE PROCEDURE test(IN _id VARCHAR(10),IN _name VARCHAR(50))
BEGIN
declare _count int DEFAULT 0;
SELECT count(1) into _count FROM test WHERE ID = _id;
IF _count <> 0 then
SELECT "該ID已存在";
ELSE
INSERT INTO test VALUES(_id,_name);
COMMIT;
END IF;
END
代碼四:存儲過程之間的調用(代碼三的改編)
DROP PROCEDURE IF EXISTS _save;
CREATE PROCEDURE _save(IN _id VARCHAR(10),IN _name VARCHAR(50))
BEGIN
INSERT INTO test VALUES(_id,_name);
COMMIT;
END
DROP PROCEDURE IF EXISTS test;
CREATE PROCEDURE test(IN _id VARCHAR(10),IN _name VARCHAR(50))
BEGIN
declare _count int DEFAULT 0;
SELECT count(1) into _count FROM test WHERE ID = _id;
IF _count <> 0 then
SELECT "該ID已存在";
ELSE
CALL _save(_id,_name);
END IF;
END