以下是我写的一个动态创建表名的存储过程,总共带三个参数,当不带后面两个参数时是正确的,但我加两个参数后就会报这个错误:
[SQL] CALL CREATE_table("sa2","2011-09-01","2011-09-30")[Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'BY run_id ,prcs_id)' at line 2
帮忙检查下错误出现在哪。
存储过程如下:DROP PROCEDURE IF EXISTS `Create_table`;
CREATE PROCEDURE Create_table(IN tableName VARCHAR(50),date1 date,date2 date)
BEGIN
SET @sqlcmd = CONCAT('CREATE TABLE ', tableName, ' (id2 int NOT NULL AUTO_INCREMENT, PRIMARY KEY (`id2`))','(SELECT a.run_id,c.run_name,c.flow_id,a.prcs_id , a.user_id,b.user_name,a.prcs_flag,c.end_time, a.DELIVER_TIME,d.del_flag FROM flow_run_prcs a left JOIN `user` b ON a.user_id=b.user_id left JOIN flow_run c ON a.run_id=c.run_id left JOIN flow_run d ON a.run_id=d.run_id
WHERE EXISTS(select 1 from flow_run_prcs f where f.run_id=a.run_id HAVING MAX(prcs_id)<>MIN(prcs_id) AND MIN(prcs_id)=1 ) and d.DEL_FLAG<>1  AND a.DELIVER_TIME>=',date1,' AND a.DELIVER_TIME<=',date2,
'ORDER BY run_id ,prcs_id)'
);
PREPARE stmt FROM @sqlcmd;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END;
CALL CREATE_table("sa2","2011-09-01","2011-09-30")这样写就不会出错:
DROP PROCEDURE IF EXISTS `newtable`;
CREATE PROCEDURE `newtable`(IN tname varchar(64))
BEGIN
SET @sqlcmd = CONCAT('CREATE TABLE ', tname, ' (id2 int NOT NULL AUTO_INCREMENT, PRIMARY KEY (`id2`))
(
SELECT a.run_id,c.run_name,c.flow_id,a.prcs_id , a.user_id,b.user_name,a.prcs_flag,c.end_time, a.DELIVER_TIME,d.del_flag FROM flow_run_prcs a left JOIN `user` b ON a.user_id=b.user_id left JOIN flow_run c ON a.run_id=c.run_id left JOIN flow_run d ON a.run_id=d.run_id
WHERE EXISTS(select 1 from flow_run_prcs f where f.run_id=a.run_id HAVING MAX(prcs_id)<>MIN(prcs_id) AND MIN(prcs_id)=1 ) and d.DEL_FLAG<>1 ORDER BY run_id ,prcs_id)');
PREPARE stmt FROM @sqlcmd;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END;
call newtable('abcde');注明:MYSQL数据库

解决方案 »

  1.   

    CREATE PROCEDURE Create_table(IN tableName VARCHAR(50),date1 date,date2 date)
    BEGIN
    SET @sqlcmd = CONCAT('CREATE TABLE ', tableName, ' (id2 int NOT NULL AUTO_INCREMENT, PRIMARY KEY (`id2`))','(SELECT a.run_id,c.run_name,c.flow_id,a.prcs_id , a.user_id,b.user_name,a.prcs_flag,c.end_time, a.DELIVER_TIME,d.del_flag FROM flow_run_prcs a left JOIN `user` b ON a.user_id=b.user_id left JOIN flow_run c ON a.run_id=c.run_id left JOIN flow_run d ON a.run_id=d.run_id
    WHERE EXISTS(select 1 from flow_run_prcs f where f.run_id=a.run_id HAVING MAX(prcs_id)<>MIN(prcs_id) AND MIN(prcs_id)=1 ) and d.DEL_FLAG<>1  AND a.DELIVER_TIME>=',date1,' AND a.DELIVER_TIME<=',date2,
    'ORDER BY run_id ,prcs_id)'
    );
    select @sqlcmd ;
    PREPARE stmt FROM @sqlcmd;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
    END;
    加上这行,看看SQL语句的实际内容。
      

  2.   


    加上这句依然出现这个错误:
    [SQL] CALL CREATE_table('sa2',"2011-09-01","2011-09-30")[Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'BY run_id ,prcs_id)' at line 2
    帮忙检查下是哪里的错误。
      

  3.   

    如何输出调试,第一次接触MYSQL不是很熟悉
      

  4.   

    CREATE TABLE sa2 (id2 int NOT NULL AUTO_INCREMENT, PRIMARY KEY (`id2`))(SELECT a.run_id,c.run_name,c.flow_id,a.prcs_id , a.user_id,b.user_name,a.prcs_flag,c.end_time, a.DELIVER_TIME,d.del_flag FROM flow_run_prcs a left JOIN `user` b ON a.user_id=b.user_id left JOIN flow_run c ON a.run_id=c.run_id left JOIN flow_run d ON a.run_id=d.run_id
    WHERE EXISTS(select 1 from flow_run_prcs f where f.run_id=a.run_id HAVING MAX(prcs_id)<>MIN(prcs_id) AND MIN(prcs_id)=1 ) and d.DEL_FLAG<>1  AND a.DELIVER_TIME>=2011-09-01 AND a.DELIVER_TIME<=2011-09-30ORDER BY run_id ,prcs_id)
    以上是输出的SQL语句的字符串,根据分析应该是DELIVER_TIME<=2011-09-30ORDER BY run_id ,prcs_id)这里出的问题,30和ORDER之间没有空格,如何输入空格呢
      

  5.   

    改成如下。SET @sqlcmd = CONCAT('CREATE TABLE ', tableName, ' (id2 int NOT NULL AUTO_INCREMENT, PRIMARY KEY (`id2`))','(SELECT a.run_id,c.run_name,c.flow_id,a.prcs_id , a.user_id,b.user_name,a.prcs_flag,c.end_time, a.DELIVER_TIME,d.del_flag FROM flow_run_prcs a left JOIN `user` b ON a.user_id=b.user_id left JOIN flow_run c ON a.run_id=c.run_id left JOIN flow_run d ON a.run_id=d.run_id
    WHERE EXISTS(select 1 from flow_run_prcs f where f.run_id=a.run_id HAVING MAX(prcs_id)<>MIN(prcs_id) AND MIN(prcs_id)=1 ) and d.DEL_FLAG<>1  AND a.DELIVER_TIME>=\'',date1,'\' AND a.DELIVER_TIME<=\'',date2,
    '\' ORDER BY run_id ,prcs_id)'