標籤:
假如tab表中的c_xml欄位原來是blob類型,我們要將其轉換為clob類型,如果表中有資料的話,是無法直接通過alert語句去修改的。通過以下方法可以將blob類型的欄位改為clob類型。
首先在oracle中建立一個function,代碼如下:
--先建立Blog轉換為Clob的function
CREATE OR REPLACE FUNCTION BlobToClob(blob_in IN BLOB) RETURN CLOB AS v_clob CLOB; v_varchar VARCHAR2(32767); v_start PLS_INTEGER := 1; v_buffer PLS_INTEGER := 32767;BEGIN DBMS_LOB.CREATETEMPORARY(v_clob, TRUE); FOR i IN 1 .. CEIL(DBMS_LOB.GETLENGTH(blob_in) / v_buffer) LOOP v_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;
然後建立備份表,以防資料丟失。代碼如下:
create table tab2 AS SELECT * FROM tab;
刪除表中blob列,添加clob列。代碼如下:
-- 刪除c_xml列
alter table tab drop column c_xml;
-- 添加c_xml列, 類型為clob
alter table tab add c_xml clob;
最後將備份出去的資料恢複回來。代碼如下:
--在命令模式下執行如下代碼, 將備份到tab2中的c_xml中的資料恢複到tab中來
DECLAREtask_id NUMBER;sour_blob BLOB;dest_clob CLOB;userRow tab2%rowtype; cursor userRows is select * from tab2; BEGIN for userRow in userRows loop task_id := userRow.n_task_id; sour_blob := userRow.c_xml; dest_clob := blobtoclob(sour_blob); UPDATE tab SET c_xml = dest_clob WHERE n_task_id = task_id; COMMIT; end loop; END;
Oracle中Blob轉換成Clob