java - 从 spring app 执行 sql 文件时,PSQLException 在“$$ DECLARE 处或附近未终止的美元引号字符串

标签 java spring postgresql

我在从我的 java 代码执行一个名为 sample_script.sql 的 sql 文件时出错。这是一个 spring 应用程序,我试图通过 java 类 ScriptRunner 运行脚本,因为我想自动运行脚本。

sample_script.sql:

CREATE OR REPLACE FUNCTION core.getValue (id bigint, field varchar) 
RETURNS text
AS $$
  DECLARE json_object json;
  DECLARE item json;
  DECLARE val text;
  BEGIN
    SELECT E.json::json into json_object from customer E where E.id = id;
    FOR item IN SELECT * FROM json_array_elements((json_object->>'name')::json)
    LOOP
        IF (item->>'data') = field 
        THEN
        val = (item->>'values')::json->>0;
        END IF;
    END LOOP;
    return val;
  END;
$$ LANGUAGE 'plpgsql';

它在 PGAdmin 中运行正常,但是当我从我的 spring 项目中运行这个文件时,它给出了错误。

Java代码段:

ScriptRunner sr = new ScriptRunner(con, false, false);
Reader reader = new BufferedReader(new FileReader("sample_script.sql"));
sr.runScript(reader);

错误日志:

Error executing: CREATE OR REPLACE FUNCTION core.getValue (id bigint, field varchar)  RETURNS text AS $$   DECLARE json_object json 
org.postgresql.util.PSQLException: ERROR: unterminated dollar-quoted string at or near "$$   DECLARE json_object json "
  Position: 91

此外,在执行脚本时,它正在从脚本中删除 ;,如下所示:

CREATE OR REPLACE FUNCTION core.getValue (id bigint, field varchar)  RETURNS text AS $$   DECLARE json_object json 
  DECLARE item json 
  DECLARE val text 
  BEGIN     SELECT E.json::json into json_object from customer E where E.id = id 
    FOR item IN SELECT * FROM json_array_elements((json_object->>'name')::json)     LOOP         IF (item->>'data') = field          THEN         val = (item->>'values')::json->>0 
        END IF 
    END LOOP 
    return val 
  END 
$$ LANGUAGE 'plpgsql' 

谁能解释为什么会发生这种情况以及如何解决它?

注:我看过this但这对这个问题没有帮助。

最佳答案

使用 Statement.execute() 而不是 ScriptRunner

更新的 Java 代码段:

Connection con = sessionFactory.getSessionFactoryOptions().getServiceRegistry().getService(ConnectionProvider.class).getConnection();
BufferedReader in = new BufferedReader(new FileReader("sample_script.sql"));
LineNumberReader fileReader = new LineNumberReader(in);
String query = ScriptUtils.readScript(fileReader, ScriptUtils.DEFAULT_COMMENT_PREFIX, ScriptUtils.DEFAULT_STATEMENT_SEPARATOR);
Statement stmt = null;
stmt = con.createStatement();
stmt.execute(query);

关于java - 从 spring app 执行 sql 文件时,PSQLException 在“$$ DECLARE 处或附近未终止的美元引号字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52717116/

相关文章:

java - 如何使用sendRedirect或session或forward仅刷新我的网页一次?

sql - 如何仅显示内部连接表列的最大值?

sql - 在纯 PostgreSQL 中 reshape 查询结果

java - 使用 Apache POI 在 Excel 中的一定数量的单元格后字体消失

java - 使用枚举切换大小写会导致重复

java - 无法注册以 null 定义的 bean 'postRepository' 。具有该名称的 bean 已在 null 中定义

spring - 使用Spring的MockMvc框架,如何测试模型属性的属性值?

PHP - pg_connect() 无法将主机名转换为地址(通过 VPN)

java - "Non-static method cannot be referenced from a static context"错误

java - 用Java将pdf文档添加到Solr