运行Liquibase时出现ArrayIndexOutOfBoundsException

时间:2016-12-21 12:06:26

标签: sql exception liquibase

我使用Spring和Liquibase来部署以下SQL代码:

BEGIN;

CREATE OR REPLACE FUNCTION public.get_clear_name_city(IN dirty TEXT, OUT clear TEXT) AS $$ SELECT trim(regexp_replace(regexp_replace(trim(dirty), '^(г |пгт |рп |кп |п |к |нп |п.ст |п ж/д ст |г. |пгт. |рп. |кп. |дп. |гп. |п. |к. |нп. |п.ст. |п. ж/д ст|п. ж/д ст.|п ж/д ст. |ж/д блокпост |ж/д будка |ж/д ветка |ж/д казарма |ж/д комбинат |ж/д платформа |ж/д площадка |ж/д путевой пост |ж/д остановочный пункт |ж/д рзд |ж/д ст |местечко |д |с |сл |ст |ст-ца |у |х |рзд |д. |с. |м |м. |сл. |ст. |у. |х. |рзд. |зимовье |город |гидрологический пост |поселок городского типа |рабочий поселок |рабочий посёлок |курортный поселок |дачный поселок |городской поселок |поселок |посёлок |кишлак |населенный пункт |поселок при станции (поселок станции) |поселок при железнодорожной станции |железнодорожный блокпост |железнодорожная будка |железнодорожная ветка |железнодорожная казарма |железнодорожный комбинат |железнодорожная платформа |железнодорожная площадка |железнодорожный путевой пост |железнодорожный остановочный пункт |железнодорожный разъезд |железнодорожная станция |местечко |межселенные территории |метеостанция |монтерский пункт |деревня |село |сельское поселение |городское поселение |слобода |станция |станица |улус |усадьба |хутор |разъезд |зимовье )?', '', 'i'), '( сельское поселение| городское поселение)$', '', 'i')); $$ LANGUAGE SQL;
CREATE OR REPLACE FUNCTION public.get_clear_name_state(IN dirty TEXT, OUT clear TEXT) AS $$ SELECT trim(regexp_replace(regexp_replace(regexp_replace(trim(dirty), '^(город |городской округ |г |г. |закрытое административно-территориальное образование город |муниципальное образование город |муниципальное образование |муниципальный район |муниципальный р-н |м.район |мун.район |м. район |мун. район |р |р. |р/н |р-н )?', '', 'i'), ' республики.*', '', 'i'), '( район| р| р.| р/н| р-н| сельское поселение| городское поселение| муниципальный район| м.район| мун.район| м. район| мун. район| город| городской округ| г| г.| закрытое административно-территориальное образование| муниципальное образование)$', '', 'i')); $$ LANGUAGE SQL;

DELETE FROM city;
DELETE FROM state;
CREATE TYPE oktmo_name AS (oktmo TEXT, name TEXT);
CREATE OR REPLACE FUNCTION city_set(parent_oktmo INTEGER)
  RETURNS SETOF oktmo_name AS $$
  BEGIN
    RETURN QUERY EXECUTE
       'WITH RECURSIVE cities_oktmo AS (
         SELECT * FROM oktmo WHERE oktmo.parent_id = ' || parent_oktmo ||
         'UNION ALL
         SELECT oktmo.* FROM oktmo
           JOIN cities_oktmo ON oktmo.parent_id = cities_oktmo.id
       )
       SELECT city.oktmo::TEXT, city.name::TEXT FROM cities_oktmo city
       LEFT JOIN cities_oktmo child ON city.id = child.parent_id
       WHERE child.oktmo ISNULL AND char_length(city.oktmo) = 11
       ORDER BY city.name';
  END; $$ LANGUAGE plpgsql;
DO $$
  DECLARE
    state_cursor CURSOR FOR
    SELECT oktmo, name FROM oktmo
    WHERE parent_id = (select m.value::BIGINT from "public"."messages" m WHERE m.key='branding.region.oktmo');         state_guid UUID;
  BEGIN
    FOR st IN state_cursor LOOP
      state_guid := uuid_generate_v4();
      INSERT INTO state(guid, oktmo, name, clear_name) VALUES(state_guid, st.oktmo, st.name, get_clear_name_state(st.name));
      INSERT INTO city(oktmo, name, clear_name, state_guid)
      SELECT oktmo, name, get_clear_name_city(name), state_guid
      FROM city_set(st.oktmo::INT4);
    END LOOP;
  END $$;
DROP FUNCTION city_set(parent_oktmo INTEGER);
DROP TYPE oktmo_name;

COMMIT;

当我尝试启动我的应用程序时,我得到以下异常:

Caused by: liquibase.exception.MigrationFailedException: Migration failed for change set classpath:changelogs/db-changelog-4.x.xml::GEO-6154_1::kadzhaev:
     Reason: java.lang.ArrayIndexOutOfBoundsException

我认为可能因$$符号而发生,但我该如何解决呢?

2 个答案:

答案 0 :(得分:3)

只需将splitStatements =“ false”和stripComments =“ false”添加到标签。

<changeSet id="1" author="admin">
    <sql splitStatements="false" stripComments="false" >
        <![CDATA[
            your SQL
        ]]>
    </sql>
</changeSet>

答案 1 :(得分:1)

我有同样的问题,我已经解决了使用

<createProcedure dbms="postgresql"
                 encoding="utf8"
                 path="yourFunction.sql"
                 relativeToChangelogFile="true"
/>