SnowConvert AI - Oracle - Tipos de dados

Esta seção mostra os equivalentes entre os tipos de dados no Oracle e no Snowflake, bem como algumas observações sobre diferenças aritméticas.

Oracle

Snowflake

Tipos de dados ANSI

*Acesse o link para obter mais informações

BFILE

VARCHAR

BINARY_DOUBLE

FLOAT

BINARY_FLOAT

FLOAT

BLOB

BINARY

CHAR (N)

CHAR (N)

CLOB

VARCHAR

DATE

TIMESTAMP

FLOAT

FLOAT

INTERVAL YEAR TO MONTH

VARCHAR(20)

INTERVAL DAY TO SECOND

VARCHAR(20)

JSON

VARIANT

LONG

VARCHAR

LONG RAW

BINARY

NCHAR (N)

NCHAR (N)

NCLOB

VARCHAR

NUMBER(p, s)

NUMBER(p, s)

NVARCHAR2 (N)

VARCHAR (N)

RAW

BINARY

ROWID

VARCHAR(18)

VARCHAR2 (N)

VARCHAR (N)

SDO_GOMETRY

Atualmente incompatível

SDO_TOPO___GEOMETRY

*a ser definido

SDO_GEORASTER

*a ser definido

SYS.ANYDATA

VARIANT

SYS.ANYDATASET

*a ser definido

SYS.ANYTYPE

*a ser definido

TIMESTAMP

TIMESTAMP

TIMESTAMP WITH TIME ZONE

TIMESTAMP_TZ

TIMESTAMP WITH LOCAL TIME ZONE

TIMESTAMP_LTZ

URITYPE

*a ser definido

UROWID

VARCHAR(18)

VARCHAR

VARCHAR

VARCHAR2

VARCHAR

XMLType

VARIANT

Notas sobre operações aritméticas

Lembre-se de que toda operação realizada em tipos de dados numéricos é armazenada internamente como um número. Além disso, dependendo da operação realizada, é possível incorrer em um erro relacionado à forma como os valores intermediários são armazenados no Snowflake. Para obter mais informações, consulte esta postagem sobre números intermediários no Snowflake.

Tipos de dados de ANSI

Descrição

Instruções SQL que criam tabelas e clusters também podem usar os tipos de dados ANSI e os tipos de dados dos produtos IBM SQL/DS e DB2. A Oracle reconhece o nome do tipo de dados ANSI ou IBM que é diferente do nome do tipo de dados do Oracle Database. Ele converte o tipo de dados para o tipo de dados Oracle equivalente, registra o tipo de dados Oracle como o nome do tipo de dados da coluna e armazena os dados da coluna no tipo de dados Oracle com base nas conversões mostradas nas tabelas a seguir. (Tipos de dados ANSI, DB2 e SQL/DS da referência de linguagem Oracle).

Ao criar uma nova tabela, o Oracle e o Snowflake tratam alguns tipos de dados como sinônimos e aliases e os transformam no tipo de dados padrão. Conforme mostrado na tabela a seguir:

ANSI

ORACLE

SNOWFLAKE

CHARACTER (n)

CHAR (n)

VARCHAR

CHAR (n)

CHAR (n)

VARCHAR

CHARACTER VARYING (n)

VARCHAR2 (n)

VARCHAR

CHAR VARYING (n)

VARCHAR2 (n)

VARCHAR

NATIONAL CHARACTER (n)

NCHAR (n)

VARCHAR*

NATIONAL CHAR (n)

NCHAR (n)

VARCHAR*

NCHAR (n)

NCHAR (n)

VARCHAR

NATIONAL CHARACTER VARYING (n)

NVARCHAR2 (n)

VARCHAR*

NATIONAL CHAR VARYING (n)

NVARCHAR2 (n)

VARCHAR*

NCHAR VARYING (n)

NVARCHAR2 (n)

NUMBER (p, s)

NUMERIC [(p, s)]

NUMBER (p, s)

NUMBER (p, s)

DECIMAL [(p, s)]

NUMBER (p, s)

NUMBER (38)

INTEGER

NUMBER (38)

NUMBER (38)

INT

NUMBER (38)

NUMBER (38)

SMALLINT

NUMBER (38)

NUMBER (38)

FLOAT

FLOAT (126)

DOUBLE

DOUBLE PRECISION

FLOAT (126)

DOUBLE

REAL

FLOAT (63)

DOUBLE

Para obter mais informações sobre a especificação de tradução dos tipos de dados Oracle, acesse Tipos de dados internos Oracle.

Nota

VARCHAR*: Quase todos os tipos de dados ANSI são compilados no Snowflake, mas aqueles marcados com um asterisco são convertidos manualmente para VARCHAR.

Problemas conhecidos

Não foram encontrados problemas.

Personalização do tipo de dados

A conversão do tipo de dados durante um processo de migração de banco de dados é algo que muitos usuários precisam para personalizar e definir valores de precisão com mais precisão. Por esse motivo, o SnowConvert AI permite a personalização do tipo de dados para especificar regras de transformação de tipo de dados considerando a origem do tipo de dados e o nome da coluna.

Tipos de dados suportados

Os seguintes tipos de dados são compatíveis

  • NUMBER

Estrutura de JSON

O SnowConvert AI recebe um arquivo JSON com a seguinte estrutura.

{
  "types" : {
  },
  "columns": [
      {
          "nameExpression" : "",
          "targetType" : ""
      }
  ]
}
Copy

O objeto types define o tipo de dados de origem e o tipo de dados que o destino deve ser. Além disso, você pode definir uma regra geral que converte o tipo de dados de origem com ou sem precisão. Por exemplo:

"types" : {
    "NUMBER" : "NUMBER(11, 2)",
    "NUMBER(10, 0)" : "NUMBER(3, 0)"
}
Copy

O objeto columns é uma matriz, e cada objeto da matriz define o nome ou a expressão regex das colunas para alterar o tipo.

"columns": [
    {
        "nameExpression" : "MONTH",
        "targetType" : "NUMBER(2,0)"
    }
]
Copy

Nota

Ao usar a personalização de expressões regulares, a migração pode ser afetada se a regex não estiver correta.

Prioridade de personalização

Pode haver regras de personalização que se aplicam ao mesmo objeto; entretanto, apenas um será escolhido. O SnowConvert AI considerará as seguintes condições para priorizar qual regra seguir.

  1. A primeira regra em colunas está localizada de cima para baixo.

  2. A regra definida no tipo considerando a precisão.

  3. A regra geral é definida para o tipo de dados.

  4. A regra é definida no SnowConvert.

Exemplo

Digamos que temos o seguinte código de entrada.

Código de entrada

CREATE TABLE employees (
	employee_ID NUMBER,
	manager_YEAR NUMBER(10, 0),
	manager_MONTH NUMBER(10, 0)
);
Copy

E as seguintes informações de renomeação

Arquivo de personalização (.JSON)

{
    "types" : {
        "NUMBER" : "NUMBER(11, 2)",
        "NUMBER(10, 0)" : "NUMBER(3, 0)"    
    },
    "columns": [
        {
            "nameExpression" : "MONTH",
            "targetType" : "NUMBER(2,0)"
        }
    ]
}
Copy

Esse seria o código de saída com e sem tipos de dados de personalização.

Código de saída do Snowflake
Sem renomeação
CREATE OR REPLACE TABLE employees (
	employee_ID NUMBER(38, 18) /*** SSC-FDM-0006 - NUMBER TYPE COLUMN MAY NOT BEHAVE SIMILARLY IN SNOWFLAKE. ***/,
	manager_YEAR NUMBER(10) /*** SSC-FDM-0006 - NUMBER TYPE COLUMN MAY NOT BEHAVE SIMILARLY IN SNOWFLAKE. ***/,
	manager_MONTH NUMBER(10) /*** SSC-FDM-0006 - NUMBER TYPE COLUMN MAY NOT BEHAVE SIMILARLY IN SNOWFLAKE. ***/
)
;
Copy
Com renomeação
CREATE OR REPLACE TABLE employees (
	employee_ID NUMBER(11, 2),
	manager_YEAR NUMBER(3, 0),
	manager_MONTH NUMBER(2, 0)
)
;
Copy

Observe como todos os tipos de NUMBER são migrados para os tipos especificados no arquivo json.