Postgresql Тип ошибки "" не существует - PullRequest
0 голосов
/ 07 июня 2018

Я получаю эту ошибку:

    Caused by: org.postgresql.util.PSQLException: ERROR: type 
    "tool_parse_numbers_record" does not exist
    Where: compilation of PL/pgSQL function "tool_parse_numbers" near line 2

Я восстанавливаю свою базу данных в Docker-контейнере следующим образом:

    FROM postgres:9.4
    ENV POSTGRES_USER iwb
    ENV POSTGRES_PASSWORD 1907
    ENV POSTGRES_DB iwb

    ADD ./1_schema.sql /docker-entrypoint-initdb.d/
    ADD ./2_data.sql /docker-entrypoint-initdb.d/

Вот определение типа в файле schema.sql:

    CREATE TYPE tool_parse_numbers_record AS (
     satir character varying(4000)
    );

Вот верхняя часть определения функции в schema.sql:

    CREATE FUNCTION tool_parse_numbers(pstr text, pdelimeter text DEFAULT 
    '|'::text) RETURNS SETOF tool_parse_numbers_record
    LANGUAGE plpgsql SECURITY DEFINER
    AS $$
    DECLARE

И вот как восстанавливается база данных:

    CREATE FUNCTION tool_parse_numbers(pstr text, pdelimeter text DEFAULT 
    '|'::text) RETURNS SETOF tool_parse_numbers_record
    LANGUAGE plpgsql SECURITY DEFINER
    AS $BODY$
    DECLARE

РЕДАКТИРОВАТЬ: Я изменил dockerfile, чтобы создавать типы перед функциями:

    ADD ./1_type.sql /docker-entrypoint-initdb.d/
    ADD ./2_table.sql /docker-entrypoint-initdb.d/
    ADD ./3_func.sql /docker-entrypoint-initdb.d/
    ADD ./4_rest_table.sql /docker-entrypoint-initdb.d/
    ADD ./5_data.sql /docker-entrypoint-initdb.d/

Как это исправить?

Ответы [ 2 ]

0 голосов
/ 07 июня 2018

Когда я извлек базу данных в файл schema.sql, для владельца было задано значение postgres:

    ALTER FUNCTION iwb.tool_parse_numbers(pstr text, pdelimeter text) OWNER TO postgres; 

Поэтому я изменил владельца на iwb, поскольку в файле Docker это похоже на файл

    ENV POSTGRES_USER iwb
* 1006.* И это сработало!
0 голосов
/ 07 июня 2018

Вы уверены, что тип создан перед функцией?

Тип создается в той же схеме, что и функция?(Разве не используется SET search_path где-нибудь в файле sql?)

$$ и $ BODY $ запускает "строку в кавычках dolar", которые заканчиваются тем же ($$ или $ BODY $).Вместо BODY у вас могут быть любые символы (или любые), он просто позволяет без проблем писать $$, "и т. Д. Внутри строки. Почему postgres использует $ BODY $, а не $ ILOVEBEER $, остается неизвестным.

...