小编use*_*502的帖子

为什么在CLOB上使用REPLACE函数导致CACHE_LOBS增加...?

我需要在CLOB变量上使用内置的REPLACE函数作为更大的PL/SQL过程的一部分.我正在使用Oracle 11g R2并且该功能正常工作,因为它根据需要进行替换,但随着过程运行(要处理大约250万条记录),它会严重减慢 - 如:

  • 前20,000条记录:~12分钟
  • 第二个20,000记录:~24分钟
  • 第三个20,000记录:~37分钟
  • 第四万条记录:~52分钟
  • 等等...

在操作期间检查V $ TEMPORARY_LOBS表明CACHE_LOBS的值随着每一行的处理而增加 - 我的假设是这意味着与LOBS相关联的内存(在这种情况下为CLOBS)一旦被使用就不会被释放......?

使用PL/SQL调试器逐步执行代码会发现每次调用REPLACE函数时CACHE_LOBS的值都会增加2.函数调用遵循以下方式:

clobRTFText         CLOB;
...
dbms_lob.createtemporary(clobRTFText, TRUE, dbms_lob.call);
...
clobRTFText := REPLACE(clobRTFText, '<CR>', '\par ');  <== Causes CACHE_LOBS to increase by 2
...
dbms_lob.freetemporary(clobRTFText); <== Doesn't seem to cause CACHE_LOBS to decrease 
Run Code Online (Sandbox Code Playgroud)

好像上面的第三行代码正在动态创建更多的CLOB变量.这是因为由于REPLACE函数需要VARCHAR2参数,会发生某种隐式类型转换吗?我已经尝试过使用dbms_lob.copy而不是"clobRTFText:= REPLACE ...等",但它实际上更糟糕(即CACHE_LOBS增加得更快).无论是什么原因,对dbms_lob.freetemporary的调用似乎对CACHE_LOBS的值没有任何影响.

我已经浏览了Oracle文档的LOB部分的PL/SQL语义部分 - 它提到了CLOB和VARCHAR2变量可以在内置函数中使用的方式,但我找不到任何关于这样做可能导致额外内存使用的事情.

有没有人有任何想法为什么会发生这种情况或如何做到这一点(即使用REPLACE与CLOB)没有它无法释放内存(假设确实发生了什么)?

谢谢

oracle plsql clob oracle11gr2

5
推荐指数
1
解决办法
8905
查看次数

需要批量将大量文本文件从 ANSI 转换为 Unicode

我有很多大小不同(从几 KB 到 1GB+)的 ANSI 文本文件,我需要将它们转换为 Unicode。

目前,这是通过将文件加载到记事本中,然后执行“另存为...”并选择 Unicode 作为编码来完成的。显然这是非常耗时的!

我正在寻找一种一次性转换所有文件的方法(在 Windows 中)。这些文件位于目录结构中,因此需要能够遍历完整的文件夹结构并转换其中的所有文件。

我尝试了一些选项,但到目前为止还没有真正满足所有要求:

  • ansi2unicode命令行实用程序。这是最接近我所追求的,因为它在文件夹结构中递归处理文件......但在完成转换之前运行时它不断崩溃。
  • CpConverter GUI 实用程序。在某种程度上工作正常,但在文件夹结构中处理多个文件时遇到困难 - 似乎只能处理一个文件夹中的文件
  • 有一个DOS 命令可以在较小的文件上正常工作,但似乎无法处理大文件。
  • 尝试过GnuWin sed 实用程序,但每次我尝试安装它时它都会崩溃

所以我还在找!如果有人有任何建议,我将非常感激

谢谢...

unicode ansi

3
推荐指数
1
解决办法
1万
查看次数

标签 统计

ansi ×1

clob ×1

oracle ×1

oracle11gr2 ×1

plsql ×1

unicode ×1