Как можно использовать скрипт из pg_get_functiondef() для создания хранимых процедур в Postgresql?

С помощью следующего кода создается текстовый файл «myprocedures», содержащий хранимые процедуры.

Можно ли вообще без переделки применить этот файл к существующей базе данных на другой машине? Или как лучше всего использовать этот файл для генерации процедур в другой базе данных? (т. е. как его можно использовать непосредственно в PgAdmin или psql?).

Моя проблема в том, что в скрипте сгенерированы символы (такие как "+" и "\r", которые не распознаются с помощью

"C:\Program Files\PostgreSQL\9.3\bin\psql.exe" -h xxx.xxx.x.xxx -p 5432 -U postgres -d chaos -1 -v ON_ERROR_STOP -f C:/temp/myprocedures

ТИА

Постгрес SQL версии 9.3

Windows 7 Ultimate

ПгАдмин III

File: dump_stored_procedures.sql

SELECT pg_get_functiondef(f.oid)
FROM pg_catalog.pg_proc f
INNER JOIN pg_catalog.pg_namespace n ON (f.pronamespace = n.oid)
WHERE n.nspname = 'public';

--------------------------------------------------------

File: dump_procedures.bat

setlocal
set PGPASSWORD=password
"C:\Program Files\PostgreSQL\9.3\bin\psql.exe" -h localhost -U postgres 
-d  chaos -f C:/temp/dump_stored_procedures.sql >> C:/temp/myprocedures
pause
endlocal

Редактировать № 1: Вот пример первых нескольких определений процедур в myprocedures. Обратите внимание на ненужное добавление "pg_get_function", "---" и всех "+" и "\r":

    pg_get_functiondef                                                                                                                                                                                
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 CREATE OR REPLACE FUNCTION public.empty(text)                                                                                                                                                                                                                                                                                                                                  +
  RETURNS boolean                                                                                                                                                                                                                                                                                                                                                               +
  LANGUAGE sql                                                                                                                                                                                                                                                                                                                                                                  +
  IMMUTABLE                                                                                                                                                                                                                                                                                                                                                                     +
 AS $function$ SELECT $1 ~ '^[[:space:]]*$'; $function$                                                                                                                                                                                                                                                                                                                         +

 CREATE OR REPLACE FUNCTION public.f_getallprogressnotes(groupid character varying)                                                                                                                                                                                                                                                                                             +
  RETURNS SETOF view_progressnote                                                                                                                                                                                                                                                                                                                                               +
  LANGUAGE sql                                                                                                                                                                                                                                                                                                                                                                  +
 AS $function$ \r                                                                                                                                                                                                                                                                                                                                                               +
 \r                                                                                                                                                                                                                                                                                                                                                                             +
  select \r                                                                                                                                                                                                                                                                                                                                                                     +
         et.eid, et.groupid, et.cpatient, et.tencounter, et.checkout, et.notseen,  \r                                                                                                                                                                                                                                                                                           +
         et.complexity,  p.note, r.appointmentmetadata, r.rtn\r                                                                                                                                                                                                                                                                                                                 +
  from \r                                                                                                                                                                                                                                                                                                                                                                       +
         encountertimes et \r                                                                                                                                                                                                                                                                                                                                                   +
  left outer join \r                                                                                                                                                                                                                                                                                                                                                            +
         progressnote p \r                                                                                                                                                                                                                                                                                                                                                      +
  on \r                                                                                                                                                                                                                                                                                                                                                                         +
         (et.eid = p.eid)\r                                                                                                                                                                                                                                                                                                                                                     +
  left outer join \r                                                                                                                                                                                                                                                                                                                                                            +
         returntooffice r \r                                                                                                                                                                                                                                                                                                                                                    +
  on \r                                                                                                                                                                                                                                                                                                                                                                         +
         (et.eid = r.eid) \r                                                                                                                                                                                                                                                                                                                                                    +
  where\r                                                                                                                                                                                                                                                                                                                                                                       +
         et.groupid =$1 \r                                                                                                                                                                                                                                                                                                                                                      +
 order by et.tencounter desc     \r                                                                                                                                                                                                                                                                                                                                             +
 \r                                                                                                                                                                                                                                                                                                                                                                             +
 $function$                                                                                                                                                                                                                                                                                                                                                                     +

 CREATE OR REPLACE FUNCTION public.f_getallvitalsigns(groupid character varying)                                                                                                                                                                                                                                                                                                +
  RETURNS SETOF vitalsigns                                                                                                                                                                                                                                                                                                                                                      +
  LANGUAGE sql                                                                                                                                                                                                                                                                                                                                                                  +
 AS $function$ \r                                                                                                                                                                                                                                                                                                                                                               +
 select v.*\r                                                                                                                                                                                                                                                                                                                                                                   +
   from \r                                                                                                                                                                                                                                                                                                                                                                      +
         vitalsigns v \r                                                                                                                                                                                                                                                                                                                                                        +
   right join ( \r                                                                                                                                                                                                                                                                                                                                                              +
         select \r                                                                                                                                                                                                                                                                                                                                                              +
                 eid, tencounter \r                                                                                                                                                                                                                                                                                                                                             +
         from \r                                                                                                                                                                                                                                                                                                                                                                +
                 encountertimes\r                                                                                                                                                                                                                                                                                                                                               +
         where\r                                                                                                                                                                                                                                                                                                                                                                +
                 groupid = $1\r                                                                                                                                                                                                                                                                                                                                                 +
         order by\r                                                                                                                                                                                                                                                                                                                                                             +
                 tencounter asc\r                                                                                                                                                                                                                                                                                                                                               +
         ) j\r                                                                                                                                                                                                                                                                                                                                                                  +
 on (v.eid = j.eid)                              \r                                                                                                                                                                                                                                                                                                                             +
   $function$                   

и т.д., и т.д., и т.д., ....


person Alan Wayne    schedule 01.06.2015    source источник
comment
Не могли бы вы опубликовать сообщение об ошибке (и строку, которую она вызывает), упомянутую в Моя проблема в том, что в скрипте есть символы (например, + и \r), которые не распознаются?   -  person Radek Postołowicz    schedule 01.06.2015
comment
@RadekPostołowicz Конечно. Первая ошибка: psql:C:/temp/myprocedures:944 ОШИБКА: синтаксическая ошибка в pg_get_functiondef LINE 1 или рядом с ней: pg_get_functiondef. Изучение файла myprocedures показывает, что он начинается с pg_get_functiondef, расположенного по центру вверху файла. Идеи??   -  person Alan Wayne    schedule 01.06.2015


Ответы (2)


pg_get_functiondef в верхней части файла — это заголовок столбца набора результатов базы данных, который вы попросили psql вывести. Вы можете подавить его, используя аргумент --tuples-only для psql.

\rs в выводе представляют собой «возврат каретки» — половину соглашения «CR LF», используемого программами DOS/Windows для разрывов строк, где система Unix/Linux будет использовать только «LF». Мне не удалось воспроизвести их наличие, но простым, если не на 100% безопасным решением, было бы заменить их. Вы также можете добавить точку с запятой одновременно:

SELECT replace(pg_get_functiondef(f.oid), '\r', '') || ';'
...

Другой вариант исследования — использование pg_dump в режиме «настраиваемого формата» (-Fc), а затем использование pg_restore для выборочного восстановления (или создания SQL для) нужных функций. См. документацию для pg_restore.

person IMSoP    schedule 01.06.2015
comment
Я еще не пробовал загружать его, но похоже, что --tuples-only подавляет все ненужные вещи, включая + и \r. Спасибо. - person Alan Wayne; 02.06.2015
comment
Я не прав. \r сохраняются внутри кортежей. Кроме того, выходной скрипт НЕ содержит терминальную точку с запятой, ; необходимо запустить скрипт в PgAdmin. Я предполагаю, что текстовый процессор может быть использован, чтобы исправить это. Любые другие идеи? - person Alan Wayne; 02.06.2015
comment
Что ж, отсутствующая точка с запятой проста — соедините ее с вашим запросом — и я уже предложил кое-что для \r. Смотрите мою правку. - person IMSoP; 02.06.2015
comment
Получил это. вызов psql с параметром -A --tuples-only также подавляет \r из кортежей. Тем не менее, необходимо добавить завершающую точку с запятой. - person Alan Wayne; 02.06.2015

Спасибо @IMSoP за то, что указал мне правильное направление. Ниже приведены рабочие сценарии, которые я использовал с psql. Никакого редактирования текстового процессора не требуется!

--------------------------------------------------------
File:  dump_stored_prodecures.sql

SELECT pg_get_functiondef(f.oid)||';'
FROM pg_catalog.pg_proc f
INNER JOIN pg_catalog.pg_namespace n ON (f.pronamespace = n.oid)
WHERE n.nspname = 'public';

--------------------------------------------------------
File:  dump_procedures.bat

setlocal
del C:\temp\myprocedures
set PGPASSWORD=***********
"C:\Program Files\PostgreSQL\9.3\bin\psql.exe" -h localhost  -At -U postgres -d chaos -f C:/temp/dump_stored_procedures.sql >> C:/temp/myprocedures
pause
endlocal

----------------------------------------------------------
File:  load_procedures.bat

setlocal
del C:\temp\Errors.txt
set PGPASSWORD=*********
"C:\Program Files\PostgreSQL\9.3\bin\psql.exe" -1 -v ON_ERROR_STOP -h xxx.xxx.xxx.xxx -p 5432 -U postgres -d chaos  -f C:/temp/myprocedures  2>> C:/temp/Errors.txt
notepad C:/temp/Errors.txt
endlocal

Использование: В командной строке DOS запустите dump_procedures.bat, чтобы создать текстовый файл «myprocedures». Затем запустите load_procedures.bat, чтобы изменить базу данных PostgreSQL. Обязательно прочитайте файл Errors.txt!

Надеюсь, это поможет кому-то.

person Alan Wayne    schedule 03.06.2015