Answers:
类似这样的回答上一个问题,如果你不想要的限制pg_read_file()
(简称:pg_read_file
无法读取数据库目录以外的文件,并在当前会话中的字符编码读取文本)。
此函数适用于任何路径,但需要以超级用户身份创建:
create or replace function stack.bytea_import(p_path text, p_result out bytea)
language plpgsql as $$
declare
l_oid oid;
begin
select lo_import(p_path) into l_oid;
select lo_get(l_oid) INTO p_result;
perform lo_unlink(l_oid);
end;$$;
lo_get
是9.4中引入的,因此对于较旧的版本,您需要:
create or replace function stack.bytea_import(p_path text, p_result out bytea)
language plpgsql as $$
declare
l_oid oid;
r record;
begin
p_result := '';
select lo_import(p_path) into l_oid;
for r in ( select data
from pg_largeobject
where loid = l_oid
order by pageno ) loop
p_result = p_result || r.data;
end loop;
perform lo_unlink(l_oid);
end;$$;
然后:
select convert_from(stack.bytea_import('/tmp/test.xml'), 'utf8')::xml;
pg_read_file()
。使用临时表也可以实现同样的效果COPY
-仅填充1行的1列。
该pg_read_binary_file
功能可以做到这一点。
它具有局限性:PostgreSQL 9.1或更高版本中的新增功能;必须是数据库超级用户拥有的会话;必须读取数据库目录或以下目录中的文件。这些在我的用例中是可以接受的。
因此,以下操作将从XML
文件创建本地值:
-- PostgreSQL 9.1 or later.
SELECT
XMLPARSE(DOCUMENT convert_from(
pg_read_binary_file('foo.xml'), 'UTF8'));
在PostgreSQL 8.3 – 9.0中,pg_read_file
可以使用该函数,但有一个额外的限制,即您不能指定特定于文件的编码(它以当前会话的编码将文件作为文本读取)。
-- PostgreSQL earlier than 9.1.
SELECT
XMLPARSE(DOCUMENT pg_read_file('foo.xml'));