如何用原生查询按条件分批返回10行数据?该查询能否转存为存储过程?
问题解答
1. 原生查询实现需求
完全可以通过原生查询实现,你给出的SQL语句本身就是标准的原生查询写法:
select * from tbl_bank_customer_accounts where uid in ('05b6864b-ad10-4efe-af8d-b556e02dfc75','19226ae6-72f3-40dc-a690-079c979a3044','1a196c99-007f-4edd-a8a1-556f070cc852' ,'1e88f4fb-101c-4f6c-acd0-100bd1d02237' ,'20511b9b-8e7b-44fb-ba79-5c2103679b39' ,'3564b980-59e3-411f-8cc2-1bffa3cf9883' ,'4491b692-b6a4-4581-b150-411ab03151a4' ,'6364b0eb-015c-422f-a5e2-ae00828c70d6' ,'6ed7a6a2-265d-4d59-8764-d7742296aa17' ,'93c99403-d099-401f-a544-44984dcfc925');
只要uid是tbl_bank_customer_accounts表的有效字段,传入的ID格式与字段类型匹配,执行这条语句就能直接返回对应ID的对象列表。
2. 通过存储过程实现该查询
也可以用存储过程实现,下面以MySQL为例给出两种实现方式:
方式1:接收固定10个ID参数
适合每次固定传入10个ID的场景:
DELIMITER // CREATE PROCEDURE GetCustomerAccounts( IN p_uid1 VARCHAR(36), IN p_uid2 VARCHAR(36), IN p_uid3 VARCHAR(36), IN p_uid4 VARCHAR(36), IN p_uid5 VARCHAR(36), IN p_uid6 VARCHAR(36), IN p_uid7 VARCHAR(36), IN p_uid8 VARCHAR(36), IN p_uid9 VARCHAR(36), IN p_uid10 VARCHAR(36) ) BEGIN SELECT * FROM tbl_bank_customer_accounts WHERE uid IN (p_uid1, p_uid2, p_uid3, p_uid4, p_uid5, p_uid6, p_uid7, p_uid8, p_uid9, p_uid10); END // DELIMITER ;
调用方式:
CALL GetCustomerAccounts('05b6864b-ad10-4efe-af8d-b556e02dfc75','19226ae6-72f3-40dc-a690-079c979a3044','1a196c99-007f-4edd-a8a1-556f070cc852' ,'1e88f4fb-101c-4f6c-acd0-100bd1d02237' ,'20511b9b-8e7b-44fb-ba79-5c2103679b39' ,'3564b980-59e3-411f-8cc2-1bffa3cf9883' ,'4491b692-b6a4-4581-b150-411ab03151a4' ,'6364b0eb-015c-422f-a5e2-ae00828c70d6' ,'6ed7a6a2-265d-4d59-8764-d7742296aa17' ,'93c99403-d099-401f-a544-44984dcfc925');
方式2:接收逗号分隔的ID字符串(更灵活)
如果后续ID数量可能变动,可传入逗号分隔的ID字符串实现查询:
DELIMITER // CREATE PROCEDURE GetCustomerAccountsByString(IN p_uids VARCHAR(1000)) BEGIN SET @sql = CONCAT('SELECT * FROM tbl_bank_customer_accounts WHERE uid IN (', p_uids, ')'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; END // DELIMITER ;
调用方式:
CALL GetCustomerAccountsByString('''05b6864b-ad10-4efe-af8d-b556e02dfc75'',''19226ae6-72f3-40dc-a690-079c979a3044'',''1a196c99-007f-4edd-a8a1-556f070cc852''');
注意:不同数据库的存储过程语法略有差异(如SQL Server、Oracle写法不同),上述示例针对MySQL,你可根据实际使用的数据库调整语法。
内容的提问来源于stack exchange,提问作者Gnana Sekhar
相关产品推荐
相关产品推荐

