使用以下代码,文本文件" 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$
等等等......,
答案 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文件!
希望这有助于某人。