プリコンパイル時に、宣言部の各ホスト変数に外部データ型が割り当てられます。たとえば、プリコンパイラは整数ホスト変数にINTEGER
外部データ型を割り当てます。SQL文で使用するすべてのホスト変数のデータ型コードは、実行時にOracleに渡されます。Oracleは、コードを使用して内部データ型と外部データ型の間で変換します。
Oracleでは、選択した列(または擬似列)値を出力ホスト変数に割り当てる前に、必要に応じて、その列の内部データ型をホスト変数のデータ型に変換します。同様に、入力ホスト変数の値をデータベース列に割り当てたり、比較したりする前には、必要に応じて、ホスト変数の外部データ型を列の内部データ型に変換します。
ただし、ホスト変数のデータ型は、データベース列のデータ型との互換性が必要です。必ず、変換可能な値を指定してください。たとえば、文字列値YESTERDAYをDATE
列値に変換しようとすると、エラーが発生します。
内部データ型と外部データ型との変換は、通常のデータ変換規則に従って行われます。たとえば、CHAR
値の1234を2バイトの整数に変換できます。しかし、CHAR
値の65543(大きすぎる数)や10F(10進数ではない数)を2バイトの整数に変換することはできません。同様に、アルファベット文字を含む文字列値はNUMBER
値に変換できません。
数値の変換は、Oracle初期化ファイルのグローバリゼーション・サポート・パラメータで指定された規則に従って行われます。たとえば、ピリオド(.)ではなくカンマ(,)を小数点として認識するようにシステムが構成されている場合があります。グローバリゼーション・サポートの詳細は、『Oracle Databaseアドバンスト・アプリケーション開発者ガイド』を参照してください。
表3-6は、サポートされている内部データ型と外部データ型間の変換を示しています。
注意:
凡例:
入力時には、ホスト文字列をOracleのBBBBBBBB.RRRR.FFFF形式にする必要があります。
I = 入力のみ。出力時には、列値が同じ形式で戻されます。
O = 出力のみ
入力時には、ホスト文字列をデフォルトのDATE文字形式にする必要があります。
I/O = 入力または出力。出力時には、列値が同じ形式で戻されます。
入力時には、ホスト文字列を16進数の形式にする必要があります。出力時には、列値は同じ形式で戻されます。
出力時には、列値は有効な数値を表している必要があります。
入力時には、長さが2000以下であることが必要です。
入力時には、列値は16進数の形式で格納されます。出力時、列値は16進フォーマットであることが必要です。
入力時には、ホスト文字列をテキスト形式の有効なオペレーティング・システム・ラベルにする必要があります。出力時には、列値は同じ形式で戻されます。
入力時には、ホスト文字列をRAW形式の有効なオペレーティング・システム・ラベルにする必要があります。出力時には、列値は同じ形式で戻されます。
表3-6 内部データ型と外部データ型間の変換
外部 | 内部 — CHAR | 内部 — DATE | 内部 — LONG | 内部 — LONG RAW | 内部 — MLSLABEL | 内部 — NUMBER | 内部 — RAW | 内部 — ROWID | 内部 — VARCHAR2 |
---|---|---|---|---|---|---|---|---|---|
|
I/O |
I/O |
I/O |
I |
I/O |
I/O |
I/O |
I/O |
I/O |
|
I/O |
I/O |
I/O |
I |
I/O |
I/O |
I/O |
I/O |
I/O |
|
I/O |
I/O |
I/O |
I |
I/O |
I/O |
I/O |
I/O |
I/O |
|
I/O |
I/O |
I |
|
I/O |
||||
|
I/O |
|
I |
I/O |
I/O |
||||
|
I/O |
I |
I/O |
I/O |
|||||
|
I/O |
I |
I/O |
I/O |
|||||
|
I/O |
I |
I/O |
I/O |
|||||
|
I/O |
I/O |
I/O |
I |
I/O |
I/O |
I/O |
I/O |
I/O |
|
O |
I |
I/O |
I/O |
O |
||||
|
I/O |
I/O |
I/O |
I |
I/O |
I/O |
I/O |
I/O |
I/O |
|
I/O |
I |
I/O |
I/O |
I/O |
||||
|
I/O |
I/O |
I/O |
I/O |
|||||
|
I/O |
I |
I/O |
I/O |
|||||
|
I/O |
I |
I/O |
I/O |
|
I/O |
|||
|
I |
I |
I/O |
I |
|||||
|
I/O |
I/O |
I/O |
I |
I/O |
I/O |
I/O |
I/O |
I/O |
|
I/O |
I |
I/O |
I/O |
|||||
|
I/O |
I/O |
I/O |
I |
I/O |
I/O |
I/O |
I/O |
I/O |
|
I/O |
I/O |
I/O |
I |
I/O |
I/O |
I/O |
I/O |
I/O |
|
I/O |
I |
I/O |
I/O |
|||||
|
I/O |
I |
I/O |
I/O |
|
I/O |
ホスト変数値にDATE
列値を選択すると、Oracleでは内部バイナリ値を外部文字値に変換する必要があります。そのため、暗黙的にSQLファンクションTO_CHAR
がコールされ、これによって文字列がデフォルトの日付書式で戻されます。デフォルトはOracleの初期化パラメータ、グローバリゼーション・サポートのDATE_FORMAT
によって設定されます。時刻やユリウス日などの他の情報を取得するには、書式マスクを指定してTO_CHAR
を明示的にコールする必要があります。
文字ホスト変数をDATE
列に挿入するときにも変換が必要です。Oracleでは暗黙的にSQLファンクションTO_DATE
がコールされ、デフォルトの日付書式が予想されます。他の書式で日付を挿入するには、書式マスクを指定してTO_DATE
を明示的にコールする必要があります。
文字ホスト変数にRAW
列値またはLONG
RAW
列値を選択すると、Oracleでは内部バイナリ値を外部文字値に変換する必要があります。この場合、OracleからはRAW
またはLONG
RAW
データのそれぞれのバイナリ・バイトが文字のペアとして戻されます。個々の文字は、ニブル(1/2バイト)の等価の16進値を表します。たとえば、バイナリ・バイト11111111は文字のペア「FF」として戻されます。SQLファンクションRAWTOHEX
は、同じ変換を実行します。
文字ホスト値をRAW
列またはLONG
RAW
列に挿入するときにも変換が必要です。ホスト変数内の文字のペアはそれぞれ、バイナリ・バイトの等価の16進値を表している必要があります。文字がニブルの16進数等価値でなければ、次のエラー・メッセージが出ます。
ORA-01465: invalid hex number