1. 程式人生 > >關於mysql儲存過程建立動態表名及引數處理

關於mysql儲存過程建立動態表名及引數處理

轉載請註明出處:簾卷西風的專欄(http://blog.csdn.net/ljxfblog) 

最近遊戲開始第二次內測,開始處理操作日誌,最開始把日誌放到同一個表裡面,發現一天時間,平均100玩家線上,操作記錄就超過13萬條,決定拆表,按照日期來儲存日誌,每天的日誌存到一個表裡面,然後定期把老的資料匯出來備份後刪掉。

具體思路是寫日誌的時候,根據當前的時間決定插入到當天的表裡面,如表不存在則建立一個新的表,表名裡面帶上當天的日期。這就涉及到需要在儲存過程裡面動態建立一個跟日期相關的表。mysql不是很熟悉,只會基本的語法,這種高階功能都需要上網查詢,呵呵。

最開始的想法,是想定義一個字串變數,把表名拼好後來建立表,發現建立的表名是定義的變數名,只好重新想辦法。

經過查資料,並試驗了很多次,最後找到了實現的方法,需要先將sql語句拼出來,然後在使用PREPARE來處理就可以了。sql語句如下:

	set @sql_create_table = concat(
	'CREATE TABLE IF NOT EXISTS operrecord_', date_format(curdate(),'%y%m%d'),
	"(
		`oper_id` int(10) NOT NULL AUTO_INCREMENT,
		`oper_role` int(11) NOT NULL, 
		`oper_type` varchar(30) NOT NULL DEFAULT '',
		`oper_content` varchar(1000) NOT NULL DEFAULT '',
		`oper_cls` int(10) NOT NULL DEFAULT '0',
		`oper_date` datetime NOT NULL,
		`oper_serverid` int(11) NOT NULL DEFAULT '1',
		PRIMARY KEY (`oper_id`)
	) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8");
	
	PREPARE sql_create_table FROM @sql_create_table;   
	EXECUTE sql_create_table; 

建立表之後,還需要插入資料,但是insert語句裡面也要使用動態表名,沒辦法還是需要和上面一樣的方法來處理,先拼sql語句,示例如下:(注:rId等是儲存過程傳入的引數)

	set @sql_oper_revcord = concat(
	"INSERT INTO operrecord_", date_format(curdate(),'%y%m%d'), 
	" (`oper_role`, `oper_type`, `oper_content`, `oper_cls`, `oper_serverid`, `oper_date`) 
		values (rId, type, content, cls, serverid, NOW())");

	PREPARE sql_oper_revcord FROM @sql_oper_revcord;   
	EXECUTE sql_oper_revcord; 

執行的時候發現會報錯,找不到rId這個欄位,網上說應該給rId加上引號如('rId')也不行,繼續報錯資料型別不匹配。

想了想,應該把rId這些傳人的引數宣告為區域性引數,再次測試果然成功了,另外需要注意的是表字段在字串裡面需要加上(`xxx`)才行。正確的sql語句如下:

	set @rId = rId, @type = type, @content = content, @cls = cls, @serverid = serverid;
	set @sql_oper_revcord = concat(
	"INSERT INTO operrecord_", date_format(curdate(),'%y%m%d'), 
	" (`oper_role`, `oper_type`, `oper_content`, `oper_cls`, `oper_serverid`, `oper_date`) 
		values (@rId, @type, @content, @cls, @serverid, NOW())");

	PREPARE sql_oper_revcord FROM @sql_oper_revcord;   
	EXECUTE sql_oper_revcord; 

記下這編文章,以作備忘。也希望能幫到其它遇到此問題的同學。

相關推薦

關於mysql儲存過程建立動態引數處理

轉載請註明出處:簾卷西風的專欄(http://blog.csdn.net/ljxfblog) 最近遊戲開始第二次內測,開始處理操作日誌,最開始把日誌放到同一個表裡面,發現一天時間,平均100玩家線上,操作記錄就超過13萬條,決定拆表,按照日期來儲存日誌,每天的日誌存到一個表裡

mysql儲存過程建立臨時,從別的賦值給這個臨時

DELIMITER // CREATE PROCEDURE baseweb.test16() BEGIN     DROP TABLE d;     CREATE TEMPORARY TABLE d(id INT,numbers VARCHAR(50));     INSE

mysql儲存過程--建立以及根據已有的進行分分庫

建立多表的儲存過程 /* -----------------------t_user分表SQL--------------------------------*/ drop PROCEDURE if exists import_user_data; create PROCEDURE

mysql 儲存過程建立呼叫

返回(查詢users表的條數 + 傳入的數字) CREATE DEFINER=`root`@`localhost` PROCEDURE `getcount`(OUT s INT, IN t INT) BEGIN SET @t = (SELECT COUNT(1) FROM users);

MySQL利用自定義函式和儲存過程建立海量,並使用索引優化

昨天學習韓順平老師的視訊時明白了上一章explain的意義,為了自己的聯絡,我學著建立了一個海量表,供自己練習使用。 程式碼如下: #建立表DEPT CREATE TABLE dept( /*部門表*/ deptno MEDIUMINT UN

MySQL儲存過程實現動態執行SQL

  create procedure p_procedurecode(in sumdate varchar(10)) begin      declare v_sql varchar(500);    #需要

powerdesigner 中建立欄位大小

設定powerdesigner 中建立的表名及欄位大小寫格式 因為用powerdesigner 建立表的時候 表明及欄位名使用的都是小寫,所以生成的腳步表名和列名都加上的雙引號。 解決方式有以下幾種: 1/在powerdesigner裡的表名和欄位名都用大寫,建表的指令碼就不會有“”了。 

Mysql 儲存過程批量建

CREATE DEFINER=`root`@`%` PROCEDURE `createTables`()  begin     declare i int;     declare suffix varchar(20);     declare createsql varchar(2048);     set

MySQL儲存過程動態行轉列

轉載:http://segmentfault.com/a/1190000004314724?ref=myread MySQL儲存過程中使用動態行轉列 最近做專案關於資料報表處理,然而資料庫儲存格式和報表展現形式不同,需要進行一下行轉列的操作,在做上一個專案的時候也看

mysql儲存過程執行動態sql語句並返回值

Java程式碼 set @sql=’xxx’; prepare stmt from @sql; execute stmt; deallocate prepare stmt; select @curd1; set @sql=’xxx’; prepare stmt f

mysql儲存過程動態SQL內獲取返回值

MySql通用分頁儲存過程 過程引數 p_cloumns varchar(500),p_tables varchar(100),p_where varchar(4000),p_order varchar(100),p_pageindex int,p_pagesize int

mysql儲存過程接收動態sql返回值

一、今天需要用到mysql儲存過程接受動態sql的返回值,特此做以下記錄 二、具體如下 -- BS追加公能欄位 獲取型別和公能分組ID declare vPartName,vType,vSql,vId varchar(100); declare vPartGroupId i

mysql 儲存過程 執行動態sql

使用mysql的儲存過程執行動態sql語句 delimiter // create procedure proce2(in old varchar(100), in newT varchar(1

mysql儲存過程動態SQL內獲取返回值

DROPPROCEDUREIFEXISTS stat_cube.sp_get_end_date;CREATEPROCEDURE stat_cube.`sp_get_end_date`( p_sp_name varchar(50), out p_ret_date date )BEGINdeclare src_1

MySQL儲存過程(格式,變數,引數,流程控制...)

儲存過程 其實就是mysql語句組成的指令碼,也就是資料庫中儲存的一系列SQL命令的集合。 可以使用變數,條件判斷,流程控制等 優點 提高效能 減輕網路負擔 可以防止對錶的直接訪問 避免重複編寫SQL操作

mysql儲存過程中使用select count(*) into 變數 from ++ where條件的用法

select count(*) into v_count from dual where userid=2;此語句的意思就是根據where條件查詢dual表,得到的行數存入變數v_count中(給變數賦值) 只能在儲存過程中編寫這樣的語句?如果在mysql的sql語句中編寫

Oracle 儲存過程中執行動態SQL,動態

create or replace procedure mw_sys.clearrubbishdatefy2 is type table_type is table of mw_app.mwt_ud_yscsjdl.tablename%type; tablenameAr

解決 mysql 儲存過程查詢資料方式是變數拼接的寫法

需求: 用儲存過程查詢動態表名的資料 遇到問題: 查詢語句 from後面不能直接用引數查詢 MYSQL不支援直接使用變數做表名,會把引數名當做表名查詢,報錯 解決方法: 把查詢語句和變數通過concat連線付給變數。通過執行變數來執行此語句 sql程式碼:

MYSQL儲存過程 使用變數

DECLARE NEWNAME VARCHAR(50); SET NEWNAME = CONCAT('TB_BACK_EAT_',DATE_FORMAT(NOW(),'%Y%m%d')); SET @SQLSTR = CONCAT('ALTER TABLE `TB_BA

mysql儲存過程批量建立

要求:每個月建立一張表,格式為xxxx_yyyymm. 以下例子從202101建立到203012 . DELIMIT