下面的代码似乎可以完成这项工作,但我怀疑它是否足够健壮。
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;
/
Run Code Online (Sandbox Code Playgroud)
如何改进代码?
该代码不处理名为 XXX 的现有列的存在。您可以考虑至少让这个名字更晦涩一些。可能是由 30 个混合大小写字母和数字组成的带引号的字符串。更好的是,您可以处理名称异常并尝试不同的名称。