程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> 創建角色隨機名字(mysql抽取隨機記錄)和mysql游標的使用

創建角色隨機名字(mysql抽取隨機記錄)和mysql游標的使用

編輯:MySQL綜合教程

創建角色隨機名字(mysql抽取隨機記錄)和mysql游標的使用


最近在開發中遇到了一些問題,在此記錄一下解決的方法,已作備忘。

1、現在創建游戲角色的時候,基本上都是支持角色名字隨機的,以前此功能在客戶端用代碼實現,然後向服務器請求並驗證,後來發現有時候連續幾次都失敗,所以改成在服務器實現。實現方法主要考慮使用mysql隨機查詢記錄,在網上查了很多方案,然後用在了我們游戲中。

實現方案是,將所有隨機名字都插入到一張表中,然後從中隨機取一條當前角色表中沒有出現過的名字。

BEGIN		
	DECLARE randnum int DEFAULT 0;
	SELECT FLOOR(RAND() * 309034) INTO randnum;
	SELECT rname INTO _name FROM `names` WHERE ((_sex = sex) AND
		(rname not in (SELECT Name FROM longwen.player WHERE _world = WorldID)) AND
		(id > randnum)) LIMIT 1;
		
	set returnvalue = 0;
END
2、接運營的需求,有時候因為服務器維護,需要給所有玩家送一些東西,這時候涉及離線玩家,所以我們的方案是靜態寫數據庫。

因為對mysql沒有深入研究過,在實踐的過程中發現游標操作只能修改一條數據,後來查了很多資料,還是解決了問題,自己也學到了一點知識,修改後存儲過程如下:

DECLARE _cursor CURSOR FOR 
SELECT RoleID FROM player WHERE (RoleID NOT IN (SELECT roleID FROM email where LENGTH(datas) <> 0)); 
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' set _done = 1;

OPEN _cursor;  
set _done = 0;
REPEAT
	FETCH _cursor into _roleId;
	replace into email(roleID, datas) values(_roleId, 'test');
UNTIL _done END REPEAT;
CLOSE _cursor;
修改前repeat裡面有一條select語句。出現這個問題,主要是對SQLSTATE理解不夠,02000異常有3種條件:

A:SELECT INTO 語句或 INSERT 語句的子查詢的結果為空表。

B:在搜索的 UPDATE 或 DELETE 語句內標識的行數為零。

C:在 FETCH 語句中引用的游標位置處於結果表最後一行之後。

後來把select語句提出去放到游標聲明語句裡面就好了。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved