MYSQL 存储过程将多个结果替换为一个参数:结果由多行组成

MYSQL store procedure replace multiple results into one parameter: Result consisted of more than one row

我必须编写一个存储过程 MYSQL 从表中获取数据,以便每天使用通知模板向所有客户发送有关汇率的通知。

  1. 客户
customerCode | name | nationCode
0000001      | A    | VNM
0000002      | B    | CNH
  1. SYSTEM_NATION
id | nationCode | ccy
1  | VNM         | VND
2  | CNH         | CNY
  1. EXCHANGE_RATE
id | ccyFrom | ccyTo | rate 
1 |  JPY     | VND  | 0.1
2 |  JPY     | CNY  | 0.3

4.NOTIFICATION_TOKEN

id | customerCode | tokenId 
1  | 0000001      | tokenExample1
2  | 0000002      | tokenExample2

现在我想获取数据,以便为每个与 nationCode 对应的客户发送每日费率通知,文本格式如下:

  Exchange rate: 1 JPY = {noti}exchangeRate{noti} {noti}varNotiCCYTo{noti}.

我预计

客户 0000001

Exchange rate: 1 JPY = 0.1 VND.

客户 0000002

Exchange rate: 1 JPY = 0.3 CNY.

我有从上面提到的表中获取数据的存储过程

DELIMITER $$
USE `gojp`$$
CREATE PROCEDURE `NotiGetExchangeRateEveryDay`()

DECLARE     varNotiBODY nVarchar (9000);
DECLARE     varNotiCCYTo nvarchar(3);
DECLARE     varNotiExchangeRate Numeric (30,2);

###########################
#IMPORTANT: when I call this procedure, it responses 

    #Error Code: 1172. Result consisted of more than one row

#I think problem in this query: 

*select ex.ccyTo, ex.rate into varNotiCCYTo, varNotiExchangeRate from CUSTOMER cus
inner join SYSTEM_NATION sys on cus.nationCode= sys.nationCode 
inner join EXCHANGE_RATE ex on ex.ccyTo = sys.ccy;*
##########################

set varNotiBODY = (SELECT REPLACE(varNotiBODY, '{noti}exchangeRate{noti}', ifnull(varNotiExchangeRate,'')) from dual);
set varNotiBODY = (SELECT REPLACE(varNotiBODY, '{noti}varNotiCCYTo{noti}', ifnull(varNotiCCYTo,'')) from dual);


After that I want to insert all this table to get list of notification was sent.
INSERT INTO `gojp`.`NOTIFICATION_QUEUE` 
(`customerCode`,
`deviceID`,
`ntfBody`,
`createdDate`
) 
select 
noti.customerCode, 
noti.tokenId, 
varNotiBODY, 
now()
from NOTIFICATION_TOKEN noti 
inner join CUSTOMER cus on noti.customerCode = cus.customerCode;

END$$
DELIMITER ;

我想获取每个客户的汇率数据,然后替换成{noti}exchangeRate{noti}。但是,它 returns 多个结果,所以我不能只插入一个参数。

所以,谁能给我一个解决方案?

为什么不直接用单插入来做:

INSERT INTO `gojp`.`NOTIFICATION_QUEUE` 
(`customerCode`,
`deviceID`,
`ntfBody`,
`createdDate`
) 
select 
  noti.customerCode, 
  concat('Exchange rate: 1 JPY = ',ex.ccyTo,' ', ex.rate,' ', sys.ccy,'.'),
  now()
from NOTIFICATION_TOKEN noti 
  join CUSTOMER cus on noti.customerCode = cus.customerCode
  join SYSTEM_NATION sys on cus.nationCode= sys.nationCode 
  join EXCHANGE_RATE ex on ex.ccyTo = sys.ccy