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 文件!
希望这对某人有所帮助。
使用以下代码,创建包含存储过程的文本文件 "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 文件!
希望这对某人有所帮助。