mysql存儲過程執行ddl語句


根據業務需要,需要在存儲過程自動創建表

CREATE PROCEDURE parameter_split(in table_name VARCHAR(30),in start_time BIGINT(16),in end_time BIGINT(16))
BEGIN
        -- 得到時間
        DECLARE table_year VARCHAR(5);
        DECLARE table_month VARCHAR(3);
        DECLARE table_day VARCHAR(3);
        -- 按開始時間設置年月日,並補齊單月為 05
        SET table_year = YEAR(FROM_UNIXTIME(start_time/1000));
        SET table_month = MONTH(FROM_UNIXTIME(start_time/1000));
        SET table_day = DAY(FROM_UNIXTIME(start_time/1000));

        IF table_month < 10 THEN 
                SET table_month = CONCAT("0",table_month);
                SELECT table_month;
        END IF;
        IF table_day < 10 THEN 
                SET table_day = CONCAT("0",table_day);
                    SELECT table_day;
        END IF;
        -- 設置表名
      SET table_name = CONCAT(table_name,table_year,table_month,table_day);
        -- 創建表語句
        IF table_name="t_sg_electric_meter_parameter_data" THEN
                SET @creat_parameter_table_sql = CONCAT("CREATE TABLE IF NOT EXISTS ",table_name,
                                                            " (`id` int(11) NOT NULL auto_increment,",
                                                            "`data_type` varchar(255) default NULL,",
                                                            "`freq` double default NULL,",
                                                            "`lineVoltage_A` double default NULL,",
                                                            "`lineVoltage_B` double default NULL,",
                                                            " `lineVoltage_C` double default NULL,",
                                                            "`phaseCurrent_A` double default NULL,",
                                                            "`phaseCurrent_B` double default NULL,",
                                                            "`phaseCurrent_C` double default NULL,",
                                                            " `phaseVoltage_A` double default NULL,",
                                                            "`phaseVoltage_B` double default NULL,",
                                                            "`phaseVoltage_C` double default NULL,",
                                                            "`timestamp` datetime default NULL,",
                                                            "`electric_meter_id` int(11) default NULL,",
                                                            "`timestamp_long` bigint(14) default NULL,",
                                                            "PRIMARY KEY  (`id`),",
                                                            "KEY `FK_6xa5d3kb1j2cnhw4skdg9nlq9` (`electric_meter_id`),",
                                                            "KEY `index_name` (`timestamp_long`),",
                                                            "FOREIGN KEY (`electric_meter_id`) REFERENCES `t_sg_electric_meter` (`id`)",
                                                            ") ENGINE=InnoDB AUTO_INCREMENT=5184520 DEFAULT CHARSET=utf8;"
                                                            );
                -- 創建插入語句
                SET @insert_data_sql = CONCAT("INSERT INTO ",table_name," (data_type,freq,lineVoltage_A,lineVoltage_B,lineVoltage_C,phaseCurrent_A,phaseCurrent_B,",
                                                                        "phaseCurrent_C,phaseVoltage_A,phaseVoltage_B,phaseVoltage_C,timestamp,electric_meter_id,timestamp_long) SELECT data_type,freq,lineVoltage_A,lineVoltage_B,lineVoltage_C,phaseCurrent_A,phaseCurrent_B,",
                                                                            "phaseCurrent_C,phaseVoltage_A,phaseVoltage_B,phaseVoltage_C,timestamp,electric_meter_id,timestamp_long from t_sg_electric_meter_parameter_data WHERE timestamp_long BETWEEN ",
                                                                            start_time," AND ",end_time);
                -- 創建刪除數據的語句
                SET @delete_data_sql = CONCAT("DELETE FROM t_sg_electric_meter_parameter_data WHERE timestamp_long BETWEEN ",start_time," AND ",end_time);
        ELSEIF table_name="t_sg_electric_meter_demand_data" THEN
                SET @creat_demand_table_sql = CONCAT("CREATE TABLE IF NOT EXISTS ",table_name,
                                                            " (`id` int(11) NOT NULL auto_increment,",
                                                            "`active_demand` double default NULL,",
                                                            "data_type` varchar(255) default NULL,",
                                                            "`reactive_demand` double default NULL,",
                                                            "`timestamp` datetime default NULL,",
                                                            "`total_demand` double default NULL,",
                                                            "`electric_meter_id` int(11) default NULL,",
                                                            "`timestamp_long` bigint(14) default NULL,",
                                                            "PRIMARY KEY  (`id`),",
                                                            "KEY `index_electric_meter_id` (`electric_meter_id`),",
                                                            "KEY `index_timestamp_long` (`timestamp_long`),",
                                                            "FOREIGN KEY (`electric_meter_id`) REFERENCES `t_sg_electric_meter` (`id`)",
                                                            ") ENGINE=InnoDB AUTO_INCREMENT=2017227 DEFAULT CHARSET=utf8;"
                                                            );

        END IF;
        -- 執行創建表語句
        PREPARE c_day_stmt FROM @creat_table_sql;
        EXECUTE c_day_stmt;
        -- 執行插入數據語句
        PREPARE i_parameter_day_stmt FROM @insert_data_sql;
        EXECUTE i_parameter_day_stmt;
        -- 執行刪除語句
        PREPARE d_parameter_day_stmt FROM @delete_data_sql;
        EXECUTE d_parameter_day_stmt;
END;

此處需要注意的地方就是

  1、PREPARE c_day_stmt FROM @creat_table_sql;  FROM后邊只能跟上用戶變量。

  2、還有一個問題是從navicat張貼過來的DDL語句是不正確的。這里是針對mysql

      

CREATE TABLE `parameter20170228` (
  `id` int(11) NOT NULL auto_increment,
  `data_type` varchar(255) default NULL,
  `freq` double default NULL,
  `lineVoltage_A` double default NULL,
  `lineVoltage_B` double default NULL,
  `lineVoltage_C` double default NULL,
  `phaseCurrent_A` double default NULL,
  `phaseCurrent_B` double default NULL,
  `phaseCurrent_C` double default NULL,
  `phaseVoltage_A` double default NULL,
  `phaseVoltage_B` double default NULL,
  `phaseVoltage_C` double default NULL,
  `timestamp` datetime default NULL,
  `electric_meter_id` int(11) default NULL,
  `timestamp_long` bigint(14) default NULL,
  PRIMARY KEY  (`id`),
  KEY `FK_6xa5d3kb1j2cnhw4skdg9nlq9` (`electric_meter_id`),
  KEY `index_name` (`timestamp_long`),
  CONSTRAINT `parameter20170228_ibfk_1` FOREIGN KEY (`electric_meter_id`) REFERENCES `t_sg_electric_meter` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5335200 DEFAULT CHARSET=utf8;

這一段是copy的DDL語句,然而,這樣直接運行是不行的,需要把" CONSTRAINT `parameter20170228_ibfk_1` FOREIGN KEY (`electric_meter_id`) REFERENCES `t_sg_electric_meter` (`id`)  "。

開頭的  CONSTRAINT `parameter20170228_ibfk_1` 去除  "FOREIGN KEY (`electric_meter_id`) REFERENCES `t_sg_electric_meter` (`id`) "即可。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM