Postgresql中的I/O文件操作
我是全新的Postgresql中的I/O文件操作,postgresql,utl-file,Postgresql,Utl File,我是全新的PostgreSQL,我需要有人给我指路 关于如何将函数结果写入文本的正确方向 文件在PostgreSQLPL/pgSQL 语言?我以前在Oracle中使用UTL\u文件命令执行过此操作 我希望PostgreSQL具有类似的功能。提前感谢您提供的任何帮助 请提供一些文件操作的示例 CREATE OR REPLACE FUNCTION NP_AC015_FETCH.proc_log (P_MSG text, P_MODE integer default 1) RETURN
PostgreSQL
,我需要有人给我指路
关于如何将函数结果写入文本的正确方向
文件在PostgreSQLPL/pgSQL
语言?我以前在Oracle
中使用UTL\u文件
命令执行过此操作
我希望PostgreSQL具有类似的功能。提前感谢您提供的任何帮助
请提供一些文件操作的示例
CREATE OR REPLACE FUNCTION NP_AC015_FETCH.proc_log (P_MSG text, P_MODE integer default 1) RETURNS VOID AS $body$
DECLARE
V_F_IS_OPEN boolean; --IF LOG FILE IS ALREADY OPEN THIS IS SET TO TRUE
V_LOG_MSG varchar(32767); --LOG FILE NAME
V_LOG_DIR varchar(30) := 'ND_GANJIS_LOG_DIR'; --LOG DIRECOTY
vTemp UTL_FILE.FILE_TYPE;
BEGIN
select get_var('GM_LOG_FILE') INTO vTemp;
V_F_IS_OPEN := utl_file.is_open(vTemp);
if not V_F_IS_OPEN then
-- Log File Open
-- 32767 IS THE MAXIMUM NUMBER OF CHARACTERS PER LINE, INCLUDING THE NEWLINE CHARACTER, FOR THIS FILE.
vTemp := UTL_FILE.FOPEN(V_LOG_DIR, 'NIA_PLSQL_'||to_char(clock_timestamp(), 'yyyymmdd')||'.log', 'A', 32767);
end if;
-- LOG MSG TO BE WRITTEN TO THE LOG FILE
V_LOG_MSG := TO_CHAR(CURRENT_TIMESTAMP, 'yyyy/mm/dd hh24:mi:ss:ff3') ||' '|| P_MSG;
--Output messages to a file
UTL_FILE.PUT_LINE(vTemp, V_LOG_MSG);
--Closing Log File
if P_MODE = current_setting('NP_AC015_FETCH.PV_LOG_CLOSE_MODE')::pls_integer and utl_file.is_open(vTemp) then
utl_file.fclose(vTemp);
end if;
--HERE THE EXCEPTION PART IS NOT INCLUDED,
--Reason: PROGRAM WILL GO ON INFINITE LOOP IF SOME ERROR OCCURS HERE, BECAUSE, EACH EXCEPTION WRITES INTO
--LOG FILE, USING THIS PROCEDURE.
exception
when others then
RAISE EXCEPTION '%', dbms_utility.format_error_backtrace||chr(10)||dbms_utility.format_error_stack||chr(10)||dbms_utility.format_call_stack, true;
END;
$body$
LANGUAGE PLPGSQL;
您可以安装contrib模块并使用函数pg\u file\u write(文件名文本、数据文本、附加布尔值)
请注意,此功能仅限于超级用户,但您可以创建超级用户拥有的
安全定义器功能,为您选择的用户提供必要的功能。您可能需要查找外部数据包装器。PostgreSQL中没有类似于UTL_文件的内容@Jayadevan…谢谢你的回复。您可以发布关于如何使用FDW将数据导出到文本文件的示例吗?看起来FDW是只读的。这是否符合您的需要?我测试了一个稍微修改过的代码版本,它成功了。下面是代码创建或替换函数dynamiccopy(tablename text,outname text)返回void作为$body$begin execute format('copy(select*from%s)to'/tmp/%s.csv'',tablename,outname');end$body$language plpgsql;