Я получаю сообщение об ошибке при выполнении имени файла sql sample_script.sql
из моего кода Java.Это весеннее приложение, из которого я пытаюсь запустить скрипт через класс 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, но когда я запускаю этот файл из моего весеннего проекта, как показано ниже, он выдает ошибку.
Сегмент 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'
Может кто-нибудь объяснить, почемуэто происходит и как решить?
Примечание: Я видел это , но это не помогает в этом вопросе.