PSQLException - неопределенная строка в кавычках, указанная в долларах, на уровне или около $$ DECLARE при выполнении файла sql из весеннего приложения - PullRequest
0 голосов
/ 09 октября 2018

Я получаю сообщение об ошибке при выполнении имени файла 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' 

Может кто-нибудь объяснить, почемуэто происходит и как решить?

Примечание: Я видел это , но это не помогает в этом вопросе.

1 Ответ

0 голосов
/ 09 октября 2018

Используется 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...