MYSQL 存储过程将多个结果替换为一个参数:结果由多行组成
MYSQL store procedure replace multiple results into one parameter: Result consisted of more than one row
我必须编写一个存储过程 MYSQL 从表中获取数据,以便每天使用通知模板向所有客户发送有关汇率的通知。
- 客户
customerCode | name | nationCode
0000001 | A | VNM
0000002 | B | CNH
- SYSTEM_NATION
id | nationCode | ccy
1 | VNM | VND
2 | CNH | CNY
- 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
我必须编写一个存储过程 MYSQL 从表中获取数据,以便每天使用通知模板向所有客户发送有关汇率的通知。
- 客户
customerCode | name | nationCode
0000001 | A | VNM
0000002 | B | CNH
- SYSTEM_NATION
id | nationCode | ccy
1 | VNM | VND
2 | CNH | CNY
- 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