關於mysql儲存過程建立動態表名及引數處理
最近遊戲開始第二次內測,開始處理操作日誌,最開始把日誌放到同一個表裡面,發現一天時間,平均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