【问题标题】:MYSQL store procedure replace multiple results into one parameter: Result consisted of more than one rowMYSQL存储过程将多个结果替换为一个参数:结果由多于一行组成
【发布时间】:2021-04-01 18:00:40
【问题描述】:

我必须编写一个存储过程 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}。但是,它返回多个结果,所以我不能只插入一个参数。

那么,谁能给我一个解决方案?

【问题讨论】:

    标签: mysql replace procedure


    【解决方案1】:

    为什么不直接插入:

    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
    

    【讨论】:

    • 太棒了!!!我做到了。我想知道为什么我没有简单地思考^^。无论如何,非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-04
    • 1970-01-01
    • 2014-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多