APIを使用したシングルトン表の作成

表は、ユーザー・データを保持するための基本構造です。新しい表を作成するには、SQLコマンド(CREATE TABLE文)またはTableRequest APIコマンドを使用します。

Oracle NoSQL Cloud Infrastructure(OCI)コンソールまたはOCIコマンドライン・インタフェース(OCI-cli)を使用して、NDCSで表を作成することもできます。

表を作成するためのガイドライン:
  • 表定義には、少なくとも1つのフィールド定義と、主キー定義を1つのみ含める必要があります。主キー定義の詳細は、表の作成を参照してください。
  • フィールド定義は、カラムの名前、データ型、カラムがNULL可能かどうか、オプションのデフォルト値、およびカラムがIDENTITYカラムとオプションのコメントであるかどうかを指定します。デフォルトでは、すべてのフィールド(PRIMARY KEY以外)はNULL値可能です。
  • 主キー仕様の構文(key_definition)は、表の主キー列をフィールド名のリストとして指定します。
  • 稼働時間(TTL)値は、行の有効期限を計算するために使用されます。期限切れの行は問合せ結果に含まれず、最終的にはOracle NoSQL Databaseによって表から自動的に削除されます。テーブルの作成中にTTL値を指定すると、このテーブルに挿入されるすべての行のデフォルトのTTLとして適用されます。

SQLコマンドの使用

SQLでCREATE TABLEコマンドを使用して、NoSQL表を作成できます。

例1: 次のCREATE TABLEステートメントは、航空会社のシステムの乗客の手荷物情報を保持するBaggageInfoテーブルを定義します。
CREATE TABLE BaggageInfo (
ticketNo LONG,
fullName STRING,
gender STRING,
contactPhone STRING,
confNo STRING,
bagInfo JSON,
PRIMARY KEY (ticketNo)
)
例2: 次のCREATE TABLE文は、TVストリーミング・アプリケーションからのデータを保持するstream_acct表を定義します。
CREATE TABLE stream_acct(
acct_id INTEGER,
profile_name STRING,
account_expiry TIMESTAMP(1),
acct_data JSON, 
PRIMARY KEY(acct_id)
)
例3:次のCREATE TABLE文は、TVストリーミング・アプリケーションからのデータを保持するstream_acct_new 表を定義します。表の行は2日で失効します。
CREATE TABLE stream_acct_new(
acct_id INTEGER,
profile_name STRING,
account_expiry TIMESTAMP(1),
acct_data JSON, 
PRIMARY KEY(acct_id)) USING TTL 2 days

TableRequest APIの使用

TableRequest APIを使用して、NoSQL表を作成できます。

TableRequestクラスは、表の作成に使用されます。このリクエストで指定された操作の実行は非同期です。これらは長時間実行される可能性があります。TableRequest操作からTableResultが返され、表の状態がカプセル化されます。TableRequestクラスとそのメソッドの詳細は、Oracle NoSQL Java SDK APIリファレンスを参照してください。

ここにあるサンプルからCreateTable.javaのフル・コードをダウンロードします。
private static void createTab(NoSQLHandle handle) throws Exception {
   String createTableDDL = 
   "CREATE TABLE IF NOT EXISTS " + tableName +
                               "(acct_Id INTEGER," +
                               "profile_name STRING," +
                               "account_expiry TIMESTAMP(1) ," +
                               "acct_data JSON, " +
                               "PRIMARY KEY(acct_Id))";

   TableLimits limits = new TableLimits(20, 20, 1);
   TableRequest treq = new TableRequest()
          .setStatement(createTableDDL)
          .setTableLimits(limits);
   TableResult tres = handle.tableRequest(treq);
   /* The request is async,
    * so wait for the table to become active.
    */
    tres.waitForCompletion(handle, 60000,1000); 
    System.out.println("Created Table: " + tableName);
}

ノート:

表の制限は、Oracle NoSQL Database Cloud Serviceにのみ適用されます。オンプレミスのNoSQLデータベースに制限が設定されている場合は、暗黙的に無視されます。

子表の作成:同じTableRequestクラスおよびメソッドを使用して、DDL文を実行して子表を作成します。

子表の作成中:
  • 表のフルネーム(name_parent_table.name_child_table)を指定する必要があります。
  • 子テーブルが親テーブルの制限を継承するため、テーブルの制限を明示的に設定する必要はありません。

ここで親子表の作成方法を理解するには、サンプルから完全なコードTableJoins.javaをダウンロードします。

borneo.TableRequestクラスは、表の作成に使用されます。borneo.NoSQLHandle.table_request()へのすべてのコールは非同期であるため、結果を確認し、borneo.TableResult.wait_for_completion()をコールして操作が完了するまで待機する必要があります。table_requestおよびそのメソッドの詳細は、Oracle NoSQL Python SDK APIリファレンスを参照してください。

ここにあるサンプルからフル・コードCreateTable.pyをダウンロードします。
def create_table(handle):
  statement = '''create table if not exists 
              stream_acct (acct_Id INTEGER,
                           profile_name STRING,
                           account_expiry TIMESTAMP(1),
                           acct_data JSON,
                           primary key(acct_Id))'''

    request = TableRequest().set_statement(statement)
                            .set_table_limits(TableLimits(20, 10, 1))

    table_result = handle.do_table_request(request, 40000, 3000)
    table_result.wait_for_completion(handle, 40000, 3000)

    if (table_result.get_state() == State.ACTIVE):
        print('Created table: stream_acct')
    else:
        raise NameError('Table stream_acct is in an unexpected state ' + 
                             str(table_result.get_state()))

ノート:

表の制限は、Oracle NoSQL Database Cloud Serviceにのみ適用されます。オンプレミスのNoSQLデータベースに制限が設定されている場合は、暗黙的に無視されます。

子表の作成:同じTableRequestクラスおよびメソッドを使用して、DDL文を実行して子表を作成します。

子表の作成中:
  • 表のフルネーム(name_parent_table.name_child_table)を指定する必要があります。
  • 子テーブルが親テーブルの制限を継承するため、テーブルの制限を明示的に設定する必要はありません。

ここの例からフル・コードTableJoins.py をダウンロードします。

TableRequestクラスは、表の作成に使用されます。TableRequestで指定された操作の実行は非同期です。これらは長時間実行される可能性があります。このリクエストは、Client.DoTableRequest()操作の入力として使用され、表が目的の状態になるまでポーリングに使用できるTableResultを返します。TableRequestクラスの様々なメソッドの詳細は、Oracle NoSQL Go SDK APIリファレンスを参照してください。

ここの例からCreateTable.goのフル・コードをダウンロードします。
func createTable(client *nosqldb.Client, err error, tableName string)(){
// Creates a table
 stmt := fmt.Sprintf("CREATE TABLE IF NOT EXISTS %s ("+
     	"acct_Id INTEGER," +
     	"profile_name STRING," +
     	"account_expiry TIMESTAMP(1) ," +
     	"acct_data JSON, " +
     	"PRIMARY KEY(acct_Id))",tableName)

 tableReq := &nosqldb.TableRequest{
		Statement: stmt,
		TableLimits: &nosqldb.TableLimits{
			ReadUnits:  20,
			WriteUnits: 20,
			StorageGB:  1,
              },
 }

 tableRes, err := client.DoTableRequest(tableReq)
 if err != nil {
    fmt.Printf("cannot initiate CREATE TABLE request: %v\n", err)
    return
 }
 // The create table request is asynchronous, 
 // wait for table creation to complete.
 _, err = tableRes.WaitForCompletion(client, 60*time.Second, time.Second)

 if err != nil {
    fmt.Printf("Error finishing CREATE TABLE request: %v\n", err)
    return
 }
 fmt.Println("Created table: ", tableName)
 return
}

ノート:

表の制限は、Oracle NoSQL Database Cloud Serviceにのみ適用されます。オンプレミスのNoSQLデータベースに制限が設定されている場合は、暗黙的に無視されます。

子表の作成:同じTableRequestクラスおよびメソッドを使用して、DDL文を実行して子表を作成します。

子表の作成中:
  • 表のフルネーム(name_parent_table.name_child_table)を指定する必要があります。
  • 子テーブルが親テーブルの制限を継承するため、テーブルの制限を明示的に設定する必要はありません。

ここの例からフル・コードTableJoins.goをダウンロードします。

tableDDLメソッドを使用して表を作成できます。このメソッドは非同期で、TableResultのPromiseを返します。TableResultは、TableState、名前、スキーマ、TableLimitsなどのDDL操作のステータスを含むプレーンJavaScriptオブジェクトです。メソッドの詳細は、NoSQLClientクラスを参照してください。

tableDDLメソッドは、2番目のオプションの引数としてTableDDLOptオブジェクトを取ります。表を作成する場合は、opt引数の一部としてTableLimitsを指定する必要があります。TableLimitsは、読取りユニット、書込みユニットおよびストレージのギガバイトの量として、表の最大スループットおよびストレージ容量を指定します。

CreateTable.jsのすべてのJavaScriptコードをここの例からダウンロードし、完全なTypeScriptコードCreateTable.tsここの例からダウンロードします。

import {NoSQLClient, TableState } from 'oracle-nosqldb';
const client = new NoSQLClient('config.json');
const TABLE_NAME = 'stream_acct;
async function createTable(handle) {
  const createDDL = `CREATE TABLE IF NOT EXISTS 
                  ${TABLE_NAME} (acct_Id INTEGER,
                                 profile_name STRING,
                                 account_expiry TIMESTAMP(1),
                                 acct_data JSON,
                                 primary key(acct_Id))`;
   /* For Provisioned Capacity specify read units, write units, and storage limit as shown below*/
   /* For On-demand Capacity - set only the storage limit and specify the mode as shown here.
    * { storageGB: 25, mode: CapacityMode.ON_DEMAND }; 
    */
  let res =  await handle.tableDDL(createDDL, {
             complete: true,
             tableLimits: {
              readUnits: 20,
              writeUnits: 20,
              storageGB: 1
             }
  });
  console.log('Created table: ' + TABLE_NAME);
}
前述のコールが返されると、結果は操作の最終状態を反映します。または、完全なオプションを使用するには、前述のトライキャッチ・ブロックのコードを次のコード・サンプルに置き換えます。
const createDDL = `CREATE TABLE IF NOT EXISTS 
                  ${TABLE_NAME} (acct_Id INTEGER,
                                 profile_name STRING,
                                 account_expiry TIMESTAMP(1),
                                 acct_data JSON,
                                 primary key(acct_Id))`;
 let res =  await client.tableDDL(createDDL, {complete: true,});
console.log('Created table: ' + TABLE_NAME);

子表の作成:同じTableRequestクラスおよびメソッドを使用して、DDL文を実行して子表を作成します。

子表の作成中:
  • 表のフルネーム(name_parent_table.name_child_table)を指定する必要があります。
  • 子テーブルが親テーブルの制限を継承するため、テーブルの制限を明示的に設定する必要はありません。

TableJoins.jsのすべてのJavaScriptコードをここの例からダウンロードし、完全なTypeScriptコードTableJoins.tsここの例からダウンロードします。

表を作成するには、メソッドExecuteTableDDLAsyncまたはExecuteTableDDLWithCompletionAsyncのいずれかを使用します。これらのメソッドはどちらもTask<TableResult>を返します。TableResultインスタンスには、TableStateなどのDDL操作および表スキーマのステータスが含まれます。これらのメソッドの詳細は、Oracle NoSQL Dotnet SDK APIリファレンスを参照してください。

ここにあるサンプルからCreateTable.csのフル・コードをダウンロードします。
private static async Task createTable(NoSQLClient client){
// Create a table
  var sql =
    $@"CREATE TABLE IF NOT EXISTS 
         {TableName}(acct_Id INTEGER,
                     profile_name STRING,
                     account_expiry TIMESTAMP(1),
                     acct_data JSON,
                     primary key(acct_Id))";
  var tableResult = await client.ExecuteTableDDLAsync(sql,
    new TableDDLOptions{TableLimits = new TableLimits(20, 20, 1)});

  // Wait for the operation completion
  await tableResult.WaitForCompletionAsync();
  Console.WriteLine("  Created table: ",tableResult.TableName);  
}

ノート:

表の制限は、Oracle NoSQL Database Cloud Serviceにのみ適用されます。オンプレミスのNoSQLデータベースに制限が設定されている場合は、暗黙的に無視されます。

子表の作成:同じTableRequestクラスおよびメソッドを使用して、DDL文を実行して子表を作成します。

子表の作成中:
  • 表のフルネーム(name_parent_table.name_child_table)を指定する必要があります。
  • 子テーブルが親テーブルの制限を継承するため、テーブルの制限を明示的に設定する必要はありません。

ここの例からフル・コードTableJoins.csをダウンロードします。