OracleでBlobをClobに変換する



Convert Blob Clob Oracle



タブテーブルのc_xmlフィールドが元々blobタイプである場合は、それをclobタイプに変換する必要があります。テーブルにデータがある場合、アラートステートメントを介して直接変更することはできません。ブロブタイプフィールドは、次の方法でクロブタイプに変更できます。

まず、Oracleで関数を作成します。コードは次のとおりです。



- First create a function that converts Blog to Clob 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列を追加します。コードは次のように表示されます。



-- Delete c_xml column alter table tab drop column c_xml -- Add c_xml column, type clob alter table tab add c_xml clob

最後に、バックアップされたデータが復元されます。コードは次のように表示されます。

-- Execute the following code in command mode to restore the data backed up to c_xml in tab2 to tab DECLARE task_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