在 PLPGSQL/Orafce 中转换文本
Posted
技术标签:
【中文标题】在 PLPGSQL/Orafce 中转换文本【英文标题】:Convert text in PLPGSQL/Orafce 【发布时间】:2021-02-21 20:07:27 【问题描述】:从 Oracle 转换后,我正在使用 PL/pgSQL 和 Orafce。在一个函数中,我正在写一个文件。我想用 LATIN1 编码来写。我的数据库是 UTF8 格式的。
有 convert
函数,但我想我错过了一些东西,因为我似乎没有找到我的用例。
convert('testé', 'UTF8', 'LATIN1') ==> in BYTEA test\351
问题是这个函数返回bytea
。我怎样才能得到text
?
【问题讨论】:
【参考方案1】:我认为您实际上需要将 text
从数据库编码转换为以不同编码编码的 bytea
的 convert_to
函数:
SELECT convert_to('testé', 'LATIN1');
convert_to
--------------
\x74657374e9
(1 row)
您不能将结果设为text
,因为该字节序列不是有效的 UTF-8 编码字符串,而且 PostgreSQL 无法容忍这种数据损坏。
不幸的是 orafce 似乎没有提供将二进制数据写入文件的功能,但也许COPY
可以帮助您:
COPY (SELECT textdata FROM texttable ORDER BY something)
TO 'latin1file' (ENCODING 'LATIN1', FORMAT 'csv');
唯一的缺点是COPY
会转义某些字符,例如"
和,
,因此您可能需要选择未出现在字符串中的分隔符或定界符。
【讨论】:
是的,我也尝试过 convert_to,不幸的是我最后遇到了同样的问题。对于 COPY 函数,我用它来导出 CSV 文件,但在我的情况下,我在 plpgsql 函数中多次依赖 UTL_FILE.FILE_TYPE,那么我如何使用 COPY 函数写入 FILE_TYPE 呢? 用 orafce 是做不到的,因为它不支持写入二进制数据,rigt? 是的,这就是为什么我听从了你的建议,我将使用这样的 COPY 命令:command := concat('COPY (',vl_param_query,') TO PROGRAM ''cat>>', vl_param_rapport_path, ''' WITH (ENCODING ''LATIN1'')');
,它工作正常。但该函数接受 2 个参数,文件 UTL_FILE.FILE_TYPE 和内容文本。所以现在我必须找到一种从 UTL_FILE.FILE_TYPE 获取文件路径的方法,这似乎是不可能的
FILE_TYPE
是什么?
似乎它只是一个表示文件的整数,所以我的函数看起来像prc_put_line (vl_param_rapport UTL_FILE.FILE_TYPE, vl_param_string text )
并且必须在报告中添加一行。所以我目前的解决方法是在调用 prc_put_line 函数的函数中添加类似set_config('utl_file.' || vl_outputfile, filepath, false);
的文件路径,并使用current_setting('utl_file.' || vl_param_rapport)
在 prc_put_line 函数中取回它,但我宁愿找到一个更优雅的解决方案
以上是关于在 PLPGSQL/Orafce 中转换文本的主要内容,如果未能解决你的问题,请参考以下文章
sh Magento Cloud - 修复PLP中缺少的产品
运行需要终端输入的 PLP/SQL 过程的 shell 脚本,然后将 shell 进程移至后台