X bytes
からX char
にリサイズする必要があるテーブルA
には、少なくとものカラムがあります。 ALTER TABLE A MODIFY..
コマンドを65回発行するより簡単な方法を探していました。データベーステーブル内のすべてのVARCHARカラムのサイズを変更しています - Oracle 11g
誰でも私がこれを行う方法を手伝ってもらえますか?
X bytes
からX char
にリサイズする必要があるテーブルA
には、少なくとものカラムがあります。 ALTER TABLE A MODIFY..
コマンドを65回発行するより簡単な方法を探していました。データベーステーブル内のすべてのVARCHARカラムのサイズを変更しています - Oracle 11g
誰でも私がこれを行う方法を手伝ってもらえますか?
動的SQLを少し書くことができます。表は、あなたがその
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> 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)
の下に作業を参照してくださいすることができ、現在のスキーマ
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エディタで実行します。
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;
/
これは2年前のジャスティンの受け入れられた答えとどう違いますか? –
それはありません。私は、少ないコードで同じ結果が得られることを示しています。それは洗練されたものです。 – grokster
ジャスティンの答えは、部分的に間違っている - の違いを見つける - 実際のグロックスターの方が良いに:
ジャスティン:
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%')
お知らせすべての列をvarchar2に変換しようとするのではなく、正しく!
私はすべてのDBMSで動作し、それぞれに固有の手続き型拡張に依存しないので、この手法が気に入っています。多くの場合、これをいくつかのスプーリング機能と組み合わせて、新しいSQLスクリプトを作成して実行することができます。 –