基本語法
創(chuàng)新互聯(lián)是一家專業(yè)提供日土企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站建設(shè)、網(wǎng)站制作、H5開發(fā)、小程序制作等業(yè)務(wù)。10年已為日土眾多企業(yè)、政府機構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)的建站公司優(yōu)惠進行中。
while 條件 do
要循環(huán)執(zhí)行的代碼;
end while;
結(jié)構(gòu)標(biāo)識符
基本語法
標(biāo)識名:while 條件 do
要循環(huán)執(zhí)行的代碼;
end while 標(biāo)識名;
方法很簡單
SQL.ADD(select FEILEI from dbconfig group by FEILEI)
SQL.OPEN()
WHILE(NOT EOF)
{
SQL2.ADD(SELECT * FROM dbconfig WHERE FEILEI =FIELDBYNAME("FEILEI "))
WHILE(NOT EOF)
{
......//顯示數(shù)據(jù)
}
}
以上是實現(xiàn)功能的方式 具體代碼和語法自己寫吧,兩層循環(huán)嵌套就OK
CREATE?TABLE?test_AA?(
id??INT,
val?varchar(6)
);
INSERT?INTO?test_AA?VALUES(null,??'A');
INSERT?INTO?test_AA?VALUES(null,??'B');
INSERT?INTO?test_AA?VALUES(null,??'C');
INSERT?INTO?test_AA?VALUES(null,??'D');
INSERT?INTO?test_AA?VALUES(null,??'E');
SELECT?*?FROM?test_AA;
+------+------+
|?id???|?val??|
+------+------+
|?NULL?|?A????|
|?NULL?|?B????|
|?NULL?|?C????|
|?NULL?|?D????|
|?NULL?|?E????|
+------+------+
5?rows?in?set?(0.00?sec)
--?假設(shè)?id?從?101?開始.
SET?@rownum?=?100;
UPDATE?
test_AA
SET
id?=?(@rownum?:=?@rownum?+?1);
mysql?SELECT?*?FROM?test_AA;
+------+------+
|?id???|?val??|
+------+------+
|??101?|?A????|
|??102?|?B????|
|??103?|?C????|
|??104?|?D????|
|??105?|?E????|
+------+------+
5?rows?in?set?(0.00?sec)
SQL:結(jié)構(gòu)化查詢語言,包括數(shù)據(jù)定義語言(DDL)如:CREATE、DROP、ALTER等;數(shù)據(jù)操作語言(DML)如:INSERT、UPDATE、DELETE之類;數(shù)據(jù)查詢語言(DQL)如:SELECT語句;數(shù)據(jù)控制語言(DCL)如:GRANT、REVOKE、COMMIT、ROLLBACK等。
T-SQL:Transact-SQL,為SQL的語言的增強版,加入了程序語言中的if,while 等流程控制語法,同時可以使用函數(shù)功能
--傳入id,輸出name和sex的存儲過程,這里同個id有多條數(shù)據(jù),所以需要用到游標(biāo)。
DELIMITER //
CREATE PROCEDURE p5(IN v_id INT)
BEGIN
DECLARE nodata INT DEFAULT 0;#注意:這個變量聲明必須放在游標(biāo)聲明前面
DECLARE v_name VARCHAR(30);
DECLARE v_sex CHAR(3);
DECLARE c_ns CURSOR FOR SELECT NAME,sex FROM t WHERE id = v_id;
DECLARE EXIT HANDLER FOR NOT FOUND SET nodata = 1;#當(dāng)讀到數(shù)據(jù)的最后一條時,設(shè)置變量為1
OPEN c_ns;
WHILE nodata = 0 DO#判斷是不是到了最后一條數(shù)據(jù)
FETCH c_ns INTO v_name,v_sex;
SELECT v_name,v_sex,nodata;
END WHILE;
CLOSE c_ns;
END
//
--執(zhí)行該存儲過程
mysql call p5(2);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
+--------+-------+--------+
| v_name | v_sex | nodata |
+--------+-------+--------+
| song | 女 | 0 |
+--------+-------+--------+
1 row in set (0.04 sec)
+--------+-------+--------+
| v_name | v_sex | nodata |
+--------+-------+--------+
| dan | 男 | 0 |
+--------+-------+--------+
1 row in set (0.05 sec)
Query OK, 0 rows affected, 1 warning (0.05 sec)
--注意:CONTINUE 會繼續(xù)當(dāng)前的block 中的語句, 它在set done=1 后繼續(xù)執(zhí)行下一個語句。EXIT 則在 set done=1 后離開當(dāng)前的語句塊
所以這里用了EXIT(黃色陰影部分).
如果是continue,結(jié)果如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
mysql call p5(2);
- //
+--------+-------+
| v_name | v_sex |
+--------+-------+
| song | 女 |
+--------+-------+
1 row in set (0.00 sec)
+--------+-------+
| v_name | v_sex |
+--------+-------+
| dan | 男 |
+--------+-------+
1 row in set (0.01 sec)
+--------+-------+
| v_name | v_sex |
+--------+-------+
| dan | 男 |
+--------+-------+
1 row in set (0.02 sec)
Query OK, 0 rows affected, 1 warning (0.03 sec)
給你一個 參考,自己套著 試吧
--存儲過程名和參數(shù),參數(shù)中in表示傳入?yún)?shù),out標(biāo)示傳出參數(shù),inout表示傳入傳出參數(shù)
create procedure p_procedurecode(in sumdate varchar(10))
begin
declare v_sql varchar(500); --需要執(zhí)行的SQL語句
declare sym varchar(6);
declare var1 varchar(20);
declare var2 varchar(70);
declare var3 integer;
--定義游標(biāo)遍歷時,作為判斷是否遍歷完全部記錄的標(biāo)記
declare no_more_departments integer DEFAULT 0;
--定義游標(biāo)名字為C_RESULT
DECLARE C_RESULT CURSOR FOR
SELECT barcode,barname,barnum FROM tmp_table;
--聲明當(dāng)游標(biāo)遍歷完全部記錄后將標(biāo)志變量置成某個值
DECLARE CONTINUE HANDLER FOR NOT FOUND
SET no_more_departments=1;
set sym=substring(sumdate,1,6); --截取字符串,并將其賦值給一個遍歷
--連接字符串構(gòu)成完整SQL語句,動態(tài)SQL執(zhí)行后的結(jié)果記錄集,在MySQL中無法獲取,因此需要轉(zhuǎn)變思路將其放置到一個臨時表中(注意代碼中的寫法)。一般寫法如下:
-- 'Create TEMPORARY Table 表名(Select的查詢語句);
set v_sql= concat('Create TEMPORARY Table tmp_table(select aa as aacode,bb as aaname,count(cc) as ccnum from h',sym,' where substring(dd,1,8)=''',sumdate,''' group by aa,bb)');
set @v_sql=v_sql; --注意很重要,將連成成的字符串賦值給一個變量(可以之前沒有定義,但要以@開頭)
prepare stmt from @v_sql; --預(yù)處理需要執(zhí)行的動態(tài)SQL,其中stmt是一個變量
EXECUTE stmt; --執(zhí)行SQL語句
deallocate prepare stmt; --釋放掉預(yù)處理段
OPEN C_RESULT; --打開之前定義的游標(biāo)
REPEAT --循環(huán)語句的關(guān)鍵詞
FETCH C_RESULT INTO VAR1, VAR2, VAR3; --取出每條記錄并賦值給相關(guān)變量,注意順序
--執(zhí)行查詢語句,并將獲得的值付給一個變量 @oldaacode(注意如果以@開頭的變量可以不用通過declare語句事先聲明)
select @oldaacode:=vcaaCode from T_sum where vcaaCode=var1 and dtDate=sumdate;
if @oldaacode=var1 then --判斷
update T_sum set iNum=var3 where vcaaCode=var1 and dtDate=sumdate;
else
insert into T_sum(vcaaCode,vcaaName,iNum,dtDate) values(var1,var2,var3,sumdate);
end if;
UNTIL no_more_departments END REPEAT; --循環(huán)語句結(jié)束
CLOSE C_RESULT; --關(guān)閉游標(biāo)
DROP TEMPORARY TABLE tmp_table; --刪除臨時表
end;