ヘッダーをスキップ
Oracle® TimesTen In-Memory Database SQLリファレンス
11gリリース(11.2.2)
B66446-05
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

2 名前、ネームスペースおよびパラメータ

この章では、TimesTen SQL文で使用する名前およびパラメータの一般的なルールについて説明します。内容は次のとおりです。

基本名

基本名(単純名)は、列、表、ビューおよび索引を指します。基本名は、次の規則に従う必要があります。

  • 基本名の最大長は30文字です。

  • 名前には文字(AからZおよびaからz)、10進数(0から9)、$、#、@、アンダースコア(_)を組み合せて指定することができます。識別子の場合は、先頭に文字(AからZおよびaからz)を使用する必要があり、数字や特殊文字を使用することはできません。ただし、パラメータ名の場合は、先頭に文字(AからZおよびaからz)、10進数(0から9)、または特殊文字の$、#、@、アンダースコア(_)を使用できます。

  • TimesTenでは、小文字(aからz)が対応する大文字(AからZ)に変更されます。このため、名前では大文字と小文字は区別されません。

  • 名前が二重引用符で囲まれている場合は、どのような文字の組合せでも(有効な文字セットにはない場合でも)使用できます。名前が引用符で囲まれている場合、名前の最初の文字には、1つ以上の空白を含む任意の文字を使用できます。

    列、表、または索引が、二重引用符で囲まれた名前で最初に定義され、その名前が前述の2つ目の規則に従っていない場合、以後そのオブジェクトを参照する際には常に二重引用符を使用する必要があります。

  • Unicode文字を名前に使用することはできません。

所有者名

所有者名は、表を作成したアカウントのユーザー名です。TimesTenで定義される表と索引には、所有者のSYSまたはTTREPが付与されます。ユーザー・オブジェクトは、所有者名SYSまたはTTREPでは作成できません。所有者名と表名はすべて大文字に変換されます。

TimesTenの表の所有者は、ユーザーIDの設定またはログイン名によって決まります。キャッシュ・グループの場合、Oracle Database表の所有者名は、TimesTen表の所有者名と常に一致させる必要があります。

所有者名は、指定しない場合は自動的に設定されますが、ユーザーが表を作成する際に指定できます。「CREATE TABLE」を参照してください。所有者名を作成する場合は、基本名の作成と同じ規則に従ってください。「基本名」を参照してください。

複合識別子

基本名とユーザー名は単純名です。単純名は、ピリオド(.)で区切られた複数の基本名と所有者名を結合した、複合識別子と結合されることがあります。

通常、複合識別子はその一部を省略して簡略化できます。完全修飾名を使用しない場合、欠けている部分のかわりにデフォルト値が使用されます。たとえば、所有する表を参照する際、所有者名(とピリオド)を省略すると、ユーザーのログイン名に基づいて所有者名が生成されます。

構成要素をすべて含む完全な複合識別子を、完全修飾名といいます。異なる所有者が同じ名前の表と索引を所有することができます。これらのオブジェクトの完全修飾名は一意である必要があります。

複合識別子には、次のものがあります。

  • 列識別子: [[Owner.]TableName.]ColumnName

  • [Owner.]IndexName

  • 表識別子: [Owner.]TableName

  • 行識別子: [[Owner.]TableName.]rowid

ネームスペース

SQL構文では、同じネームスペースを共有するオブジェクト名はそれぞれ一意である必要があります。これは、名前がSQL構文内で参照されたときに、正しいオブジェクトを見つけることができるようにするためです。

指定されたオブジェクト名がそれを所有するユーザーの名前(ネームスペース)で修飾されていない場合、オブジェクトに対する検索順序は次のようになります。

  1. 現在のユーザー・ネームスペース内にあるすべてのオブジェクト名から一致する名前を検索します。一致が検出されると、オブジェクト名は解決されます。

  2. ユーザーのネームスペース内で一致が検出されない場合、パブリック・シノニムなどのオブジェクトを含むPUBLICネームスペースで一致を検索します。パブリック・シノニムはSYSおよびTTREPオブジェクトに事前定義されています。一致が検出されると、オブジェクト名は解決されます。そうでない場合、そのオブジェクトは存在しません。

同じユーザーが所有する表、ビュー、マテリアライズド・ビュー、順序、プライベート・シノニム、PL/SQLパッケージ、ファンクション、プロシージャおよびキャッシュ・グループは、1つのネームスペースを共有しているため、これらの各オブジェクトの名前はそのネームスペース内で一意である必要があります。固有のネームスペース内に索引が作成されます。

たとえば、表とビューは同じネームスペースにあるため、同じユーザーが所有する表とビューは同じ名前を持つことができません。しかし、表と索引は異なるネームスペースにあるため、同じユーザーが所有する表と索引は同じ名前を持つことができます。

異なるユーザーが所有する表は、異なるユーザーのネームスペースに存在するため、同じ名前を持つことができます。

動的パラメータ

動的パラメータは、アプリケーション・プログラムとTimesTen間で情報を渡します。TimesTenでは、SQLコマンドのプレースホルダとして動的パラメータが使用され、実行時に実際の値に置き換えられます。

SQLコマンド内で使用され、TimesTenの基本名のルールを満たしている必要がある場合、動的パラメータ名の前にコロン(:)が必要です。ただし、識別子とは異なり、パラメータ名の最初の文字には次のいずれかの文字を使用できます。

  • 大文字: AからZ

  • 小文字: aからz

  • 数字: 0から9

  • 特殊文字: # $ @ _


注意:

:DynamicParameterシーケンスを使用するかわりに、アプリケーションで、各動的パラメータに?を使用できます。

拡張された:スタイルのパラメータ・マーカーは、次の書式で指定できます。

:parameter [INDICATOR] :indicator

:indicator:parameterの要素とみなされます。異なるパラメータとしてカウントされません。このスタイルのパラメータ・マーカーに対して?を指定しないでください。

重複したパラメータ名

次のSQL文について考えてみます。

SELECT * FROM t1 WHERE c1=:a AND c2=:a AND c3=:b AND c4=:a;

通常、TimesTenでは、SQL文において同じパラメータ名のインスタンスが複数存在する場合、同じパラメータが複数出現しているとみなされます。パラメータにパラメータ番号を割り当てる場合、TimesTenでは、各パラメータ名の最初の出現に対してのみパラメータ番号が割り当てられます。特定の名前が2回目以降に出現しても、独自のパラメータ番号は割り当てられません。この場合、TimesTenアプリケーションは、SQL文における一意のパラメータすべてに対して値をバインドします。同じパラメータ名の異なる出現に対して別の値をバインドしたり、パラメータやパラメータの出現をバインドしないでおくことはできません。

Oracle Databaseでは、SQL文において同じパラメータ名のインスタンスが複数存在する場合、異なるパラメータとしてみなされます。パラメータ番号を割り当てる場合、Oracle Databaseでは名前の重複にかかわらず、パラメータが出現するたびに番号が割り当てられます。Oracle Databaseアプリケーションは、少なくとも、各パラメータ名の最初の出現に対して値をバインドします。特定のパラメータがこれ以降に出現した場合は、アプリケーションはパラメータの出現をバインドしないでおくことも、この出現に対して異なる値をバインドすることもできます。

次の表に、各パラメータに対してTimesTenおよびOracle Databaseによって割り当てられるパラメータ番号を伴う問合せを示します。

問合せ TimesTenのパラメータ番号 Oracle Databaseのパラメータ番号
SELECT *

FROM t1

WHERE c1=:a 1 1
AND c2=:a 1 2
AND c3=:b 2 3
AND c4=:a; 1 4

この例におけるTimesTenのパラメータ番号の合計数は2です。この例におけるOracle Databaseのパラメータの合計数は4です。アプリケーションで指定されたパラメータ・バインディングによって、従来のTimesTenの動作とOracle Databaseの動作とでは異なる結果となります。

DuplicateBindMode一般接続属性を使用すると、SQL文においてパラメータが重複して出現した場合に、アプリケーションで従来のTimesTenのパラメータ・バインディングを使用するか、またはOracleスタイルのパラメータ・バインディングを使用するかを指定できます。デフォルトでは、Oracleスタイルのパラメータ・バインディングが指定されています。

パラメータからのデータ型の推測

次の文について考えてみます。

SELECT :a FROM dual;

TimesTenでは、問合せからパラメータaのデータ型を推測できません。TimesTenは次のエラーを戻します。

2778: Cannot infer type of parameter from its use
The command failed.

パラメータのデータ型を宣言するには、CAST関数を使用します。

SELECT CAST (:a AS NUMBER) FROM dual;