我在从我的 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/