在 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 从数据库编码转换为以不同编码编码的 byteaconvert_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 中转换文本的主要内容,如果未能解决你的问题,请参考以下文章

如何在位图中转换 NV21 图像格式?

Magento 1.14.2.2在PLP上翻转图像

sh Magento Cloud - 修复PLP中缺少的产品

运行需要终端输入的 PLP/SQL 过程的 shell 脚本,然后将 shell 进程移至后台

结构化PLP-SLAM:单目RGB-D和双目相机使用点线面的高效稀疏建图与定位方案

我可以在 JavaScript 中转义 HTML 特殊字符吗?