(Oracle)关于blob转到目标库报ORA-01461: 仅能绑定要插入 LONG 列的 LONG 值错误解决方案...
在數據抽取時,開發需要clob類型的數據,但是目標庫類型是blob類型的,于是抽取的時候報錯:
ORA-01461: 僅能綁定要插入 LONG 列的 LONG 值錯誤
可能有以下幾種原因:
可能有以下幾種原因:
1、插入到字符串長度大于4000字節。
2、插入到表中的記錄的某個字段數據的實際長度大于2000個字節(如果是UTF-8,則是1333個字節);或者是插入的記錄中有兩個或兩個以上長度大于2000字節的字符串。
3、數據庫與客戶端的JDBC 驅動不匹配。對于UTF-8或歐洲的某些字符集,oracle在存儲時,對于一個字符需要2個或3個字節的存儲空間,雖然表定義中為 varchar2(4000),但是其實該字段的data_length為其2倍或3倍長。這種情況下oracle會把data_length長度超過 4000的當做LONG型處理,你的表中有兩個這樣的字段,插入數據時相當于同時操作2個LONG字段。
4、使用9i的及以下的版本引發的bug. 10.1.0.1版本中已經修復bug
我這邊遇到的是第一種,字符串長度大于4000了。
解決方法:
創建函數進行轉換就可以了。
函數如下:
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轉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--當轉換出來的字符串亂碼時,可嘗試用注釋掉的函數--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;?
轉載于:https://www.cnblogs.com/littlewu/p/7798240.html
總結
以上是生活随笔為你收集整理的(Oracle)关于blob转到目标库报ORA-01461: 仅能绑定要插入 LONG 列的 LONG 值错误解决方案...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: css 超出文字头尾相接滚动_前端的一些
- 下一篇: class参数传入 python_小白学