The following code seems to do the job, but I doubt, that it is robust enough.
SET serveroutput on
DECLARE
v_isclob PLS_INTEGER;
v_cmd VARCHAR2(4000);
BEGIN
SELECT CASE when exists (select * from USER_TAB_COLUMNS where COLUMN_NAME = 'Column_to_modify' AND TABLE_NAME = 'MyTable' AND DATA_TYPE = 'CLOB') then 1 else 0 end into v_isclob FROM DUAL;
IF v_isclob > 0 THEN
BEGIN
EXECUTE IMMEDIATE 'ALTER TABLE MyTable RENAME COLUMN Column_to_modify TO XXX';
EXECUTE IMMEDIATE 'ALTER TABLE MyTable ADD Column_to_modify varchar2(4000)';
EXECUTE IMMEDIATE 'UPDATE MyTable SET Column_to_modify = SUBSTR(XXX, 1, 4000)';
EXECUTE IMMEDIATE 'ALTER TABLE MyTable DROP COLUMN XXX';
dbms_output.put_line ('++ Column_to_modify modified to varchar2(4000)');
EXCEPTION WHEN OTHERS THen
dbms_output.put_line ('##### Error while modifying Column_to_modify');
END;
else
dbms_output.put_line (' Column_to_modify is varchar(4000)');
END IF;
END;
/
How can I improve the code?