UTL_FILE 包使用介绍

Postgresql 不支持 package功能,这给oracle 向 postgresql迁移增加了很多迁移工作。人大金仓Kingbase数据库实现了类似 oracle package 功能,并提供了许多oracle 环境下常用的package。

本篇介绍 Kingbase UTL_FILE 包。

一、create extension and directory

UTL_FILE 包是通过扩展插件的形式实现的。

test=# create extension utl_file;
CREATE EXTENSION

test=# create or replace directory tmp_dir as '/home/kb86/utl_tmp';
CREATE DIRECTORY

注意:与oracle 不同,oracle directory 需要明确授权给用户,而 kingbase 不需要授权,且不同数据库用户可以共同写一个文件。这个个人觉得应该是权限控制不到位,后续还需完善。

二、UTL_FILE 包函数

 UTL_FILE 包含的函数:

test=# \dx+ utl_file;
           Objects in extension "utl_file"
                  Object description                  
------------------------------------------------------
 function utl_file_fclose_all()
 function utl_file_fclose(integer)
 function utl_file_fflush(integer)
 function utl_file_fopen(text,text,text,integer)
 function utl_file_fopen(text,text,text,integer,name)
 function utl_file_get_line(integer)
 function utl_file_get_line(integer,integer)
 function utl_file_new_line(integer)
 function utl_file_new_line(integer,integer)
 function utl_file_put(integer,anyelement)
 function utl_file_put(integer,text)
 function utl_file_put_line(integer,text)
 function utl_file_put_line(integer,text,boolean)
 package utl_file
 type "utl_file.file_type"

具体函数功能如下:

UTL_FILE.FOPEN ( Location IN VARCHAR2, Filename IN VARCHAR2, Open_mode IN VARCHAR2, Max_linesize IN INT);
功能:打开一个文件,返回一个文件句柄。这里Max_linesize 表示每行最大的字节数。
Open_mode 支持以下几种:
r –只读(文本)
w – 只写(本文)。如果文件已存在,会清空原文件。
a – 追加(文本)。在文件后面添加内容。

UTL_FILE.PUT_LINE ( File IN UTL_FILE.FILE_TYPE, Buffer IN VARCHAR2, Autoflush IN BOOLEAN DEFAULT FALSE);
功能:在文件中写入一行内容,无返回值。

UTL_FILE.NEW_LINE ( File IN UTL_FILE.FILE_TYPE, Lines IN NATURAL:=1 );
功能:写入空行,无返回值。

UTL_FILE.GET_LINE ( File IN UTL_FILE.FILE_TYPE, Buffer OUT VARCHAR2, Linesize IN NUMBER, Len IN integer DEFAULT NULL);
功能:用于从已经打开的文件中读取行内容。

UTL_FILE.FCLOSE_ALL;
功能:将会关闭本次session所有打开的文件。

UTL_FILE.FFLUSH
功能:强制将缓冲的数据写入文件。

UTL_FILE.PUT
功能:写入内容到文件中,不带换行符,通常与 new_line 一起使用。

三、使用例子

例子一:

create or replace procedure test_fopen(
  v_out_data in varchar2
)
as
declare
  out_data varchar2(30000);
  file_handle utl_file.FILE_TYPE;
  file_name varchar2(1000) default 'output.txt';
begin
  out_data := v_out_data;
  file_handle := utl_file.fopen('tmp_dir', file_name, 'a', 30);
  utl_file.put_line(file_handle, out_data);
  utl_file.fclose(file_handle);
end test_fopen;

 

例子二:

create or replace procedure test_get_line()
as
declare
  vinhandle utl_file.file_type;
  vnewline varchar2(250);
begin
  vinhandle := utl_file.fopen('tmp_dir', 'output.txt','r');
  loop
    begin
      utl_file.get_line(vinhandle, vnewline);
      dbms_output.put_line(vnewline);
    exception
      when others then
      exit;
    end;
  end loop;
  utl_file.fclose(vinhandle);
end test_get_line;

  

posted @ 2021-05-25 08:18  KINGBASE研究院  阅读(683)  评论(0编辑  收藏  举报