上述答案在 2022 年对我来说都不起作用,但它们为我提供了一个焦点来提出我自己的工作解决方案。我在类似问题下发布了我的答案,但为了完整起见,可以为您节省一些额外的点击次数,我也在此处提供。
我也遇到过这个问题,现在我找到了解决方案。 其实是3!因此,您可以选择适合您需求的任何一种。但它的关键是正确格式化的String,它代表创建SP 的DB 脚本。
我还没有弄清楚如何在一个 SQL 脚本/字符串中结合删除和创建 SP,但无论如何我对这些解决方案很满意。
仅供参考:
- 不需要在类或方法级别上进行特殊注释或设置
- 我正在使用Spring FW,它简化了事情,所以不需要对所有内容进行底层实现
- 在搜索并尝试了各种绝对有效的“提示”后,以下资源帮助我找到了那些确实有效的解决方案:
解决方案 1:使用 JdbcTemplate 和 Java String
在格式良好的String sql 脚本中包含尾随空格非常重要
String sqlSP = "CREATE PROCEDURE test_stored_proc (IN pInstanceId varchar(255)) " +
"BEGIN " +
"SELECT * FROM vw_subscriptions WHERE instanceId = pInstanceId; " +
"END";
jdbcTemplate.execute(sqlSP);
解决方案 2:使用ResourceDatabasePopulator & ClassPathResource 在文件中加载 SQL 脚本
ClassPathResource resource = new ClassPathResource("/data/create-sp_TEST_STORED_PROC.sql");
jdbcTemplate.execute("DROP procedure IF EXISTS `test_stored_proc`;");
ResourceDatabasePopulator databasePopulator = new ResourceDatabasePopulator(resource);
databasePopulator.setSeparator(ScriptUtils.EOF_STATEMENT_SEPARATOR);
databasePopulator.execute(testSetupDataSource);
解决方案 3:使用ScriptUtils & ClassPathResource 在文件中加载 SQL 脚本
ClassPathResource resource = new ClassPathResource("/data/create-sp_TEST_STORED_PROC.sql");
jdbcTemplate.execute("DROP procedure IF EXISTS `test_stored_proc`;");
ScriptUtils.executeSqlScript(Objects.requireNonNull(testSetupDataSource).getConnection(), new EncodedResource(resource),
false, false,
ScriptUtils.DEFAULT_COMMENT_PREFIX, ScriptUtils.EOF_STATEMENT_SEPARATOR,
ScriptUtils.DEFAULT_BLOCK_COMMENT_START_DELIMITER, ScriptUtils.DEFAULT_BLOCK_COMMENT_END_DELIMITER);
create-sp_TEST_STORED_PROC.sql 脚本的内容
对于解决方案 #1 和 #2,适用与第一个解决方案相同的规则:
-
空白字符的格式和存在非常重要,尤其是每行末尾的额外尾随空格。
所以下面的代码是由我的vim设置存档的,代表空白字符
CREATE·PROCEDURE·test_stored_proc·(IN·pInstanceId·varchar(255))~¬
BEGIN~¬
–→SELECT·*·FROM·vw_subscriptions·WHERE·instanceId·=·pInstanceId;~¬
END;~¬
我相信它在内部表示为一行字符串:
CREATE PROCEDURE test_stored_proc (IN pInstanceId varchar(255)) BEGIN SELECT * FROM vw_subscriptions WHERE instanceId = pInstanceId; END
几乎完整的源代码可以在我的GitHub找到