我正在使用具有长字符(CLOB)字段的Oracle 12c数据库。需要将其加载到Snowflake数据仓库中,该仓库不具有CLOB等效项(它只是将VARCHAR用于所有字符串字段)。
虽然我们可以将CLOB列正确地转换为VARCHAR2,但它包含的值超过4000个字符,这当然会返回一个错误,即该值对于其数据类型而言太长。
我搜索了使用CAST的替代方法,并找到了其他方法。示例:
select dbms_lob.substr(ha.log,8000,1) log
from ha
当我通过Oracle SQL Developer执行该操作时,它将返回预期的结果。但是,当尝试使用我们的ETL应用程序(使用Oracle JDBC Thin驱动程序12.2.0.1)加载到Snowflake数据仓库时,Oracle返回以下错误:
ORA-06502:PL / SQL:数字或值错误:字符串缓冲区太小
ORA-06512:在第1行
我无法找到原因,但是我找到了另一个解决方案,那就是将CLOB分解成这样:
SELECT TO_CHAR(SUBSTR(ha.log,0,3999)) log
FROM ha
这又返回了另一个错误:
ORA-64203:目标缓冲区太小,无法在字符集转换后保存CLOB数据。
该错误似乎表明目的地由于值太大而无法存储该值,但事实并非如此。 Snowflake VARCHAR字段可以存储大量数据(类似于SQL Server中的VARCHAR(MAX))。
我怀疑JDBC驱动程序中可能有一些与缓冲区大小相关的设置需要调整,但是对此却不熟悉。任何帮助将不胜感激。