在存储过程MB_StatementTrigger_postInsert中存在错误: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 'else
set v_var_salesType_m = v_var_salesType_pl + v_var_salesType_yj + v_var' at line 2
代码是:BEGIN
declare v_company_label VARCHAR(255); /* 所属企业名称*/
declare v_beginDt DATETIME; /* 起始日期*/
declare v_domcmy_id NUMERIC(19, 0); /* 商户注册企业ID*/
declare v_domcmy_label VARCHAR(255); /* 商户注册企业名称*/
declare v_wholesaleRebate NUMERIC(19, 0); /* 商户批零折扣*/declare v_done NUMERIC(19, 0);
declare v_cnt NUMERIC(19, 0);
declare v_statement_id NUMERIC(19, 0);
declare v_stores_id NUMERIC(19, 0); /* 门店ID*/
declare v_stores_label VARCHAR(255); /* 门店名称*/
declare v_salesType NUMERIC(19, 0); /* 销售类型*/
declare v_stor_money NUMERIC(19, 0); /* 门店金额*/
declare v_var_stores_id NUMERIC(19, 0); /* 变量门店ID*/
declare v_var_stores_label VARCHAR(255); /* 变量门店名称*/
declare v_var_salesType_pl NUMERIC(19, 0); /* 变量销售类型中的批零*/
declare v_var_salesType_yj NUMERIC(19, 0); /* 变量销售类型中的佣金*/
declare v_var_salesType_zz NUMERIC(19, 0); /* 变量销售类型中的自主*/
declare v_var_salesType_m NUMERIC(19, 0); /* 变量销售类型金额*/
declare v_stores_done NUMERIC(19, 0);
declare v_stores_cnt NUMERIC(19, 0);declare v_consume NUMERIC(19, 0); /* 结算单消费金额*/
declare v_wholesaleTransfer NUMERIC(19, 0); /* 结算单批零划款总额*/
declare v_commissionTransfer NUMERIC(19, 0); /* 结算单佣金划款总额*/
declare v_wholesaleIncome NUMERIC(19, 0); /* 结算单批零收入*/
declare v_commissionIncome NUMERIC(19, 0); /* 结算单佣金收入*/
declare v_commissionPay NUMERIC(19, 0); /* 结算单佣金支付总额*/
declare v_depositConsume NUMERIC(19, 0); /* 结算单充值消费总额*/
/* 光标 */
declare my_domcpy cursor for 
select id,name,wholesaleRebate
from DYNA_DomainCompany where companyType = 2;
declare continue handler for not found set v_cnt = 1;

/*所属企业名称*/
select name 
from DYNA_DomainCompany where id = v_company_id
into v_company_label;/* 商户注册企业条数 */
select count(id) 
from DYNA_DomainCompany where companyType = 2
into v_cnt;
select max(endDt) 
from DYNA_MB_StatementTrigger where endDt=v_endDt order by id
into v_beginDt;/* 临时表*/
CREATE TEMPORARY TABLE temp_trade (
source_cpy_id NUMERIC(19, 0),
source_cpy_label VARCHAR(255),
stores_id NUMERIC(19, 0),
stores_label VARCHAR(255),
salesType NUMERIC(19, 0),
businessCpy_id NUMERIC(19, 0),
businessCpy_label VARCHAR(255),
money NUMERIC(19, 0)
)TYPE = HEAP;/* 把相应的数据放入临时表*/
insert into temp_trade
(source_cpy_id,source_cpy_label,stores_id,stores_label,salesType,businessCpy_id,businessCpy_label,money)
select b.company_id,b.company_label,a.stores_id,a.stores_label,a.salesType,a.businessCpy_id,a.businessCpy_label,sum(trade_money)
from DYNA_DRP_TradeLog as a,DYNA_DRP_AccountType as b 
where a.trade_time >= v_beginDt and a.trade_time <= v_endDt and a.trade_type = 7
group by b.company_id,b.company_label,a.stores_id,a.stores_label,a.salesType,a.businessCpy_id,a.businessCpy_label;/* 临时表*/
CREATE TEMPORARY TABLE temp_deposit (
target_cpy_id NUMERIC(19, 0),
target_cpy_label VARCHAR(255),
salesType NUMERIC(19, 0),
businessCpy_id NUMERIC(19, 0),
businessCpy_label VARCHAR(255),
money NUMERIC(19, 0)
)TYPE = HEAP;/* 把相应的数据放入临时表*/
insert into temp_deposit
(target_cpy_id,target_cpy_label,salesType,businessCpy_id,businessCpy_label,money)
select b.company_id,b.company_label,a.salesType,a.businessCpy_id,a.businessCpy_label,sum(trade_money)
from DYNA_DRP_TradeLog as a,DYNA_DRP_AccountType as b 
where a.trade_time >= v_beginDt and a.trade_time <= v_endDt and a.trade_type = 1
group by b.company_id,b.company_label,a.businessCpy_id,a.businessCpy_label,a.salesType;
set v_done = 1;/*启动光标*/
OPEN my_domcpy;
domcpy_loop:LOOP
fetch my_domcpy into v_domcmy_id,v_domcmy_label,v_wholesaleRebate;
if v_cnt = 1 then leave domcpy_loop; end if;
set v_statement_id = -1; /*创建结算单*/
insert into DYNA_MB_Statement
(codeNo,company_id,company_label,businessCpy_id,businessCpy_label,beginDt,endDt,statementTrigger_id,statementTrigger_label)
values(CONCAT(v_codeNo,'-',v_done),v_company_id,v_company_label,v_domcmy_id,v_domcmy_label,v_beginDt,v_endDt,v_id,v_codeNo); /*结算单id*/
SELECT LAST_INSERT_ID() into v_statement_id;  /*创建佣金收入结算明细*/
insert into DYNA_MB_StatCommIncome
(businessCpy_id,businessCpy_label,commissionIncome,statementNo_id,statementNo_label)
select a.source_cpy_id,a.source_cpy_label,sum(money),v_statement_id,CONCAT(v_codeNo,'-',v_done)
from temp_trade a where a.businessCpy_id = v_domcmy_id and a.salesType = 2
group by a.source_cpy_id,a.source_cpy_label; /*创建佣金支付结算明细*/
insert into DYNA_MB_StatCommPay
(businessCpy_id,businessCpy_label,commissionPay,statementNo_id,statementNo_label)
select a.businessCpy_id,a.businessCpy_label,sum(money)*(100 -b.commissionRebate),v_statement_id,CONCAT(v_codeNo,'-',v_done)
from temp_trade a,DYNA_DomainCompany b where a.businessCpy_id = b.id and a.source_cpy_id = v_domcmy_id and a.salesType = 2
group by a.businessCpy_id,a.businessCpy_label; /*创建批零收入结算明细*/
insert into DYNA_MB_StatWSaleIncome
(businessCpy_id,businessCpy_label,wholesaleIncome,statementNo_id,statementNo_label)
select a.source_cpy_id,a.source_cpy_label,sum(money)*(100-b.wholesaleRebate),v_statement_id,CONCAT(v_codeNo,'-',v_done)
from temp_trade a,DYNA_DomainCompany b where a.source_cpy_id = b.id and a.businessCpy_id = v_domcmy_id and a.salesType = 1
group by a.source_cpy_id,a.source_cpy_label; begin declare my_statStore cursor for 
select stores_id,stores_label,sum(money),salesType
from temp_trade where source_cpy_id = v_domcmy_id
group by stores_id,stores_label,salesType;
declare continue handler for not found set v_stores_cnt = 1; set v_stores_done = 1;
set v_var_stores_id = -1;
set v_var_salesType_pl = 0;
set v_var_salesType_yj = 0;
set v_var_salesType_zz = 0;
set v_var_salesType_m = 0;
OPEN my_statStore;
statStore_loop:LOOP
fetch my_statStore into v_stores_id,v_stores_label,v_stor_money,v_salesType;
if v_stores_cnt = 1 then leave statStore_loop; end if;
if v_stores_done = 1 then 
set v_var_stores_id = v_stores_id;
set v_var_stores_label = v_stores_label;
end if;
if v_var_stores_id = v_stores_id then
if v_salesType = 1 then
set v_var_salesType_pl = v_stor_money*v_wholesaleRebate;
else if v_salesType = 2 then
set v_var_salesType_yj = v_stor_money;
else
set v_var_salesType_zz = v_stor_money;
end if;

else
set v_var_salesType_m = v_var_salesType_pl + v_var_salesType_yj + v_var_salesType_zz; /*创建门店结算明细*/
insert into DYNA_MB_StatementStore
(stores_id,stores_label,consume,wholesaleTransfer,commissionTransfer,depositConsume,statementNo_id,statementNo_label)
values(v_var_stores_id,v_var_stores_label,v_var_salesType_m,v_var_salesType_pl,v_var_salesType_yj,v_var_salesType_zz,v_statement_id,CONCAT(v_codeNo,'-',v_done));
set v_var_stores_id = v_stores_id;
set v_var_salesType_pl = 0;
set v_var_salesType_yj = 0;
set v_var_salesType_zz = 0;
end if;
set v_stores_done = v_stores_done +1;
end LOOP statStore_loop;
close my_statStore;
end;
/*创建充值结算明细*/
insert into DYNA_MB_StatDeposit
(businessCpy_id,businessCpy_label,depositMoney,salesType,statementNo_id,statementNo_label)
select a.target_cpy_id,a.target_cpy_label,sum(a.money),a.salesType,v_statement_id,CONCAT(v_codeNo,'-',v_done)
from temp_deposit a where a.target_cpy_id = v_domcmy_id; /*结算单门店消费金额 */
select sum(consume),sum(wholesaleTransfer),sum(commissionTransfer),sum(depositConsume)
from DYNA_MB_StatementStore where statementNo_id = v_statement_id
into v_consume,v_wholesaleTransfer,v_commissionTransfer,v_depositConsume;
/*结算单批零收入 */
select sum(wholesaleIncome)
from DYNA_MB_StatWSaleIncome where statementNo_id = v_statement_id
into v_wholesaleIncome;
/*结算单佣金收入 */
select sum(commissionIncome)
from DYNA_MB_StatCommIncome where statementNo_id = v_statement_id
into v_commissionIncome;
/*结算单佣金支付 */
select sum(commissionPay)
from DYNA_MB_StatCommPay where statementNo_id = v_statement_id
into v_commissionPay; /*修改结算单金额数据*/
update DYNA_MB_Statement 
set consume = v_consume,wholesaleTransfer = v_wholesaleTransfer,commissionTransfer = v_commissionTransfer,depositConsume  = v_depositConsume
,wholesaleIncome = v_wholesaleIncome,commissionIncome = v_commissionIncome,commissionPay = v_commissionPay 
where id = v_statement_id; set v_done = v_done +1; 
end LOOP domcpy_loop;
close my_domcpy;/*删除临时表*/
DROP TABLE temp_trade;
DROP TABLE temp_deposit;END;

解决方案 »

  1.   

    我如果把嵌套的光标去掉,就可以了
    里面的代码到底有什么问题呢///begindeclare my_statStore cursor for  
    select stores_id,stores_label,sum(money),salesType
    from temp_trade where source_cpy_id = v_domcmy_id
    group by stores_id,stores_label,salesType;
    declare continue handler for not found set v_stores_cnt = 1;set v_stores_done = 1;
    set v_var_stores_id = -1;
    set v_var_salesType_pl = 0;
    set v_var_salesType_yj = 0;
    set v_var_salesType_zz = 0;
    set v_var_salesType_m = 0;
    OPEN my_statStore;
    statStore_loop:LOOP
    fetch my_statStore into v_stores_id,v_stores_label,v_stor_money,v_salesType;
    if v_stores_cnt = 1 then leave statStore_loop; end if;
    if v_stores_done = 1 then  
    set v_var_stores_id = v_stores_id;
    set v_var_stores_label = v_stores_label;
    end if;
    if v_var_stores_id = v_stores_id then
    if v_salesType = 1 then
    set v_var_salesType_pl = v_stor_money*v_wholesaleRebate;
    else if v_salesType = 2 then
    set v_var_salesType_yj = v_stor_money;
    else
    set v_var_salesType_zz = v_stor_money;
    end if;else
    set v_var_salesType_m = v_var_salesType_pl + v_var_salesType_yj + v_var_salesType_zz;/*创建门店结算明细*/
    insert into DYNA_MB_StatementStore
    (stores_id,stores_label,consume,wholesaleTransfer,commissionTransfer,depositConsume,statementNo_id,statementNo_label)
    values(v_var_stores_id,v_var_stores_label,v_var_salesType_m,v_var_salesType_pl,v_var_salesType_yj,v_var_salesType_zz,v_statement_id,CONCAT(v_codeNo,'-',v_done));
    set v_var_stores_id = v_stores_id;
    set v_var_salesType_pl = 0;
    set v_var_salesType_yj = 0;
    set v_var_salesType_zz = 0;
    end if;
    set v_stores_done = v_stores_done +1;
    end LOOP statStore_loop;
    close my_statStore;
    end;
      

  2.   

    if v_var_stores_id = v_stores_id then
    if v_salesType = 1 then
    set v_var_salesType_pl = v_stor_money*v_wholesaleRebate;
    else if v_salesType = 2 then
    set v_var_salesType_yj = v_stor_money;
    else
    set v_var_salesType_zz = v_stor_money;
    end if;只有一个 end if;?
      

  3.   

    if v_var_stores_id = v_stores_id then
    if v_salesType = 1 then
    set v_var_salesType_pl = v_stor_money*v_wholesaleRebate;
    else if v_salesType = 2 then
    set v_var_salesType_yj = v_stor_money;
    else
    set v_var_salesType_zz = v_stor_money;
    end if;else
    set v_var_salesType_m = v_var_salesType_pl + v_var_salesType_yj + v_var_salesType_zz;/*创建门店结算明细*/
    insert into DYNA_MB_StatementStore
    (stores_id,stores_label,consume,wholesaleTransfer,commissionTransfer,depositConsume,statementNo_id,statementNo_label)
    values(v_var_stores_id,v_var_stores_label,v_var_salesType_m,v_var_salesType_pl,v_var_salesType_yj,v_var_salesType_zz,v_statement_id,CONCAT(v_codeNo,'-',v_done));
    set v_var_stores_id = v_stores_id;
    set v_var_salesType_pl = 0;
    set v_var_salesType_yj = 0;
    set v_var_salesType_zz = 0;
    end if;
      

  4.   

    嘿嘿..自己解决了..原因是if 语句中不能嵌套if语句...
      

  5.   

    IF 中可以嵌套啊。IF .... THEN
      IF .... THEN
      
      END IF
    END IF