网站建设知识
mysql批处理sql文件
2025-07-22 10:01  点击:0

一、mysql中的delimiter

我们一般在写sql脚本时,是不会用到delimiter的,一般情况下也用不到他具体的作用。delimiter的作用:告诉MySQL解释器,该段命令是否已经结束了,MySQL数据库是否可以执行了。我们一般是以分号;结尾一条sql,而delimiter的默认值也是;。当我们在mysql命令行敲完一段sql语句之后,在加上分号点击回车就能执行这条sql。但是当我们需要输入一个存储过程的时候,命令行就不管用了?非也,此时就需要用到delimiter来定义结束标志。为什么要讲这段内容呢,因为我们使用批处理执行sql文件时都是在客户端用命令行执行的,一旦sql文件中包含存储过程或者函数之类的,就位报各种奇葩错误。
另外delimiter作用范围需要注意一下,他作用于客户端session级别,即你断开客户端之后下次再登录时又会恢复到默认值分号。

二、批处理语法与实例

总的批处理命令:

source C:/Users/dstn/Desktop/数据迁移/脚本/00-batch_operate.sql

实例:
现在有8个sql文件,里面包含了存储过程以及一般的sql语句,为了避免一个个单独执行,我们整理一个批处理文件。注意斜杠和乱码问题,斜杠就是/,乱码可以将客户端的编码调成utf-8。

-- 查看当前配置的编码show variables like ‘character_set_%’;-- 修改为utf8set names utf8;-- 等同于如下:set character_set_client=utf8;set character_set_results=utf8;set character_set_connection=utf8;

用于执行批处理的文件:00-batch_operate.sql

delimiter $$-- 可以打印相关的提示信息select sysdate() as 1_application from dual $$source C:/Users/dstn/Desktop/数据迁移/脚本/1-application.sqlselect sysdate() as 2_application_batch from dual $$source C:/Users/dstn/Desktop/数据迁移/脚本/2-application-batch.sqlselect sysdate() as 3_tc_product from dual $$source C:/Users/dstn/Desktop/数据迁移/脚本/3-tc_product.sqlselect sysdate() as 4_PRO_tc_product_queryattr from dual $$source C:/Users/dstn/Desktop/数据迁移/脚本/4-PRO_tc_product_queryattr.sqlselect sysdate() as 5_PRO_tc_product_json from dual $$source C:/Users/dstn/Desktop/数据迁移/脚本/5-PRO_tc_product_json.sqlselect sysdate() as 6_tc_intent_user from dual $$source C:/Users/dstn/Desktop/数据迁移/脚本/6-tc_intent_user.sqlselect sysdate() as 7_product_cycle_status from dual $$source C:/Users/dstn/Desktop/数据迁移/脚本/7-product_cycle_status.sqlselect sysdate() as 8_tc_log from dual $$source C:/Users/dstn/Desktop/数据迁移/脚本/8-tc_log.sql

下面再举一个其中的sql文件:1-application.sql

DROP PROCEDURE IF EXISTS `ta_application_all`;CREATE PROCEDURE `ta_application_all`(in productCodeTemp VARCHAR(20))BEGIN     DECLARE applyCode VARCHAR(20);     DECLARE done INT DEFAULT FALSE;     DECLARE cur CURSOR FOR select distinct(appl_code) from tjs_dev.ta_application_detail WHERE `key` = 'productCode' and `VALUE` = productCodeTemp;          DECLARE ConTINUE HANDLER FOR NOT FOUND SET done = TRUE;     OPEN cur;     LOOP_LABLE:loop        FETCH cur INTO applyCode;if done THEN    LEAVE LOOP_LABLE;END IF;Insert into tjfae_dev.ta_application (APPL_CODE,APPL_NAME,TYPE,STAGE,`STATUS`,OPERATOR,MEMO,IS_DELETE,GMT_CREATE,GMT_MODIFY,EXCHANGE_ID) select APPL_CODE,APPL_NAME,TYPE,STAGE,`STATUS`,OPERATOR,MEMO,IS_DELETE,GMT_CREATE,GMT_MODIFY,EXCHANGE_ID from tjs_dev.ta_application where APPL_CODE=applyCode;end LOOP;CLOSE cur;END;$$