日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

(Oracle)关于blob转到目标库报ORA-01461: 仅能绑定要插入 LONG 列的 LONG 值错误解决方案...

發(fā)布時間:2023/12/10 编程问答 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (Oracle)关于blob转到目标库报ORA-01461: 仅能绑定要插入 LONG 列的 LONG 值错误解决方案... 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在數(shù)據(jù)抽取時,開發(fā)需要clob類型的數(shù)據(jù),但是目標庫類型是blob類型的,于是抽取的時候報錯:

ORA-01461: 僅能綁定要插入 LONG 列的 LONG 值錯誤

可能有以下幾種原因:

可能有以下幾種原因:

1、插入到字符串長度大于4000字節(jié)。

2、插入到表中的記錄的某個字段數(shù)據(jù)的實際長度大于2000個字節(jié)(如果是UTF-8,則是1333個字節(jié));或者是插入的記錄中有兩個或兩個以上長度大于2000字節(jié)的字符串。

3、數(shù)據(jù)庫與客戶端的JDBC 驅(qū)動不匹配。對于UTF-8或歐洲的某些字符集,oracle在存儲時,對于一個字符需要2個或3個字節(jié)的存儲空間,雖然表定義中為 varchar2(4000),但是其實該字段的data_length為其2倍或3倍長。這種情況下oracle會把data_length長度超過 4000的當做LONG型處理,你的表中有兩個這樣的字段,插入數(shù)據(jù)時相當于同時操作2個LONG字段。

4、使用9i的及以下的版本引發(fā)的bug. 10.1.0.1版本中已經(jīng)修復(fù)bug

我這邊遇到的是第一種,字符串長度大于4000了。

解決方法:

創(chuàng)建函數(shù)進行轉(zhuǎn)換就可以了。

函數(shù)如下:

CREATE OR REPLACE FUNCTION BlobToClob(blob_in IN BLOB) RETURN CLOB ASv_clob CLOB;v_varchar VARCHAR2(32767);v_start PLS_INTEGER := 1;v_buffer PLS_INTEGER := 32767; BEGINDBMS_LOB.CREATETEMPORARY(v_clob, TRUE);FOR i IN 1 .. CEIL(DBMS_LOB.GETLENGTH(blob_in) / v_buffer) LOOPv_varchar := UTL_RAW.CAST_TO_VARCHAR2(DBMS_LOB.SUBSTR(blob_in,v_buffer,v_start));DBMS_LOB.WRITEAPPEND(v_clob, LENGTH(v_varchar), v_varchar);DBMS_OUTPUT.PUT_LINE(v_varchar);v_start := v_start + v_buffer;END LOOP;RETURN v_clob; END BlobToClob;

?blob轉(zhuǎn)varchar

CREATE OR REPLACE Function Blob_To_Varchar (Blob_In In Blob) Return Varchar2 IsV_Varchar Varchar2(4000);V_Start Pls_Integer := 1;V_Buffer Pls_Integer := 4000; BeginIf Dbms_Lob.Getlength(Blob_In) Is Null ThenReturn '';End If;For I In 1..Ceil(Dbms_Lob.Getlength(Blob_In) / V_Buffer) Loop--當轉(zhuǎn)換出來的字符串亂碼時,可嘗試用注釋掉的函數(shù)--V_Varchar := Utl_Raw.Cast_To_Varchar2(Utl_Raw.Convert(Dbms_Lob.Substr(Blob_In, V_Buffer, V_Start),'SIMPLIFIED CHINESE_CHINA.ZHS16GBK', 'AMERICAN_THE NETHERLANDS.UTF8'));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;

?

轉(zhuǎn)載于:https://www.cnblogs.com/littlewu/p/7798240.html

總結(jié)

以上是生活随笔為你收集整理的(Oracle)关于blob转到目标库报ORA-01461: 仅能绑定要插入 LONG 列的 LONG 值错误解决方案...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。