pg_get_functiondef() 中的脚本如何用于在 Postgresql 中创建存储过程?

How can script from pg_get_functiondef() be used to create stored procedures in Postgresql?

使用以下代码,创建包含存储过程的文本文件 "myprocedures"。

有没有办法不加改动就把这个文件应用到另一台机器上的现有数据库中?或者如何最好地使用这个文件在另一个数据库上生成程序? (即,如何在 PgAdmin 或 psql 中直接使用它?)。

我的问题是脚本中生成的某些符号(如“+”和“\r”)无法被

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

TIA

PostgreSQL 版本 9.3

Windows 7 终极版

PgAdmin 三

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.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  ~ '^[[: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 = \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 = \r                                                                                                                                                                                                                                                                                                                                                 +
         order by\r                                                                                                                                                                                                                                                                                                                                                             +
                 tencounter asc\r                                                                                                                                                                                                                                                                                                                                               +
         ) j\r                                                                                                                                                                                                                                                                                                                                                                  +
 on (v.eid = j.eid)                              \r                                                                                                                                                                                                                                                                                                                             +
   $function$                   

等等等等等等....

文件顶部的 pg_get_functiondef 是您要求 psql 输出的数据库结果集的列 header。您可以使用 psql.

--tuples-only 参数来抑制它

输出中的 \r 表示 "carriage return" - DOS/Windows 程序用于换行的 "CR LF" 约定的一半,其中Unix/Linux 系统只会使用 "LF"。我无法在那里重现它们,但一个简单但不是 100% 安全的解决方案是将它们替换掉。也可以同时加分号:

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

另一个调查选项是在 "custom format" 模式下使用 pg_dump (-Fc),然后使用 pg_restore 有选择地恢复(或生成 SQL for) 所需的功能。参见 the docs for pg_restore

感谢@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.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.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 文件!

希望这对某人有所帮助。