谢谢,@krokodilko。你的回答很有用:)。
我接受了你的建议,并添加了一个循环,可以通过单个字符串参数执行多个查询,传递给存储过程。
我猜这可能在现实世界中没有太多的实用性,但只是为了分享一下。当我学习mysql并在存储过程和函数中反复想要删除然后创建表格时,我浪费了很多时间追逐自己的尾巴,直到意识到使用PREPARE/EXECUTE无法执行多个语句。
总之,就是这样。
# mysql_splitprepareexecutemulti.sql
#
# combine codebits from these two pages:
# 1 - https://dev59.com/WWIj5IYBdhLWcg3wUjzG
# 2 - https://sebhastian.com/mysql-split-string/
#
# Not gonna bother validate the sql at all. May not even handle
# empty string, no delimiter on end, etc.
#
# Take query string with presumably 1 or more sql statements
# - split based on parm string, default to semicolon
# - loop through parm str sql, prepare each query then execute each.
#
#
##############################################
CREATE DEFINER=`root`@`localhost` PROCEDURE `mssp_execStrungQueries`(
IN str text,
IN delimiterChar CHAR(1)
)
BEGIN
SET @inputString = str;
WHILE LOCATE(delimiterChar,@inputString) > 1 DO
SET @queryString = SUBSTRING_INDEX(@inputString,delimiterChar,1);
PREPARE stmt FROM @queryString; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @inputString = REGEXP_REPLACE(@inputString, (
SELECT LEFT(@inputString, LOCATE(delimiterChar, @inputString))),'',1,1);
select SLEEP(1); #slow down during dev in case conjur infinite loop
END WHILE;
END
##############################################
##############################################
### test calls to the SP:
call mssp_execStrungQueries(';',';');
select 'test just semi colon after call' as afterCallSP;
call mssp_execStrungQueries('','');
select 'test empty str after call' as afterCallSP;
SET @str = CONCAT('select \'ONEthingAAA\' as oneCol');
call mssp_execStrungQueries(@str,';');
select 'Test 1 query NO SEMICOLON test after call.' as afterCallSP;
SET @str = CONCAT('select \'ONEthingAAA\' as oneCol;');
call mssp_execStrungQueries(@str,';');
select 'Test 1 query WITH semicolon test after call.' as afterCallSP;
SET @str = CONCAT('select \'ONEthingAAA\' as oneCol;'
,'select \'TWOthingBBB\' as twoCol;'
,'select \'TREEtingCCCC\' as threeCol;');
call mssp_execStrungQueries(@str,';');
select 'Test 3 statements after call' as afterCallSP;
SET @str = CONCAT('select \'ONEthingAAA\' as oneCol;'
,'select \'TWOthingBBB\' as twoCol;'
,'select \'TREEtingCCCC\' as threeCol');
call mssp_execStrungQueries(@str,';');
select 'Test 3 stmts NO SEMI on last' as afterCallSP;
SET @str = CONCAT('select \'ONEthingAAA\' as oneCol;'
,'select \'TWOthingBBB\' as twoCol '
,'select \'TREEtingCCCC\' as threeCol;');
call mssp_execStrungQueries(@str,';');
select 'Test 3 stmts NO SEMI on 2nd' as afterCallSP;
干杯,
:)benja