请教下oracle中clob超4000长度 ,转字符串的函数怎么写?
建议参考:https://blog.csdn.net/qq_39615545/article/details/118119150
Create Or Replace Function Blob_To_Varchar (Blob_In In Blob) Return Varchar2
Is
V_Varchar Varchar2(4000);
V_Start Pls_Integer := 1;
V_Buffer Pls_Integer := 2000;
Begin
If Dbms_Lob.Getlength(Blob_In) Is Null Then
Return '';
End If;
For I In 1..Ceil(Dbms_Lob.Getlength(Blob_In) / V_Buffer) Loop
-- 当转换出来的字符串乱码时: 'AMERICAN_AMERICA.ZHS16GBK' 'SIMPLIFIED CHINESE_CHINA.ZHS16GBK', 'AMERICAN_THE NETHERLANDS.UTF8'
-- Convert 可以忽略当前2进制数据存储使用的字符集(第三个参数) 'ZHS16GBK' 'AL32UTF8' 'ZHS32GB18030' 'ZHS16CGB231280'
-- V_Varchar := Utl_Raw.Cast_To_Varchar2(UTL_RAW.CONVERT(Dbms_Lob.Substr(Blob_In, V_Buffer), 'AL32UTF8', 'AMERICAN_AMERICA.ZHS16GBK'));
V_Varchar := Utl_Raw.Cast_To_Varchar2(Dbms_Lob.Substr(Blob_In, V_Buffer, V_Start));
V_Start := V_Start + V_Buffer;
End Loop;
Return V_Varchar;
End Blob_To_Varchar;
SELECT Blob_To_Varchar(HEAD_IMG) FROM table WHERE HEAD_IMG IS NOT NULL;
加一个工具就可以了
如有帮助,望采纳
public static String clob2String(Clob clob){
if(null == clob){
return "";
}
Reader is = null;
try{
is = clob.getCharacterStream();
BufferedReader br = new BufferedReader(is);
StringBuilder sb = new StringBuilder();
String temp = br.readLine();
while(temp != null){
sb.append(temp);
temp = br.readLine();
}
return sb.toString();
}catch (Exception e) {
return "clobtostring转换失败";
}finally {
try{
if(is != null){
is.close();
}
}catch (Exception e) {
e.printStackTrace();
}
}
}
提供参考实例,实例用2种思路去解析如何转换字符串:【oracle超过4000的字符 clob(oracle clob超过4000如何转字符串)】,链接:https://dianzubuluo.com/%E6%9C%AA%E5%91%BD%E5%90%8D/117214.html
第一种方法:使用组件System.Data.OracleClient的方法来实现
第二种方法:使用组件Oracle.DataAccess的方法实现
-----如果数据库是12C以后版本,开启扩展支持参数,varchar2可以达到32K。
-----select 查询CLOB字段可以默认转换varchar2,超出部分截断。
------如果超过CLOB均超过32K以上,再考虑使用存储过程,分段获取CLOB。
使用DBMS_LOB.SUBSTR,参考例子:
CREATE OR REPLACE PROCEDURE Example_14a IS
src_lob CLOB;
pos INTEGER := 2147483647;
buf VARCHAR2(32000);
BEGIN
SELECT c_lob INTO src_lob FROM lob_table
WHERE key_value = 21;
buf := DBMS_LOB.SUBSTR(src_lob, 32767, pos);
-- process the data
END;
CREATE OR REPLACE PROCEDURE Example_14b IS
fil BFILE;
pos INTEGER := 2147483647;
pattern RAW;
BEGIN
SELECT f_lob INTO fil FROM lob_table WHERE key_value = 21;
dbms_lob.fileopen(fil, dbms_lob.file_readonly);
pattern := dbms_lob.substr(fil, 255, pos);
dbms_lob.fileclose(fil);
END;