この章では、データ型、予約語、関数、問合せおよびピボット・テーブルを作成するTRANSFORM文について説明します。内容は次のとおりです。
表3-1に、SQL DeveloperがサポートするOracleのデータ型を示します。
表3-1 サポートされているOracleデータ型
| データ型 | 説明 |
|---|---|
|
BLOB |
バイナリ・ラージ・オブジェクト。最大サイズは4GBです。 |
|
CHAR |
バイト単位の長さの固定長文字データ。最大サイズは2000バイトです。デフォルトおよび最小サイズは1バイトです。 |
|
CLOB |
シングルバイト文字を含むキャラクタ・ラージ・オブジェクト。固定幅および可変幅のキャラクタ・セットがサポートされます。両方のキャラクタ・セットで |
|
DATE |
|
|
FLOAT |
38桁の10進精度(126桁のバイナリ精度)の浮動小数点数。 |
|
LONG |
最大2GB(231-1バイト数)の可変長文字データ。 |
|
LONG RAW |
最大2GBの可変長RAWバイナリ・データ。 |
|
NCHAR |
文字単位またはバイト単位(各国語キャラクタ・セットの選択によって異なる)の長さの固定長文字データ。最大サイズは、それぞれの文字を格納するために必要なバイト数によって決定されます。上限は2000バイトです。デフォルトおよび最小サイズは、1文字または1バイト(キャラクタ・セットによって異なる)です。 |
|
NCLOB |
マルチバイト・キャラクタを含むキャラクタ・ラージ・オブジェクト。固定幅および可変幅のキャラクタ・セットがサポートされます。両方のキャラクタ・セットでNCHARデータベース・キャラクタ・セットを使用します。最大サイズは4GBです。各国語キャラクタ・セットのデータを格納します。 |
|
NUMBER |
精度(p)とスケール(s)を持つ数字。精度(p)の範囲は1から38です。スケール(s)の範囲は-84から127です。 |
|
NVARCHAR2 |
最大長が文字単位またはバイト単位(各国語キャラクタ・セットの選択によって異なる)の可変長文字列。最大サイズは、それぞれの文字を格納するために必要なバイト数によって決定されます。上限は4000バイトです。 |
|
RAW |
バイト単位の長さのRAWバイナリ・データ。最大サイズは2000バイトです。RAW値にサイズを指定する必要があります。 |
|
VARCHAR |
現在、 |
Oracleデータ型の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。
表3-2に、Microsoft Access Jetデータ型を示します。
表3-2 Microsoft Access Jetのデータ型
| データ型 | 説明 | 最小値 | 最大値 |
|---|---|---|---|
|
Text |
可変長のテキスト |
1 |
255 |
|
Memo |
可変長の長いテキスト |
1 |
64,000バイト |
|
Number Byte |
1バイト記憶域 |
0 |
255 |
|
Number Integer |
2バイト記憶域 |
-32,768 |
32,767 |
|
Number Long Integer |
4バイト記憶域 |
-2,147,483,648 |
2,147,483,647 |
|
Number Single |
4バイト記憶域 |
-3.4 x 1038 |
3.4 x 1038 |
|
Number Double |
8バイト記憶域 |
-1.8 x 10308 |
1.8 x 10308 |
|
Currency |
8バイト記憶域(通貨) |
-922337203685477.5808 |
922337203685477.5808 |
|
Counter Yes/No |
4バイトの記憶域(AutoIncrementフィールド)1ビットの記憶域(ブール値) |
0 |
2,147,483,647 |
|
Date/Time |
8バイト記憶域 |
||
|
OLEオブジェクト |
OLE(図形や他の複雑なデータ) |
1 |
1.2GB |
表3-3に、Microsoft AccessからOracleへデータ型を変換するためにSQL Developerによって使用されるデフォルト設定を示します。SQL Developerを使用すると、代替の型を指定して特定のデータ型のデフォルト設定を変更できます。これを行うには、「Captured Objects」ナビゲータで対象となる取得モデルを右クリックし、「データ・マッピングの設定」を選択します。表3-3に、デフォルトのマッピングを示します。
デフォルトのデータ型マッピングを変更する方法の詳細は、SQL Developerのオンライン・ヘルプを参照してください。
次の表に、Oracleで予約されている語を示します。これらの予約語と競合するオブジェクト名には、SQL Developerによってアンダースコアが追加されます。
| ABORT | ACCEPT |
| ACCESS | ADD |
| ALL | ALTER |
| AND | ANY |
| ARRAY | ARRAYLEN |
| AS | ASC |
| ASSERT | ASSIGN |
| AT | AUDIT |
| AUTHORIZATION | AVG |
| BASE_TABLE | BEGIN |
| BETWEEN | BINARY_INTEGER |
| BODY | BOOLEAN |
| BY | CASE |
| CHAR | CHAR_BASE |
| CHECK | CLOSE |
| CLUSTER | CLUSTERS |
| COLAUTH | COLUMN |
| COMMENT | COMMIT |
| COMPRESS | CONNECT |
| CONSTANT | CRASH |
| CREATE | CURRENT |
| CURRVAL | CURSOR |
| DATA_BASE | DATABASE |
| DATE | DBA |
| DEBUGOFF | DEBUGON |
| DECIMAL | DECLARE |
| DEFAULT | DEFINITION |
| DELAY | DELETE |
| DESC | DIGITS |
| DISPOSE | DISTINCT |
| DO | DROP |
| ELSE | ELSIF |
| END | ENTRY |
| EXCEPTION | EXCEPTION_INIT |
| EXCLUSIVE | EXISTS |
| EXIT | FALSE |
| FETCH | FILE |
| FLOAT | FOR |
| FORM | FROM |
| FUNCTION | GENERIC |
| GOTO | GRANT |
| GROUP | HAVING |
| IDENTIFIED | IF |
| IMMEDIATE | IN |
| INCREMENT | INDEX |
| INDEXES | INDICATOR |
| INITIAL | INSERT |
| INTEGER | INTERFACE |
| INTERSECT | INTO |
| IS | LEVEL |
| LIKE | LIMITED |
| LOCK | LONG |
| LOOP | MAX |
| MAXEXTENTS | MIN |
| MINUS | MLSLABEL |
| MOD | MODE |
| MODIFY | NATURAL |
| NATURALN | NETWORK |
| NEW | NEXTVAL |
| NOAUDIT | NOCOMPRESS |
| NOT | NOWAIT |
| NULL | NUMBER |
| NUMBER_BASE | OF |
| OFFLINE | ON |
| ONLINE | OPEN |
| OPTION | OR |
| ORDER | OTHERS |
| OUT | PACKAGE |
| PARTITION | PCTFREE |
| PLS_INTEGER | POSITIVE |
| POSITIVEN | PRAGMA |
| PRIOR | PRIVATE |
| PRIVILEGES | PROCEDURE |
| PUBLIC | RAISE |
| RANGE | RAW |
| REAL | RECORD |
| REF | RELEASE |
| REMR | RENAME |
| RESOURCE | RETURN |
| REVERSE | REVOKE |
| ROLLBACK | ROW |
| ROWID | ROWLABEL |
| ROWNUM | ROWS |
| ROWTYPE | RUN |
| SAVEPOINT | SCHEMA |
| SELECT | SEPERATE |
| SESSION | SET |
| SHARE | SIGNTYPE |
| SIZE | SMALLINT |
| SPACE | SQL |
| SQLCODE | SQLERRM |
| START | STATEMENT |
| STDDEV | SUBTYPE |
| SUCCESSFUL | SUM |
| SYNONYM | SYSDATE |
| TABAUTH | TABLE |
| TABLES | TASK |
| TERMINATE | THEN |
| TO | TRIGGER |
| TRUE | TYPE |
| UID | UNION |
| UNIQUE | UPDATE |
| USE | USER |
| VALIDATE | VALUES |
| VARCHAR | VARCHAR2 |
| VARIANCE | VIEW |
| VIEWS | WHEN |
| WHENEVER | WHERE |
| WHILE | WITH |
| WORK | WRITE |
| XOR |
Microsoft Accessの問合せは、Oracleのビューに変換されます。この項では、問合せを移行する際の考慮点およびMicrosoft Accessの機能をOracleモデルにマッピングする方法について説明します。
Microsoft Accessの問合せの移行には、次の考慮事項があります。
Oracleでは、2ステップのプロセス(パラメータの設定とビューのコール)でビューを使用します。Accessでは、ユーザーはパラメータ値を求めるプロンプトを表示できます。パラメータ付きの問合せの詳細は、「パラメータを使用するMicrosoft Accessの問合せ」を参照してください。
依存するオブジェクトが存在しない場合でも作成できるように、ビューはFORCEオプションで作成します。(依存する他のビューや表を後で作成する場合もあるため、この方法でビューを作成する必要があります。)
したがって、移行後は、どちらが有効かを確認するためにビューを再コンパイルするか、エラーまたは問題に関する情報を確認するためにFORCEオプションなしでビューを作成する必要があります。
列名については、OracleはMicrosoft Accessよりも厳密です。列名が重複すると、エラー(「ORA-00957: 列名が重複しています。」)が発生します。この問題を回避するには、重複する列名のいずれかに別名を追加します。
表3-4に、問合せの移行時に、Microsoft Access固有の機能がどのようにOracleモデルに変換されるかを示します。
表3-4 問合せの移行時におけるMicrosoft Access機能の変換
| Microsoft Accessの機能 | Oracleの機能への変換 |
|---|---|
|
DISTINCTROW |
DISTINCT。警告: DISTINCTROWはすべてのレコード・データに基づいて重複レコードを削除しますが、DISTINCTは選択したデータにのみ基づいて重複行を削除します。DISTINCTROWと同様の動作を行うには、(必要な一意性のレベルを保証するために)さらに列を選択する必要がある場合があります。 |
|
日付への参照( |
単純な日付マスクに基づいた日付。これがデータに合わない場合は、Oracleモデルのユーティリティ・パッケージでVARCHAR2TODATE日付変換ファンクションを変更する必要があります。 |
Microsoft Accessの問合せにパラメータを使用せず、Microsoft Accessのリンクした表としてアクセスできるOracleのビューに変換する場合、次の手順に従います。
Oracle ODBCドライバを使用してデータソース名(DSN)を作成します。
Microsoft Accessでデータベースをオープンして、「Insert」→「Table」を選択します。
ポップアップ・ウィンドウで、「Link Table」を選択します。
「Files of Type」ダイアログ・ボックスで、「ODBC Databases」を選択します。
手順1で作成したDSNを選択します。
logon_name.viewnameを選択します。Microsoft Accessのアプリケーションが、実行時にユーザーにパスワードを求めるプロンプトを表示する必要がないように、「Save Password」を選択することも可能です。
一意の識別子を指定します。
パラメータを使用するMicrosoft Accessの問合せは、同一セッションで設定したパラメータを持つ必要があるOracleのビューに変換されます。パラメータはセッションごとの変数に格納され、パラメータの取得と設定に、それぞれgetメソッドおよびsetメソッドを使用してアクセスされます。次の例では、input_nameパラメータを、移行した問合せqueryexampleのSmithに設定します。
omwb_emulation.utilities.setvarchar2('QUERYEXAMPLE:input_name','Smith');
次の例では、current_dateパラメータを、移行した問合せqueryexampleの現在のシステム日付(OracleではSYSDATE)に設定します。
omwb_emulation.utilities.setdata('QUERYEXAMPLE:current_date',SYSDATE);
必要な書式でデータを表示するには、omwb_emulation.utilities.varchar2todateファンクションの書式文字列を変更する必要がある場合があります。
該当するgetメソッドは、移行した問合せにすでに含まれています。次に例を示します。
SELECT omwb_emulation.utilities.getvarchar2('QUERYEXAMPLE:input_name') FROM dual
SELECT omwb_emulation.utilities.getdate('QUERYEXAMPLE:current_date') FROM dual
パラメータ文字列の最大値はデフォルトで256に設定されています。
次の例では、同一セッションのパラメータを設定します。Microsoft Accessの問合せは、次のとおりです。
Parameters [input name] text; select telephone from example1 where name=[input name];
生成されたOracleのビューは、次のとおりです。
CREATE OR REPLACE FORCE VIEW queryexample AS
SELECT telephone
FROM example1 WHERE name =
(SELECT omwb_emulation.utilities.getvarchar2('QUERYEXAMPLE:input_name')
FROM dual)
前述の例の場合、次の文でパラメータを設定する必要があります。
omwb_emulation.utilities.setvarchar2('QUERYEXAMPLE:input_name','Smith');
パラメータを設定すると、ビューの問合せができます。次に例を示します。
SELECT * FROM queryexample;
次の例では、オープンした接続でパラメータを設定します。これはADOコードおよびMSDASQL(Microsoft OLE driver for ODBC)とOracle ODBCを使用することを想定しています。詳細は、Microsoft Knowledge BaseのID 281998の項目を参照してください。
Declarations:
Dim con As ADODB.Connection
Dim setstring As ADODB.Command
Dim param1 As ADODB.Parameter
Dim param2 As ADODB.Parameter
Code to set parameter over connection con:
Set setstring = New ADODB.Command
With setstring
.ActiveConnection = con
.CommandText = "omwb_emulation.utilities.setvarchar2"
.CommandType = adCmdStoredProc
End With
Set param1 = setstring.CreateParameter(, adVarChar, adParamInput, 100, "QUERYEXAMPLE:input_name")
setstring.Parameters.Append param1
Set param2 = setstring.CreateParameter(, adVarChar, adParamInput, 100, "Smith")
setstring.Parameters.Append param2
setstring.Execute
Set setstring = Nothing
このコードの実行後に、この接続でこの項の前半の問合せ(SELECT * FROM queryexample;)を実行し、結果セットを使用できます。
ピボット・テーブルを作成する単純なMicrosoft AccessのTRANSFORM文のみが移行されます。たとえば、次のような書式のMicrosoft Accessの文があるとします。
TRANSFORM grp_function(value) SELECT a,b,c FROM xxxx WHERE yyyy GROUP BY zzzz PIVOT pivot_exp in (val1,val2,val3)
この文は、Oracleモデルの次の書式の文に変換されます。
SELECT a,b,c, grp_function(decode(pivot_exp,val1,value,null)), grp_function(decode(pivot_exp,val2,value,null)), grp_function(decode(pivot_exp,val3,value,null)) FROM xxxx WHERE yyyy GROUP BY zzzz
変換された文では、decode行はcase decode(pivot_exp,val1,value,null) is if pivot_exp is equal to val1 return value else return nullと同様です。
GROUP BYは、Oracle DatabaseではORDER BYを使用する必要がある場合があります。
Oracleでは列を定義する必要があるため、動的問合せの作成に必要なデータによって列の数が異なる場合、SQL Developerは必要な列を判断できません。列の型と数が事前にわからない場合は、REFカーソルを使用する必要があることがあります。