Usando APIs para criar uma Tabela Singleton

A tabela é a estrutura básica para armazenar dados do usuário. Você usa um comando SQL (instrução CREATE TABLE) ou comandos de API TableRequest para criar uma nova tabela.

Você também pode usar a console do Oracle NoSQL Cloud Infrastructure(OCI) ou a interface de linha de comando do OCI (OCI-cli) para criar uma tabela no NDCS.

Diretrizes para criar uma tabela:

Criar uma tabela:

Usando comandos SQL

Você pode usar o comando CREATE TABLE em SQL para criar tabelas NoSQL.

A seção a seguir destaca diferentes opções que podem ser usadas durante a criação de uma tabela usando a instrução CREATE TABLE DDL.

Exemplo 1: Crie uma tabela do aplicativo de rastreamento de bagagem de companhia aérea que contenha informações de bagagem de passageiros em um sistema de companhia aérea.

CREATE TABLE BaggageInfo (
ticketNo LONG,
fullName STRING,
gender STRING,
contactPhone STRING,
confNo STRING,
bagInfo JSON,
PRIMARY KEY (ticketNo)
)

No esquema acima, você usa a instrução CREATE TABLE para definir uma tabela BaggageInfo. O número do bilhete do passageiro, ticketNo, é a chave primária da tabela. Os campos fullName, gender, contactPhone e confNo (número da reserva) armazenam as informações do passageiro, que fazem parte de um esquema fixo. A coluna bagInfo é um array JSON sem esquema, que representa as informações de rastreamento da bagagem de porão de um passageiro.

Para obter mais detalhes sobre o aplicativo de rastreamento de bagagem de companhia aérea, consulte Aplicativo de rastreamento de bagagem de companhia aérea.

Exemplo 2: Crie uma tabela de serviço de mídia de streaming com um campo JSON para acompanhar a atividade atual do assinante.

CREATE TABLE stream_acct(
acct_id INTEGER,
profile_name STRING,
account_expiry TIMESTAMP(9),
acct_data JSON,
PRIMARY KEY(acct_id)
)USING TTL 5 DAYS

No esquema acima, você usa a instrução CREATE TABLE para criar uma tabela stream_acct. O campo ID da conta do assinante, acct_id, é a chave primária nesta tabela. Os campos profile_name, account_expiry armazenam os detalhes da viewership, que faz parte do esquema fixo. A coluna acct_data é um campo JSON sem esquema, que armazena os detalhes das mostras exibidas por um assinante.

Para obter mais detalhes sobre o aplicativo de serviço de streaming de mídia, consulte Streaming Media Service - Armazenamento de perfis de usuário persistente

Você também especifica um valor TTL, após o qual as linhas expiram automaticamente e não estão mais disponíveis. O valor TTL deve estar em HOURS ou DAYS. Neste esquema, as linhas da tabela expiram após 5 dias.

Exemplo 3: Crie uma tabela de serviço de streaming de mídia com várias definições de esquema fixo.

CREATE TABLE IF NOT EXISTS stream_acct(
acct_id INTEGER,
profile_name STRING,
account_expiry TIMESTAMP(9),
acct_data RECORD (
firstName STRING,
lastName STRING,
country STRING,
shows JSON
),
PRIMARY KEY(acct_id)
)

No esquema acima, você define uma variação do esquema fixo incluindo o campo acct_data como um tipo de dados RECORD.

Um registro é uma coleção ordenada de um ou mais pares de item-chave. As chaves em um registro devem ser strings e os itens associados podem ser de tipos de dados diferentes. Os campos em um registro fazem parte do esquema fixo e você não poderá adicioná-los nem removê-los. No exemplo acima, os campos firstName, lastName, country e shows são as chaves do registro acct_data. A definição de um registro é útil quando você deseja armazenar dados como parte de um conjunto de dados maior. Você pode inserir/atualizar/buscar todo o subconjunto em um registro usando as expressões de etapa de campo.

Você também pode aninhar os registros da seguinte forma:

CREATE TABLE IF NOT EXISTS  stream_acct(
acct_id INTEGER,
profile_name STRING,
account_expiry TIMESTAMP(9),
acct_data RECORD (
   firstName STRING,
   lastName STRING,
   country STRING,
   shows RECORD (
           showName STRING,
           showId INTEGER,
           type JSON,
           numSeasons INTEGER,
           seriesInfo ARRAY(JSON)
   )
),
PRIMARY KEY(acct_id)
)

O campo shows é um tipo RECORD aninhado usado para rastrear os detalhes das mostras exibidas.

Exemplo 4: Crie uma tabela de serviço de streaming de mídia como uma estrutura de tabela hierárquica.

Nos esquemas a seguir, você cria a tabela stream_acct como tabela pai e a tabela acct_data como tabela filho:

CREATE TABLE IF NOT EXISTS stream_acct(
acct_id INTEGER,
profile_name STRING,
account_expiry TIMESTAMP(9),
PRIMARY KEY(acct_id))
CREATE TABLE IF NOT EXISTS stream_acct.acct_data(
profile_id INTEGER,
user_name STRING,
firstName STRING,
lastName  STRING,
country   STRING,
shows     JSON,
PRIMARY KEY(profile_id))

Com a definição de tabela pai-filho acima, o serviço de mídia de streaming pode suportar vários perfis de usuário em uma única assinatura.

Você define a tabela acct_data como uma tabela filha com uma chave primária profile_id para identificar o perfil de um usuário. Além de definir uma chave primária para a tabela, a tabela acct_data herda implicitamente a coluna de chave primária acct_id de sua tabela pai stream_acct.

Você pode definir várias tabelas filho na mesma tabela pai stream_acct. Você pode definir ainda mais tabelas filho para a tabela acct_data. Todas as tabelas na hierarquia têm a mesma coluna de chave de partição, que é especificada na instrução de criação de tabela da tabela pai mais alta na hierarquia. Neste exemplo, a chave primária acct_id da tabela pai também é a chave de partição das tabelas stream_acct e acct_data.

Exemplo 5: Crie uma tabela de serviço de mídia de streaming com a chave primária como uma coluna IDENTITY.

CREATE TABLE IF NOT EXISTS stream_acct(
acct_id INTEGER GENERATED BY DEFAULT AS IDENTITY (START WITH 4 INCREMENT BY 1 NO CYCLE),
profile_name STRING,
account_expiry TIMESTAMP(9),
acct_data JSON,
PRIMARY KEY(acct_id)
)

Neste exemplo, você cria a tabela stream_acct com os mesmos campos definidos no Exemplo 2. No entanto, o esquema define a chave primária acct_id como uma coluna IDENTITY. Quando você define uma coluna IDENTITY como GENERATED BY DEFAULT AS IDENTITY, o sistema gera os valores da coluna IDENTITY automaticamente se você não fornecer um. O sistema começa a gerar valores acct_id de 4 incrementando em 1. Portanto, os valores para a coluna acct_id serão 4, 5, 6… e assim por diante até o valor máximo do tipo de dados LONG. Como o esquema define a opção NO CYCLE, o sistema gera uma exceção após o valor máximo, pois atingiu o final do gerador de sequência.

Exemplo 6: Crie uma tabela de serviço de mídia de streaming com a chave primária como um tipo de dados UUID.

CREATE TABLE IF NOT EXISTS stream_acct(
acct_id STRING AS UUID GENERATED BY DEFAULT,
profile_name STRING,
account_expiry TIMESTAMP(9),
acct_data JSON,
PRIMARY KEY(acct_id)
)

Neste exemplo, você cria a tabela stream_acct com os mesmos campos definidos no Exemplo 2. No entanto, o esquema define a chave primária acct_id como um tipo de dados UUID, GERATED BY DEFAULT. O sistema irá gerar automaticamente um valor para a coluna UUID se você não fornecer um. A vantagem potencial de definir a chave primária como um tipo de dados UUID é que, enquanto o sistema garante a exclusividade das colunas IDENTITY somente dentro de um armazenamento de dados NoSQL em uma região, o tipo de dados UUID gera um identificador globalmente exclusivo para os registros em uma tabela que abrange várias regiões.

Tabelas de coleta JSON

Exemplo 7: Crie uma tabela de serviço de mídia de streaming como uma tabela de coleta JSON.

Na seguinte instrução CREATE TABLE, você cria a tabela stream_acct como uma tabela de coleta JSON:

CREATE TABLE IF NOT EXISTS stream_acct(
acct_id INTEGER,
PRIMARY KEY(acct_id)) AS JSON COLLECTION

Esta tabela de coleta JSON inclui o acct_id como o campo de chave primária. Não há necessidade de fornecer outro campo, exceto o campo de chave primária no comando DDL.

Quando você insere dados nesta tabela, a tabela de coleta JSON considera automaticamente os campos inseridos diferentes do campo acct_id como campos JSON. Você pode usar essa tabela de coleta JSON para armazenar e recuperar dados de streaming de TV puramente como documentos.

Exemplo 8: Crie uma tabela de aplicativos de compra como uma tabela de coleta JSON.

A instrução CREATE TABLE a seguir define uma tabela storeAcct, que é uma tabela de coleta JSON criada para um aplicativo de compra. Esta tabela inclui o contactPhone como o campo de chave primária da string de tipo.

CREATE TABLE storeAcct(
contactPhone string,
primary key(contactPhone)) AS JSON COLLECTION

Usando a API TableRequest

Você pode usar a API TableRequest para criar tabelas NoSQL.

A classe TableRequest é usada para criar tabelas. A execução das operações especificadas por esta solicitação é assíncrona. Estas são operações potencialmente de longa duração. TableResult é retornado de operações TableRequest e encapsula o estado da tabela. Consulte Referência da API do Oracle NoSQL Java SDK para obter mais detalhes sobre a classe TableRequest e seus métodos.

Faça download do código completo CreateTable.java nos exemplos aqui.

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);
}

Observação: Os limites de tabela são aplicáveis somente ao Oracle NoSQL Database Cloud Service. Se os limites forem definidos para um Banco de Dados NoSQL local, eles serão ignorados silenciosamente.

Criando uma tabela filha: Você usa a mesma classe TableRequest e os mesmos métodos para executar a instrução DDL para criar uma tabela filha.

Ao criar uma tabela filho:

  • Você precisa especificar o nome completo da tabela (name_parent_table.name_child_table)

  • Os limites da tabela não precisam ser definidos explicitamente porque uma tabela filho herda os limites de uma tabela pai.

Faça download do código completo TableJoins.java dos exemplos para compreender como criar uma tabela pai-filho aqui.

Criando uma tabela de coleta JSON:

A tabela de coleta JSON inclui documentos com um ou mais campos de chave primária e campos JSON. A seguinte amostra cria a tabela stream_acct como uma tabela de coleta JSON:

/* Create a JSON collection table with an integer primary key */
private static void createTable(NoSQLHandle handle) throws Exception {
    String createTableDDL =
        "CREATE TABLE IF NOT EXISTS " + tableName +
        "(acct_Id INTEGER, PRIMARY KEY(acct_Id)) AS JSON COLLECTION";

    TableRequest treq = new TableRequest().setStatement(createTableDDL);

    System.out.println("Creating table");
    TableResult tres = handle.tableRequest(treq);

    /* The table request is asynchronous, so wait for the table to become active. */
    TableResult.waitForState(handle, tres.getTableName(), TableResult.State.ACTIVE, 60000, 1000);
}

A classe borneo.TableRequest é usada para criar uma tabela. Todas as chamadas para borneo.NoSQLHandle.table_request() são assíncronas, portanto, é necessário verificar o resultado e chamar borneo.TableResult.wait_for_completion() para aguardar a conclusão da operação. Consulte Referência da API do Oracle NoSQL Python SDK para obter mais detalhes sobre o table_request e seus métodos.

Faça download do código completo CreateTable.py nos exemplos aqui.

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()))

Observação: Os limites de tabela são aplicáveis somente ao Oracle NoSQL Database Cloud Service. Se os limites forem definidos para um Banco de Dados NoSQL local, eles serão ignorados silenciosamente.

Criando uma tabela filha: Você usa a mesma classe TableRequest e os mesmos métodos para executar a instrução DDL para criar uma tabela filha.

Ao criar uma tabela filho:

  • Você precisa especificar o nome completo da tabela (name_parent_table.name_child_table).

  • Os limites da tabela não precisam ser definidos explicitamente porque uma tabela filho herda os limites de uma tabela pai.

Faça download do código completo TableJoins.py nos exemplos aqui.

Criando uma tabela de coleta JSON:

A tabela de coleta JSON inclui documentos com um ou mais campos de chave primária e campos JSON. A seguinte amostra cria a tabela stream_acct como uma tabela de coleta JSON:

# Create a JSON collection table with an integer primary key
statement = '''CREATE TABLE IF NOT EXISTS stream_acct
               (acct_Id INTEGER, PRIMARY KEY(acct_Id))
               AS JSON COLLECTION'''

print('Creating table: ' + statement)

request = TableRequest().set_statement(statement)

# Wait for 60 seconds, polling every 1 second
result = handle.do_table_request(request, 60000, 1000)
result.wait_for_completion(handle, 60000, 1000)

print('Created table: stream_acct')

A classe TableRequest é usada para criar uma tabela. A execução das operações especificadas pelo TableRequest é assíncrona. Estas são operações potencialmente de longa duração. Essa solicitação é usada como entrada de uma operação Client.DoTableRequest(), que retorna uma TableResult que pode ser usada para sondagem até que a tabela atinja o estado desejado. Consulte Referência da API do Oracle NoSQL Go SDK para obter mais detalhes sobre os vários métodos da classe TableRequest.

Faça download do código completo CreateTable.go nos exemplos aqui.

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
}

Observação: Os limites de tabela são aplicáveis somente ao Oracle NoSQL Database Cloud Service. Se os limites forem definidos para um Banco de Dados NoSQL local, eles serão ignorados silenciosamente.

Criando uma tabela filha: Você usa a mesma classe TableRequest e os mesmos métodos para executar a instrução DDL para criar uma tabela filha.

Ao criar uma tabela filho:

  • Você precisa especificar o nome completo da tabela (name_parent_table.name_child_table).

  • Os limites da tabela não precisam ser definidos explicitamente porque uma tabela filho herda os limites de uma tabela pai.

Faça download do código completo TableJoins.go dos exemplos aqui.

Criando uma tabela de coleta JSON:

A tabela de coleta JSON inclui documentos com um ou mais campos de chave primária e campos JSON. A seguinte amostra cria a tabela stream_acct como uma tabela de coleta JSON:

/* Create a JSON collection table with an integer primary key */

func createTable(client *nosqldb.Client) error {
	tableName := "stream_acct"

	stmt := fmt.Sprintf(
		"CREATE TABLE IF NOT EXISTS %s "+
			"(acct_Id INTEGER, PRIMARY KEY(acct_Id)) "+
			"AS JSON COLLECTION",
		tableName,
	)

	fmt.Println("Creating table:", stmt)

	tableReq := &nosqldb.TableRequest{
		Statement: stmt,
	}

	tableRes, err := client.DoTableRequest(tableReq)
	if err != nil {
		return err
	}

	// Wait for 60 seconds, polling every 1 second.
	_, err = tableRes.WaitForCompletion(
		client,
		60*time.Second,
		time.Second,
	)
	if err != nil {
		return err
	}

	fmt.Println("Created table:", tableName)
	return nil
}

Você pode criar uma tabela usando o método tableDDL. Este método é assíncrono e retorna uma Promessa de TableResult. O TableResult é um objeto JavaScript sem formatação que contém o status da operação DDL, como TableState, nome, esquema e TableLimits. Para obter detalhes do método, consulte a classe NoSQLClient.

O método tableDDL usa o objeto TableDDLOpt como segundo argumento opcional. Ao criar uma tabela, você deve especificar seu TableLimits como parte do argumento opt. O TableLimits especifica o throughput máximo e a capacidade de armazenamento da tabela como a quantidade de unidades de leitura, unidades de gravação e Gigabytes de armazenamento.

Faça download do código JavaScript completo CreateTable.js nos exemplos aqui e do código TypeScript completo CreateTable.ts nos exemplos aqui.

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);
}

Após o retorno da chamada acima, o resultado refletirá o estado final da operação. Alternativamente, para usar a opção completa, substitua o código no bloco try-catch acima pelo seguinte exemplo de código.

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);

Criando uma tabela filha: Você usa a mesma classe TableRequest e os mesmos métodos para executar a instrução DDL para criar uma tabela filha.

Ao criar uma tabela filho:

  • Você precisa especificar o nome completo da tabela (name_parent_table.name_child_table)

  • Os limites da tabela não precisam ser definidos explicitamente porque uma tabela filho herda os limites de uma tabela pai.

Faça download do código JavaScript completo TableJoins.js nos exemplos aqui e do código TypeScript completo TableJoins.ts nos exemplos aqui.

Criando uma tabela de coleta JSON:

A tabela de coleta JSON inclui documentos com um ou mais campos de chave primária e campos JSON. A seguinte amostra cria a tabela stream_acct como uma tabela de coleta JSON:

/* Create a JSON collection table with an integer primary key */

const client = new NoSQLClient('config.json');
const TABLE_NAME = 'stream_acct';

async function createTable() {
    const createDDL =
        `CREATE TABLE IF NOT EXISTS ${TABLE_NAME} ` +
        `(acct_Id INTEGER, PRIMARY KEY(acct_Id)) ` +
        `AS JSON COLLECTION`;

    console.log('Create table: ' + createDDL);

    try {
        await client.tableDDL(createDDL, {
            complete: true
        });

        console.log('Created table: ' + TABLE_NAME);
    } catch (error) {
        console.error('Table creation failed:', error);
        throw error;
    }
}

Para criar uma tabela, use um dos métodos ExecuteTableDDLAsync ou ExecuteTableDDLWithCompletionAsync. Ambos os métodos retornam Task<TableResult>. A instância TableResult contém o status da operação DDL, como TableState e esquema de tabela. Consulte Referência da API do SDK do Oracle NoSQL Dotnet para obter mais detalhes sobre esses métodos.

Faça download do código completo CreateTable.cs nos exemplos aqui.

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);
}

Observação: Os limites de tabela são aplicáveis somente ao Oracle NoSQL Database Cloud Service. Se os limites forem definidos para um Banco de Dados NoSQL local, eles serão ignorados silenciosamente.

Criando uma tabela filha: Você usa a mesma classe TableRequest e os mesmos métodos para executar a instrução DDL para criar uma tabela filha.

Ao criar uma tabela filho:

  • Você precisa especificar o nome completo da tabela (name_parent_table.name_child_table)

  • Os limites da tabela não precisam ser definidos explicitamente porque uma tabela filho herda os limites de uma tabela pai.

Faça download do código completo TableJoins.cs nos exemplos aqui.

Criando uma tabela de coleta JSON:

A tabela de coleta JSON inclui documentos com um ou mais campos de chave primária e campos JSON. A seguinte amostra cria a tabela stream_acct como uma tabela de coleta JSON:

/* Create a JSON collection table with an integer primary key */

private static async Task CreateTableAsync(NoSQLClient client)
{
    const string tableName = "stream_acct";

    var statement =
        $"CREATE TABLE IF NOT EXISTS {tableName} " +
        "(acct_Id INTEGER, PRIMARY KEY(acct_Id)) " +
        "AS JSON COLLECTION";

    Console.WriteLine($"Creating table: {statement}");

    var result = await client.ExecuteTableDDLAsync(statement);
    await result.WaitForCompletionAsync();

    Console.WriteLine($"Table {tableName} created.");
}