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

时间:2015-06-01 13:10:40

标签: postgresql psql pgadmin

使用以下代码,文本文件" 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

TIA

PostgreSQL版本9.3

Windows 7旗舰版

PgAdmin 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$                   
等等等......,

2 个答案:

答案 0 :(得分:1)

文件顶部的pg_get_functiondef是您要求psql输出的数据库结果集的列标题。您可以使用--tuples-only的{​​{1}}参数来禁止它。

输出中的psql表示“回车” - DOS / Windows程序用于换行的“CR LF”约定的一半,Unix / Linux系统将使用只有“LF”。我无法在那里重现它们,但是一个简单的,如果不是100%安全的解决方案就是将它们替换掉。您还可以同时添加分号:

\r

调查的另一个选项是在“自定义格式”模式(SELECT replace(pg_get_functiondef(f.oid), '\r', '') || ';' ... )中使用pg_dump,然后使用-Fc有选择地还原(或生成SQL)所需的函数。请参阅the docs for pg_restore

答案 1 :(得分:0)

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

希望这有助于某人。