105. unaccent
105.1. 插件unaccent简介
unaccent是一个文本搜索字典,它能从词位中移除重音(附加符号)。它是一个过滤词典,这表示它的输出总是会被传递给下一个字典(如果有),这和字典的通常行为不同。这允许为全文搜索做与重音无关的处理。
unaccent的当前实现不能被用作thesaurus字典的正规化字典。
105.2. 插件unaccent加载方式
create extension unaccent;
105.3. 插件unaccent的参数配置
unaccent字典接受下列选项:
*
RULES是包含翻译规则列表的文件的基本名。这个文件必须被存储在$SHAREDIR/tsearch_data/(这里$SHAREDIR表示KES安装的共享数据目录)中。它的名称必须以.rules(不包含在RULES参数中)结束。
规则文件具有下面的格式:
*
每一行表示一个由带有重音的字符和不带重音的字符构成的对。第一个字符将被翻译成第二个。例如:
À A Ằ A Ặ A
两个字符必须由空格分隔,并且一行上的任何前导或尾随空白都将被忽略。
*
或者,如果一行只给出一个字符,则删除该字符的实例; 这在用单独的字符表示重音的语言中是有用的。
*
实际上,每个“字符”可以是不包含空格的任何字符串,因此, 除了去除变音符之外,unaccent字典也可以用于其他类型的字符串替换。
*
规则文件必须以UTF-8编码方式存储。加载时,数据将自动转换为当前数据库的编码。 任何含有不可翻译字符的行都将被忽略,因此规则文件可以包含当前编码中不适用的规则。 在unaccent.rules中可以找到一个更完整的例子,它可以直接用于大部分欧洲语言,当unaccent模块被安装时,它被安装在$SHAREDIR/tsearch_data/中。
105.4. 插件unaccent的使用方法
安装unaccent扩展会创建一个文本搜索模板unaccent和一个基于前者的字典unaccent。unaccent字典有默认的参数设置RULES='unaccent',这会让该字典使用标准的unaccent.rules文件。如果希望修改该参数,可以
alter text search dictionary unaccent (rules='my_rules');
其中my_rules需要用户自行建立。
或者基于该模板创建新的字典。
要测试该字典,可以尝试如下方法:
select ts_lexize('unaccent','Hộtel'); ts_lexize ----------- {Hotel} (1 row)
这里是一个展示把unaccent字典插入到一个文本搜索配置的例子:
create text search configuration fr ( copy = french ); alter text search configuration fr alter mapping for hword, hword_part, word with unaccent, french_stem; select to_tsvector('fr','Hộtels de la Mer'); to_tsvector ------------------- 'hotel':1 'mer':4 (1 row) select to_tsvector('fr','Hộtel de la Mer') @@ to_tsquery('fr','Hotels'); ?column? ---------- t (1 row) select ts_headline('fr','Hộtel de la Mer',to_tsquery('fr','Hotels')); ts_headline ------------------------ <b>Hộtel</b> de la Mer (1 row)
unaccent()函数从一个给定的字符串中移除重音(附加符号)。基本上,它是unaccent字典的一个包装器,但是它能在普通的文本搜索环境之外使用。
unaccent([dictionary regdictionary, ] string text) returns text
如果省略dictionary参数,则使用名为unaccent并且与unaccent()函数有相同模式的文本搜索词典。
例如:
select unaccent('unaccent', 'Hộtel'); unaccent ----------- Hotel (1 row) select unaccent('Hộtel'); unaccent ----------- Hotel (1 row)
105.5. 插件unaccent卸载方法
drop extension unaccent;
105.6. 插件unaccent升级方法
unaccent扩展插件通常随着KingbaseES安装包一并升级。通常情况下用户无须单独升级些插件。
106. utl_file
106.1. 插件utl_file简介
插件utl_file补充了一些对于文件操作的函数。
-
插件名为 utl_file
-
插件版本 V1.0
106.2. 插件utl_file加载方式
在命令行执行create extension utl_file;
示例
create extension utl_file;
106.3. 插件utl_file的参数配置
无需配置任何参数
106.4. 插件utl_file的使用方法
加载插件ltree后,按照如下方式使用相应功能
106.4.1. utl_file.fopen
utl_file.fopen打开一个文件,返回一个文件句柄
语法
fopen(location text, filename text, open_mode text, max_linesize integer, encoding name) 返回integer fopen(location text, filename text, open_mode text, max_linesize integer) 返回integer
参数
location:指定文件的位置。
filename:指定要打开的文件名。
open_mode:指定文件要打开的模式。
encoding:指定编码字符集。
返回值
UTL_FILE.FILE_TYPE(int类型)。 open_mode可以是'R','W','A'。utl_file.fopen为procedure。
示例
DROP DIRECTORY IF EXISTS MY_DIR; CREATE DIRECTORY MY_DIR AS '/tmp/'; -- 这个目录需要存在,或者人为手工创建。 DROP PROCEDURE IF EXISTS TEST_FOPEN; \set SQLTERM / CREATE OR REPLACE PROCEDURE TEST_FOPEN( V_OUT_DATA IN VARCHAR2, V_SQLPARAM IN VARCHAR2 ) AS DECLARE OUT_DATA VARCHAR2(30000); FILE_HANDLE UTL_FILE.FILE_TYPE; FILD_NAME VARCHAR2(1000) DEFAULT 'output.txt'; BEGIN OUT_DATA := V_OUT_DATA; FILE_HANDLE := UTL_FILE.FOPEN('MY_DIR', FILD_NAME, 'A', 30000); UTL_FILE.PUT_LINE(FILE_HANDLE, OUT_DATA); UTL_FILE.PUT_LINE(FILE_HANDLE, V_SQLPARAM); UTL_FILE.FCLOSE(FILE_HANDLE); END TEST_FOPEN; / \set SQLTERM ; CALL TEST_FOPEN('111', '222'); --执行成功后可看到输入的文字。 \! cat /tmp/output.txt
106.4.2. utl_file.put_line
utl_file.put_line在文件中写入一行内容
语法
put_line(file file_type, buffer text); put_line(file file_type, buffer text, autoflush bool);
参数
file:指定UTL_FILE.FILE_TYPE类型值。
buffer:指定目标文件名。
autoflush:指定是否自动刷新。
返回值
无返回值。
注解
utl_file.put_line为procedure。
示例
DROP DIRECTORY IF EXISTS MY_DIR; CREATE DIRECTORY MY_DIR AS '/tmp/'; -- 这个目录需要存在,或者人为手工创建。 DROP PROCEDURE IF EXISTS TEST_FOPEN; \set SQLTERM / CREATE OR REPLACE PROCEDURE TEST_PUT_LINE( V_OUT_DATA IN VARCHAR2, V_SQLPARAM IN VARCHAR2 ) AS DECLARE OUT_DATA VARCHAR2(30000); FILE_HANDLE UTL_FILE.FILE_TYPE; FILD_NAME VARCHAR2(1000) DEFAULT 'output.txt'; BEGIN OUT_DATA := V_OUT_DATA; FILE_HANDLE := UTL_FILE.FOPEN('MY_DIR', FILD_NAME, 'A', 30000); UTL_FILE.PUT_LINE(FILE_HANDLE, OUT_DATA); UTL_FILE.PUT_LINE(FILE_HANDLE, V_SQLPARAM); UTL_FILE.FCLOSE(FILE_HANDLE); END TEST_PUT_LINE; / \set SQLTERM ; call TEST_PUT_LINE('111', '222'); --执行成功后可看到输入的文字。 \! cat /tmp/output.txt
106.4.3. utl_file.put
utl_file.put将数据强制写入到文件中
语法
put(file file_type, buffer text);
参数
file:指定UTL_FILE.FILE_TYPE类型值。 buffer:指定目标文件名。
返回值
无返回值
注解
utl_file.put为procedure。
示例
同utl_file.putline。
106.4.4. utl_file.fclose
utl_file.fclose关闭目标文件
语法
fclose(file file_type);
参数
file指定UTL_FILE.FILE_TYPE类型值。
返回值
无返回值。
返回值
utl_file.fclose为procedure。
示例
\set SQLTERM / CREATE or replace PROCEDURE proc1() as DECLARE dirname VARCHAR(100) DEFAULT 'my_dir'; v_empfile_src UTL_FILE.FILE_TYPE; v_empfile_tgt UTL_FILE.FILE_TYPE; v_src_file VARCHAR(20) DEFAULT 'output.txt'; v_dest_file VARCHAR(20) DEFAULT 'test.txt'; v_empline VARCHAR(200); begin v_empfile_src = UTL_FILE.FOPEN(dirname,v_src_file,'r'); v_empfile_tgt = UTL_FILE.FOPEN(dirname,v_dest_file,'w'); LOOP BEGIN UTL_FILE.GET_LINE(v_empfile_src,v_empline); UTL_FILE.PUT(v_empfile_tgt,v_empline); UTL_FILE.NEW_LINE(v_empfile_tgt); UTL_FILE.FFLUSH(v_empfile_tgt); EXCEPTION WHEN OTHERS THEN EXIT; END; END LOOP; DBMS_OUTPUT.PUT_LINE('Updated file: ' || v_dest_file); UTL_FILE.FCLOSE(v_empfile_tgt); UTL_FILE.FCLOSE(v_empfile_src); END proc1; / \set SQLTERM ;
106.4.5. utl_file.fclose_all
utl_file.fclose_all关闭所有文件
语法
utl_file.fclose_all();
参数
无参数
返回值
无返回值。
注解
utl_file.fclose_all为procedure。
示例
\set SQLTERM / CREATE OR REPLACE FUNCTION read_file(dir text) RETURNS void AS $$ DECLARE f utl_file.file_type; BEGIN f := utl_file.fopen(dir, 'regress_orafce.txt', 'r'); FOR i IN 1..11 LOOP RAISE NOTICE '[%] >>%<<', i, utl_file.get_line(f); END LOOP; RAISE NOTICE '>>%<<', utl_file.get_line(f, 4); RAISE NOTICE '>>%<<', utl_file.get_line(f, 4); RAISE NOTICE '>>%<<', utl_file.get_line(f); RAISE NOTICE '>>%<<', utl_file.get_line(f); EXCEPTION -- WHEN no_data_found THEN, 8.1 plpgsql doesn't know no_data_found WHEN others THEN RAISE NOTICE 'finish % ', sqlerrm; RAISE NOTICE 'is_open = %', utl_file.is_open(f); PERFORM utl_file.fclose_all(); RAISE NOTICE 'is_open = %', utl_file.is_open(f); END; $$ LANGUAGE plpgsql; / \set SQLTERM ;
106.4.6. utl_file.get_line
utl_file.get_line返回文件的一行。
语法
get_line(file integer, OUT buffer text); get_line(file integer, OUT buffer text, len integer);
参数
file:指定UTL_FILE.FILE_TYPE类型值。
buffer:指定输出的文件。
len:指定想要输出的特定行。
返回值
无返回值。
注解
utl_file.get_line为procedure。
示例
\set SQLTERM / CREATE OR REPLACE PROCEDURE TEST_GET_LINE as vInHandle UTL_FILE.FILE_TYPE; vNewLine VARCHAR2(250); BEGIN vInHandle = utl_file.fopen('MY_DIR', 'test.txt','R'); utl_file.get_line(vInHandle, vNewLine); RAISE NOTICE '>>%<<', vNewLine; utl_file.fclose(vInHandle); END TEST_GET_LINE; / \set SQLTERM ;
106.4.7. utl_file.new_line
utl_file.new_line为文本增加行终止符。
语法
new_line(file integer); new_line(file integer, lines int);
参数
file:指定UTL_FILE.FILE_TYPE类型值。
lines:指定需要操作的行数。
返回值
无返回值。
注解
utl_file.new_line为procedure。
示例
\set SQLTERM / CREATE DIRECTORY MY_DIR AS '/tmp/'; declare vInHandle utl_file.file_type; begin vInHandle := utl_file.fopen('MY_DIR', 'output.txt', 'w'); utl_file.new_line(vInHandle, 2); utl_file.fclose(vInHandle); end; / \set SQLTERM ;
106.4.8. utl_file.fflush
utl_file.fflush清空目标文件。
语法
fflush(file integer);
参数
file指定UTL_FILE.FILE_TYPE类型值。
返回值
无返回值。
注解
utl_file.fflush为procedure。
示例
\set SQLTERM / CREATE or replace PROCEDURE proc1() as DECLARE dirname VARCHAR(100) DEFAULT 'my_dir'; v_empfile_src UTL_FILE.FILE_TYPE; v_empfile_tgt UTL_FILE.FILE_TYPE; v_src_file VARCHAR(20) DEFAULT 'output.txt'; v_dest_file VARCHAR(20) DEFAULT 'test.txt'; v_empline VARCHAR(200); begin v_empfile_src = UTL_FILE.FOPEN(dirname,v_src_file,'r'); v_empfile_tgt = UTL_FILE.FOPEN(dirname,v_dest_file,'w'); LOOP BEGIN UTL_FILE.GET_LINE(v_empfile_src,v_empline); UTL_FILE.PUT(v_empfile_tgt,v_empline); UTL_FILE.NEW_LINE(v_empfile_tgt); UTL_FILE.FFLUSH(v_empfile_tgt); EXCEPTION WHEN OTHERS THEN EXIT; END; END LOOP; DBMS_OUTPUT.PUT_LINE('Updated file: ' || v_dest_file); UTL_FILE.FCLOSE(v_empfile_tgt); UTL_FILE.FCLOSE(v_empfile_src); END proc1; / \set SQLTERM ;
106.5. 插件utl_file卸载方法
卸载时drop extension utl_file即可。
示例
drop extension utl_file;
106.6. 插件utl_file升级方法
utl_file扩展插件通常随着KingbaseES安装包一并升级。通常情况下用户无须单独升级些插件。
107. uuid-ossp
107.1. 插件uuid-ossp简介
插件uuid-ossp是uuid生成工具。
-
插件名为 uuid-ossp
-
插件版本 V1.0
107.2. 插件uuid-ossp加载方式
使用时需要在命令行执行create extension "uuid-ossp";
示例:
create extension "uuid-ossp";
107.3. 插件uuid-ossp的参数配置
无需配置任何参数。
107.4. 插件uuid-ossp的使用方法
加载插件uuid-ossp后,用uuid_generate_v1()或uuid_generate_v4()函数生成UUID值。 uuid_generate_v1()与计算机的MAC地址和时间戳有关。 uuid_generate_v4()生成随机的uuid。
示例:
select uuid_generate_v1(); uuid_generate_v1 -------------------------------------- c12bedf0-d7b4-11ec-8340-20040feac55c (1 行记录) select uuid_generate_v4(); uuid_generate_v4 -------------------------------------- 83e19b37-8195-4823-a6b7-82a1ed5cc668 (1 行记录)
107.5. 插件uuid-ossp卸载方法
卸载时drop extension uuid-ossp即可。
示例:
drop extension "uuid-ossp";
107.6. 插件uuid-ossp升级方法
uuid-ossp扩展插件通常随着KingbaseES安装包一并升级。通常情况下用户无须单独升级些插件。