我在表VARCHAR
中至少有65个A
列,我必须从X bytes
调整为X char
。我希望找到一种比发出ALTER TABLE A MODIFY..
命令更简单的方法65次。
任何人都可以帮助我如何做到这一点是一种更快的方法吗?
答案 0 :(得分:5)
您可以编写一些动态SQL。假设该表在当前架构中
DECLARE
l_sql_stmt VARCHAR2(1000);
BEGIN
FOR t IN (SELECT * FROM user_tab_cols WHERE table_name = 'A')
LOOP
l_sql_stmt := 'ALTER TABLE ' || t.table_name || ' MODIFY (' ||
t.column_name || ' varchar2(' || t.char_length || ' char))';
EXECUTE IMMEDIATE l_sql_stmt;
END LOOP;
END;
您可以在下面看到
SQL> ed
Wrote file afiedt.buf
1 create table foo(
2 col1 varchar2(10 byte),
3 col2 varchar2(20 byte)
4* )
SQL> /
Table created.
DECLARE
l_sql_stmt VARCHAR2(1000);
BEGIN
FOR t IN (SELECT * FROM user_tab_cols WHERE table_name = 'FOO')
LOOP
l_sql_stmt := 'ALTER TABLE foo MODIFY (' ||
t.column_name || ' varchar2(' || t.char_length || ' char))';
EXECUTE IMMEDIATE l_sql_stmt;
END LOOP;
END;
SQL> desc foo;
Name Null? Type
----------------------------------------- -------- ----------------------------
COL1 VARCHAR2(10 CHAR)
COL2 VARCHAR2(20 CHAR)
答案 1 :(得分:4)
你可以尝试像这样丑陋的东西
select 'ALTER TABLE '||table_name|
' MODIFY ('||column_name||' VARCHAR2('||char_length||' char));'
from all_tab_cols
where table_name='A' and
datatype like 'VARCHAR2%';
复制结果网格并将其粘贴并在首选的sql编辑器中运行
答案 2 :(得分:2)
Justin的答案部分不正确 - 实际上格罗克斯特更好 - 发现差异:
<强>贾斯汀:强>
FOR t IN (SELECT * FROM user_tab_cols WHERE table_name = 'A')
<强>格罗斯特:强>
FOR x IN (SELECT * FROM user_tab_cols WHERE table_name = 'A' AND datatype LIKE 'VARCHAR%')
请注意,Grokster正确检查数据类型,而不是尝试将所有列转换为varchar2!
答案 3 :(得分:1)
BEGIN
FOR x IN (SELECT * FROM user_tab_cols WHERE table_name = 'A' AND datatype LIKE 'VARCHAR%')
LOOP
EXECUTE IMMEDIATE 'ALTER TABLE '||x.table_name||' MODIFY '||x.column_name ||' VARCHAR2('||x.char_length||' CHAR)';
END LOOP;
END;
/