varchar2(10) または varchar2(1000) のタイプを定義することは同じです。
いいえ、まったく同じではありません。
- 列の長さは、画面を作成する開発者にとって有用なメタデータです。
- 同様に、TOAD や SQL Developer などの自動クエリ ツールは、結果をレンダリングするときに列の長さを使用します。
- データベースは、PL/SQL コレクションにメモリを割り当てるときに変数の長さを使用します。そのメモリーが PGA のスーパーサイジングから取り出されると、サーバーのメモリーが不足するため、変数宣言によってプログラムが失敗する可能性があります。
- PL/SQL プログラムでの単一変数の宣言にも同様の問題がありますが、コレクションが問題を増大させる傾向があるだけです。
- 列が大きすぎると、複合インデックスの問題が生じます。以下は、8Kブロックのデータベースです
....
SQL> create table t23 (col1 varchar2(4000), col2 varchar2(4000))
2 /
Table created.
SQL> create index t23_i on t23(col1,col2)
2 /
create index t23_i on t23(col1,col2)
*
ERROR at line 1:
ORA-01450: maximum key length (6398) exceeded
SQL>
しかし何よりも、列のサイズはエラー チェックの形式です。列の長さが 10 文字であると想定されていて、オートノミック プロセスが 1000 文字をロードしようとしている場合は、何か問題があります。プロセスは失敗するはずなので、duff データをロードしている理由を調査できます。もう 1 つの方法は、ゴミだらけのデータベースです。それが必要な場合は、全員に Excel を渡して、それで処理を完了させるべきでした。
過小評価していることが判明したときに列のサイズを変更するのは面倒です。しかし、これは頻繁に発生するわけではなく、変数の長さをハードコーディングする代わりに、PL/SQL で %TYPE および SUBTYPE 宣言を使用することで、多くの問題を軽減できます。
「なぜNUMBER型にそのような宣言がないのですか」
数値が異なります。まず、数値の最大サイズは、同等のテキスト (38 桁の精度が保証されている) よりもはるかに小さいです。
ただし、重要な違いは、Oracle は数値を指数表記で格納するため、数値の算術サイズとそれが消費するストレージ スペースの間に単純な関係がないことです。
SQL> select vsize(123456789012345678901) n1
2 , vsize(999999999999999999999999999999) n2
3 , vsize(0.000000000000000000001) n3
4 , vsize(1000000000000000000000000) n4
5 from dual
6 /
N1 N2 N3 N4
---------- ---------- ---------- ----------
12 16 2 2
SQL>
それにもかかわらず、特に整数やお金を扱っている場合は、可能な限り位取りと精度を指定することをお勧めします。