Spring ScriptUtils - PostgreSQL 中未终止的美元报价

2024-01-08

我使用以下 Java 代码来运行 SQL 脚本:

@SpringBootApplication
public class Application implements CommandLineRunner {
  @Autowired
  DataSource ds;

  @Value("classpath:test.sql")
  Resource resource;

  public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
  }

  @Override
  public void run(String... args) throws Exception {
    try {
      @Cleanup
      Connection c = ds.getConnection();
      ScriptUtils.executeSqlScript(c, resource);

    } catch (Exception e) {
      e.printStackTrace();
    }

  }

}

我使用的 Spring boot 版本是 2.1.7.RELEASE,PostgreSQL 通过以下方式在本地 docker 镜像中运行:

docker run --rm   --name pg-docker -e POSTGRES_PASSWORD=PASSWORD -d -p 5432:5432 -v postgresql:/var/lib/postgresql/data  postgres:11.3

我使用的 SQL 脚本是:

CREATE OR REPLACE FUNCTION totalRecords ()
RETURNS integer AS $total$
declare
  total integer;
BEGIN
   SELECT count(*) into total FROM COMPANY;
   RETURN total;
END;
$total$ LANGUAGE plpgsql; 

我认为这是完全有效的并且在 PgAdmin 中运行正常。

不幸的是,我收到了来自 Java 的以下异常:

Caused by: org.postgresql.util.PSQLException: Unterminated dollar quote started at position 62 in SQL CREATE OR REPLACE FUNCTION totalRecords () RETURNS integer AS $total$ declare total integer. Expected terminating $$
    at org.postgresql.core.Parser.checkParsePosition(Parser.java:1274)
    at org.postgresql.core.Parser.parseSql(Parser.java:1173)
    at org.postgresql.core.Parser.replaceProcessing(Parser.java:1125)
    at org.postgresql.core.CachedQueryCreateAction.create(CachedQueryCreateAction.java:41)
    at org.postgresql.core.QueryExecutorBase.createQueryByKey(QueryExecutorBase.java:314)
    at org.postgresql.jdbc.PgStatement.executeCachedSql(PgStatement.java:289)
    at org.postgresql.jdbc.PgStatement.executeWithFlags(PgStatement.java:274)
    at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:269)
    at com.zaxxer.hikari.pool.ProxyStatement.execute(ProxyStatement.java:95)
    at com.zaxxer.hikari.pool.HikariProxyStatement.execute(HikariProxyStatement.java)
    at org.springframework.jdbc.datasource.init.ScriptUtils.executeSqlScript(ScriptUtils.java:488)
    ... 9 more

怎么了 ?请问我该如何修复它?或者如果 ScriptUtils 无法做到这一点,如何从 Java 可靠地运行 PostgreSQL 脚本?


终于我能够解决自己的问题了。不确定我的解决方案是否是最好的想法。问题出在 ScriptUtils 中 - 它通过 ScriptUtils.DEFAULT_STATMENT_SEPARATOR 确定语句结束,即“;”。不幸的是,FUNCTION 命令包含各种“;”这是声明本身的一部分。所以解决方案是声明并使用另一个不干扰 PostgreSQL 语法的分隔符。就我而言,我使用了两个分号 - “;;”。所以我的声明如下:

CREATE OR REPLACE FUNCTION totalRecords ()
RETURNS integer AS $total$
declare
  total integer;
BEGIN
   SELECT count(*) into total FROM COMPANY;
   RETURN total;
END;
$total$ LANGUAGE plpgsql;; 

调用它的Java代码更改为:

ScriptUtils.executeSqlScript(c, new EncodedResource(resource, "UTF-8"), false, false, ScriptUtils.DEFAULT_COMMENT_PREFIX, ";;",
      ScriptUtils.DEFAULT_BLOCK_COMMENT_START_DELIMITER, ScriptUtils.DEFAULT_BLOCK_COMMENT_END_DELIMITER);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring ScriptUtils - PostgreSQL 中未终止的美元报价 的相关文章

  • JavaFX 2.0 FXML 子窗口

    经过多次搜索我发现了这个问题如何创建 javafx 2 0 应用程序 MDI https stackoverflow com questions 10915388 how to create a javafx 2 0 application
  • Postgresql 使用 IN 与 NOT IN 时的巨大性能差异

    我有两张桌子 transaksi 和 buku transaksi 大约有 25 万行 buku 大约有 17 万行 两个表都有名为 k999a 的列 并且两个表均不使用索引 现在我检查这两个陈述 声明一 explain select k9
  • 尝试获取屏幕上绘制的每个随机圆圈的 x、y 坐标

    您好 我正在制作一款游戏 该游戏将在屏幕上创建随机圆圈 随机创建的圆圈的值为红色或绿色 我的问题是 我希望不仅能够确定用户何时单击其中一个圆圈 而且还能够确定他们最终单击的圆圈 红色或绿色 下面是我的代码 我的主要问题是试图找到将要绘制的圆
  • 如何将现有的 SQLite3 数据库导入 Room?

    好吧 我在桌面上使用 SQLite3 创建了一个只需要读取的某些信息的数据库 我正在制作的应用程序不需要在此表中插入或删除信息 我在 Room 数据库层上做了相当多的谷歌搜索 所有文档都需要在构建应用程序时在 Room 中创建一个新的数据库
  • javax.persistence.RollbackException:提交事务时出错],根本原因是 java.lang.StackOverflowError:null

    我有一个使用 Spring Data REST 框架的 Spring Boot API 从 spring boot starter parent 2 1 0 RELEASE 继承的依赖项 我正在尝试执行 PUT 或 PATCH 请求来更新实
  • 如何为小程序提供对文件系统写入的访问权限

    我在设置小程序的策略文件时遇到问题 我是第一次这样做 不知道如何在java中设置小程序的策略文件 实际上我想授予小程序在文件系统上写入的权限 为此我必须向小程序授予文件权限 所以我创建了一个名为 java policy 的文件 并将以下代码
  • JTextField 和 JTextArea

    JTextField 和 JTextArea 有什么不同 是否可以在一个班级中使用这两个班级 总之 JTextField 是单行文本字段 而 JTextArea 可以跨越多行 文档中清楚地解释了这些差异 文本区 http docs orac
  • 使用 JSch 分别为各个提示提供输入

    问题是 SSH 连接需要在常规登录后提供另一个用户 ID 和密码信息 我正在使用 JSch 连接到远程服务器 它接受以下形式的输入InputStream 和这个InputStream只能通过一次 由于会话是交互式的 这会导致问题 我尝试将输
  • 将此 MySQL 查询转换为 PyGreSQL

    我正在开发一个 Ruby 应用程序 它使用 mysql 函数 XOR 和 BIT COUNT 不过 我现在需要在运行 PyGreSQL 的 Heroku 上运行该应用程序 我找不到任何可以帮助我的 PyGreSQL 文档 那么任何人都可以翻
  • LocalDate 减去 period 得到错误的结果

    LocalDate减去一个Period 如 28年1个月27天 得到错误的结果 但减去一个Period 只有天单位 如 10282 天 得到正确的结果 有什么需要注意的吗 public static void main String arg
  • 从 HttpClient 3 转换为 4

    我已经成功地对所有内容进行了更改 但以下内容除外 HttpClient client HttpPost method client new DefaultHttpClient method new HttpPost url InputStr
  • 更改 JComboBox 中滚动条的大小

    有谁知道如何手动更改 jComboBox 中的滚动条大小 我已经尝试了一大堆东西 但没有任何效果 好吧 我明白了 您可以实现 PopUpMenuListener 并使用它 public void popupMenuWillBecomeVis
  • JAXB 编组器无参数默认构造函数

    我想从 java 库中编组一个 java 对象 当使用 JAXB marschaller 编组 java 对象时 我遇到了一个问题 A 类没有无参数默认构造函数 我使用Java Decompiler来检查类的实现 它是这样的 public
  • 如何检查日期字符串的有效性?

    在我的项目中 我需要检查日期字符串是否计算为正确的日期对象 我决定允许 yyyy MM dd 和日期格式 年 月 日 和 年 月 日 小时 分钟 我如何检查它们是否有效 我的代码为 1980 01 01 和一些奇怪的日期 如 3837 05
  • 传递 Android DialogFragment 参数时,onCreateDialog 捆绑参数意外为 null

    我正在尝试使用 DialogFragment 在 Android 中显示一个基本对话框 并使用对话框消息的参数 如中所述StackOverflow线程 https stackoverflow com questions 15459209 p
  • Java 中的微分方程

    我正在尝试用java创建一个简单的SIR流行病模型模拟程序 基本上 SIR 由三个微分方程组定义 S t l t S t I t l t S t g t I t R t g t I t S 易感人群 I 感染人群 R 康复人群 l t c
  • Spring中什么时候触发ContextRefreshedEvent?

    我知道当 ApplicationContext 完全加载时它会被触发一次 但是之后在运行时怎么办 Refreshed 一词意味着它将在刷新时触发 但我想知道 Spring 是否符合 ApplicationContext 刷新的资格 跟进问题
  • 使用自定义比较器在 Java 中创建 SortedMap

    我想创建一个TreeMap在 Java 中具有自定义排序顺序 排序后的键是字符串 需要根据第二个字符进行排序 这些值也是字符串 示例地图 Za FOO Ab Bar 您可以像这样使用自定义比较器 Comparator
  • 将 docker-compose.yml 中的包安装到 docker 容器中

    我是 docker 和 docker compose 的初学者 我需要你的帮助 我正在使用 docker compose 制作 PHP NGINX PostgresQL symfony 开发环境 这里是 web image nginx 1
  • Android Google 地图无法在当前主题中找到样式“mapViewStyle”

    添加谷歌地图视图时 我扩展了MapView 使用xml编辑器将其添加到活动中 并将我的谷歌地图api密钥手动添加到布局xml文件中 我的权限在清单文件中允许互联网 我想知道的是 在 xml 编辑器中 我收到错误 无法在当前主题中找到样式 m

随机推荐

  • 更改绘图悬停框 R 的位置

    我想更改悬停框的位置plotly条形图 我希望它在栏上方弹出 而不是在左侧或右侧弹出 这可能吗 我一直在谷歌上搜索这个并盯着 Plotly R 参考页面几个小时 但没有运气 这是一个示例 library dplyr library plot
  • 在Oracle中使用SQL从3个表中选择数据

    我希望有人可以提供帮助 我是very这一切都是新的 我被困住了 我有 3 个表 我试图从中提取数据 顾客 custid 第一个 最后一个 积分俱乐部编号 调查编号 订单日期 订单总数 员工 empid 名字 姓氏 工资 销售额 销售日期 c
  • 简单的 REST URL 方案

    在我的网络应用程序中 我有一个user模型和一个journal and post模型 每个用户可以有多个日记 每个日记可以有多个帖子 下面是以 RESTful 方式表示这一点的最佳方式吗 profiles
  • EntityFramework Core 1.1.0 缺少 Include()? [复制]

    这个问题在这里已经有答案了 我正在使用 EntityFramework Core 1 1 0 我可以查询表并加载实体 但 Microsoft 的说明表明如果我想加载关系数据 我应该使用 Include 功能 https learn micr
  • php cURL 问题

  • 避免使用“抛出”构造函数进行堆分配

    说我有课Foo它没有定义默认构造函数并且throws在非默认构造函数中 初始化该类型的新对象时 我想捕获任何异常并返回 否则继续使用该对象 我注意到初始化这个对象 如果可能的话 很困难在堆栈上或通过使用共享指针 因为我试图避免管理内存 Fa
  • NuGet如何决定是否使用本地包缓存?

    今天 我在安装软件包时遇到了 NuGet 的奇怪行为 简要描述 作为我的构建脚本的结果 有一个 NuGet 包 我不会每次都更改版本 因此每个构建都会产生MyPackage 1 0 0 nupkg 作为构建的最后一步 我将包推送到部署在本地
  • mongodb按子字段查询

    如何查询全部 module B 以下查询不起作用 db XXX find id module B 万分感谢 数据如下 id module A date ISODate 2013 03 18T07 00 00Z value count 1 0
  • 如何在 Coq 中禁用我的自定义符号?

    我定义了一个符号来模拟命令式编程 Notation a gt gt b b a at level 50 然而之后 所有函数应用表达式都表示为 gt gt 样式 例如 在 Coq Toplevel 的证明模式下 我可以看到 bs nat gt
  • asp.net mvc 5实体框架6身份与信任级别=中等?

    创建最简单的项目 在 Visual Studio 2013 gt asp net Web 应用程序 gt 使用个人帐户进行 MVC 身份验证 它在本地主机上完美运行 但是 当发送到服务器 中等信任级别 时 当我尝试输入登录名时 该项目无法运
  • Nhibernate 错误:System.Data.SqlClient.SqlException:“索引”附近的语法不正确

    我有一个 nhibernate 解决方案 我正在尝试保存 但出现此错误 Test method HelloMusic Core Test CrudTests TestTrackAdd threw exception NHibernate E
  • Android 清单.xml

    我正在研究 Google Android 开发者网站 http developer android com resources tutorials views hello tabwidget html 中的选项卡示例 但我陷入了步骤 2 在
  • 在函数之间传递 BufReader/BufWriter 时,引用 BufReader/BufWriter 的惯用方法是什么?

    读完后std io BufReader https doc rust lang org std io struct BufReader html文档 我不知道如何最好地通过BufReader函数之间 允许多种排列 但哪种排列最好 我有一个需
  • Java打印字体拉伸

    我刚刚让打印机在 java 中工作 我也需要它 但是我需要解决最后一个问题 打印时 字体的宽度相当拉长 并不像应有的那样清晰 这是我在纸上实际绘图的代码 FontMetrics metrics graphics getFontMetrics
  • 如何找到iframe的xpath。下面是附图

    我需要在下图中找到 与您的搜索相关的品牌 文本 我如何编写 xpath 文本存在于没有 id 或类或没有唯一标识符的 iframe 中 我想使用跨度数据组件 id 找到它 但它不起作用 By xpath span data componen
  • d3js:有两个y轴时缩放

    参考 https github com mbostock d3 wiki Zoom Behavior https github com mbostock d3 wiki Zoom Behavior make zoom var zoomFir
  • 为什么 implode() 可以以任意顺序接受其参数,而explode() 不能。?

    虽然implode 由于历史原因 可以按任一顺序接受其参数 explode 不能 为什么 array array lastname email phone comma separated implode array 类似于 array ar
  • 如何通过index.html显示firebase存储中的图像

    我已经将一些图像上传到 firebase 的存储中 然后我需要在网站上显示所有这些图像 我已经阅读了 firebase 的文档 但仍然找不到显示所有图片的正确方法 所以 我的问题是 我的代码在哪里显示偶数单个图像是错误的 如何同时在网络上显
  • VBA Outlook 如何在电子邮件正文中添加超链接

    该宏添加了电子邮件的超链接 Sub test add hyperlink Dim NewMail As Outlook MailItem Set NewMail Application ActiveInspector CurrentItem
  • Spring ScriptUtils - PostgreSQL 中未终止的美元报价

    我使用以下 Java 代码来运行 SQL 脚本 SpringBootApplication public class Application implements CommandLineRunner Autowired DataSource