mysql存储过程动态执行SQL

CREATE PROCEDURE feeMonth(in fmark varchar(200),in fuser char(32),in ftime BIGINT,in fmonth char(6))
BEGIN
    #定义SQL变量
    declare create_sql varchar(100);
    declare sel_sql varchar(100);
    declare del_sql varchar(100);
    declare fmon varchar(100);
    #定义表名变量
    declare tableName varchar(30);
    #判断是否全部遍历记录的标记
    declare i int default 0;
    #定义游标  名字为month_cursor
    declare month_cursor CURSOR for select table_name from data_import_config;
    #当游标遍历完成后将标记变成某个值
    declare CONTINUE HANDLER for not found set i=1;
    set create_sql=‘create table ‘;
    set sel_sql=‘ as select * from ‘;
    set del_sql=‘delete from ‘;
    set fmon=CONCAT(‘_‘,fmonth);

    #打开游标
    open month_cursor;
    REPEAT
        #取出每条记录付给相关变量
            FETCH month_cursor into tableName;    

            set @c_sql= CONCAT(create_sql,tableName,fmon,sel_sql,tableName);
            set @d_sql= CONCAT(del_sql,tableName);
            PREPARE pre_c_sql from @c_sql;
            PREPARE pre_d_sql from @d_sql;
            EXECUTE pre_c_sql;
            EXECUTE    pre_d_sql;
            deallocate prepare pre_c_sql;
            deallocate prepare pre_d_sql;
    #关闭游标
    until i end REPEAT;
    close month_cursor;

    update fee_month set mark=fmark,user_id=fuser,time=ftime,flag=‘1‘ where month=fmonth;
    insert into fee_month (month,flag) values (CASE WHEN (SUBSTR(fmonth,5,2)+1)>12 THEN CONCAT(SUBSTR(fmonth,1,4)+1,‘01‘) WHEN (SUBSTR(fmonth,5,1)+1)<=12 THEN (fmonth+1) END ,‘0‘);
    insert into fee_collect(month,ORGANIZE_ID,pre_fee,user_fee,sys_fee,tmp_fee) select f.month,f.ORGANIZE_ID,f.pre_fee,f.user_fee,f.sys_fee,f.tmp_fee from fee_collect_cur as f;
    delete from fee_collect_cur;
    insert into fee_collect_cur (month,ORGANIZE_ID,pre_fee) select (CASE WHEN (SUBSTR(fmonth,5,2)+1)>12 THEN CONCAT(SUBSTR(fmonth,1,4)+1,‘01‘) WHEN (SUBSTR(fmonth,5,1)+1)<=12 THEN (fmonth+1) END),f.ORGANIZE_ID,(f.pre_fee+f.user_fee+f.tmp_fee-f.sys_fee) from fee_collect as f WHERE (f.pre_fee+f.user_fee+f.tmp_fee-f.sys_fee)!=0;
END

声明一下是有参考别人的。

在写这个SQL的时候一定要注意:

自定义的变量一定不能喝数据库中的字段重名!!

mysql存储过程动态执行SQL

时间: 2024-12-13 16:19:23

mysql存储过程动态执行SQL的相关文章

mysql 存储过程动态拼接sql并执行赋值

CREATE DEFINER = CURRENT_USER PROCEDURE `NewProc`(in _xnb varchar(50)) BEGIN ## 定义变量 DECLARE _num FLOAT(14,6) DEFAULT 0; ## @表示全局变量 相当于php $ ## 拼接赋值 INTO 必须要用全局变量不然语句会报错 SET @strsql = CONCAT('SELECT SUM(',_xnb,') INTO @tnum FROM btc_user_coin'); ## 预

MySQL-存储过程动态执行sql

存储过程动态执行sql --存储过程名和参数,参数中in表示传入参数,out标示传出参数,inout表示传入传出参数 create procedure p_procedurecode(in sumdate varchar(10)) begin declare v_sql varchar(500); --需要执行的SQL语句 declare sym varchar(6); declare var1 varchar(20); declare var2 varchar(70); declare var

MySQL之视图、存储过程、触发器、函数、事务、动态执行SQL

视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,并可以将其当作表来使用. 创建视图: create view v1 as select * from student where id > 100; 今后可以直接通过: select * from v1;   #直接访问学生ID大于100的信息 删除视图: drop view v1; 修改视图: alter view v1 as select id,name f

存储过程中动态执行SQL并获取返回结果

很久没有写存储过程了,因为存储过程违背OOP精神,话说带了参数的存储过程,如果业务需求改变,改存储过程还真的挺麻烦的.所以现在比较倾向于负责的业务逻辑在业务层去处理,业务层专门做业务层的事情. 通过一层巧妙地包装,动态执行SQL语句就解决了 ALTER procedure [dbo].[PROC_NextSteps] ( @Count int, @IDS NVARCHAR(500), @Rules NVARCHAR(MAX), @IDSOut NVARCHAR(500) OUT ) as BEG

动态执行Sql

动态执行sql语句,把存储过程灵活的运用起来 1 delimiter $$ 2 drop procedure if exists proc $$ 3 create procedure proc(in StrSql varchar(128) , in nid int ) 4 begin 5 set @id = nid; 6 set @ssql = StrSql; 7 create prod from @ssql; 8 execute prod using @id; 9 deallocate pre

mysql数据库批量执行sql文件对数据库进行操作【windows版本】

起因: 因工作需要,在本机测试环境升级mysql数据库,需逐条执行mysql数据库的sql文件对数据库进行升级,因此找了些关于mysql的文章,对批量升级数据库所需的sql文件进行升级. 整理思路: 首先,需要对所需升级的sql所在目录的sql文件进行遍历.生成新的批量执行sql文件.想到是windows系统安装的mysql,首先想到使用bat进行sql文件的生成: 生成sql文件后,还需要使用bat文件连接到数据库,并使用新生成的sql文件进行升级. 想到升级的过程中还有可能字符集出现问题,因

MySQL存储过程实现动态执行SQL

--存储过程名和参数,参数中in表示传入参数,out标示传出参数,inout表示传入传出参数 create procedure p_procedurecode(in sumdate varchar(10)) begin declare v_sql varchar(500); --需要执行的SQL语句 declare sym varchar(6); declare var1 varchar(20); declare var2 varchar(70); declare var3 integer; -

关于动态执行sql语句出现

如例: DECLARE @sql NVARCHAR(max); DECLARE @longid BIGINT =100; SET @sql='select '+@longid; 执行之后提示  从数据类型 varchar 转换为 bigint 时出错. 刚开始以为是要输出bigint类型,但是sql动态执行无法识别,于是改成了 SET @sql='select '+CONVERT(BIGINT,@longid); 但是还是报同样的错误,后面试用这种方法就没有问题了 SET @sql='selec

PL/SQL(五)PL/SQL中动态执行SQL语句

在PL/SQL程序开发中,可以使用DML语句和事务控制语句,但是还有很多语句(比如DDL语句)不能直接在PL/SQL中执行.这些语句可以使用动态SQL来实现. PL/SQL块先编译然后再执行,动态SQL语句在编译时不能确定,只有在程序执行时把SQL语句作为字符串的形式由动态SQL命令来执行.在编译阶段SQL语句作为字符串存在,程序不会对字符串中的内容进行编译,在运行阶段再对字符串中的SQL语句进行编译和执行,动态SQL的语法是: 语法格式:动态SQL EXECUTE IMMEDIATE 动态语句