SnowConvert: Instruções Oracle SQL

Alter Table

Nota

Algumas partes do código de saída foram omitidas por motivos de clareza.

1. Description

Use a instrução ALTER TABLE para alterar a definição de uma tabela não particionada, uma tabela particionada, uma partição de tabela ou uma subpartição de tabela. Para tabelas de objetos ou tabelas relacionais com colunas de objetos, use ALTER TABLE para converter a tabela na definição mais recente de seu tipo referenciado depois que o tipo tiver sido alterado (documentação do Oracle).

Sintaxe do Oracle

 ALTER TABLE [ schema. ] table
  [ alter_table_properties
  | column_clauses
  | constraint_clauses
  | alter_table_partitioning
  | alter_external_table
  | move_table_clause
  ]
  [ enable_disable_clause
  | { ENABLE | DISABLE } { TABLE LOCK | ALL TRIGGERS }
  ] ...
  ;
Copy

Nota

Para analisar a sintaxe do Snowflake, consulte a documentação a seguir.

2. Sample Source Patterns

2.1. Alter table com cláusulas

Aviso

memoptimize_read_clause e memoptimize_read_clause não são aplicáveis no Snowflake, portanto, estão sendo removidas.

Oracle

 ALTER TABLE SOMESCHEMA.SOMENAME 
MEMOPTIMIZE FOR READ 
MEMOPTIMIZE FOR WRITE
 ADD (SOMECOLUMN NUMBER , SOMEOTHERCOLUMN VARCHAR(23)) 
 (PARTITION PT NESTED TABLE COLUMN_VALUE STORE AS SNAME
 ( SUBPARTITION SPART NESTED TABLE COLUMN_VALUE STORE AS SNAME))
ENABLE TABLE LOCK;
Copy

Snowflake

 ALTER TABLE SOMESCHEMA.SOMENAME
ADD (SOMECOLUMN NUMBER(38, 18), SOMEOTHERCOLUMN VARCHAR(23));
Copy

Nota

Somente algumas column_clauses e constraint_clauses são aplicáveis no Snowflake. No Oracle, alter table permite modificar as propriedades das partições criadas, mas, no Snowflake, essas ações não são necessárias

2.2. Alter table com casos não suportados

Oracle

 ALTER TABLE SOMENAME MODIFY COLUMN SCOLUMN NOT SUBSTITUTABLE AT ALL LEVELS FORCE;

ALTER TABLE SOMENAME MODIFY(SCOLUMN VISIBLE,SCOLUMN INVISIBLE);

ALTER TABLE SOMENAME MODIFY VARRAY VARRAYITEM (
STORAGE(PCTINCREASE 10));
Copy

Snowflake

 !!!RESOLVE EWI!!! /*** SSC-EWI-0109 - ALTER TABLE SYNTAX NOT APPLICABLE IN SNOWFLAKE ***/!!!
ALTER TABLE SOMENAME
MODIFY COLUMN SCOLUMN NOT SUBSTITUTABLE AT ALL LEVELS FORCE;

!!!RESOLVE EWI!!! /*** SSC-EWI-0109 - ALTER TABLE SYNTAX NOT APPLICABLE IN SNOWFLAKE ***/!!!

ALTER TABLE SOMENAME
MODIFY(SCOLUMN VISIBLE,SCOLUMN INVISIBLE);

!!!RESOLVE EWI!!! /*** SSC-EWI-0109 - ALTER TABLE SYNTAX NOT APPLICABLE IN SNOWFLAKE ***/!!!

ALTER TABLE SOMENAME
MODIFY VARRAY VARRAYITEM (
STORAGE(PCTINCREASE 10));
Copy

2.3. Ação ADDCONSTRAINT

A ação ADD CONSTRAINT tem um equivalente no Snowflake, mas somente uma restrição pode ser adicionada por instrução ALTER TABLE, portanto, ela será comentada quando a instrução contiver duas ou mais restrições.

Aviso

enable_disable_clause foi removido, pois não é relevante no Snowflake.

Oracle

 -- MULTIPLE CONSTRAINT ADDITION SCENARIO
ALTER TABLE TABLE1 ADD (
CONSTRAINT TABLE1_PK
PRIMARY KEY
(ID)
ENABLE VALIDATE,
CONSTRAINT TABLE1_FK foreign key(ID2)
references TABLE2 (ID) ON DELETE CASCADE);

-- ONLY ONE CONSTRAINT ADDITION SCENARIO
ALTER TABLE TABLE1 ADD (
CONSTRAINT TABLE1_FK foreign key(ID2)
references TABLE2 (ID) ON DELETE CASCADE);
Copy

Snowflake

 -- MULTIPLE CONSTRAINT ADDITION SCENARIO
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0067 - MULTIPLE CONSTRAINT DEFINITION IN A SINGLE STATEMENT IS NOT SUPPORTED IN SNOWFLAKE. ***/!!!
ALTER TABLE TABLE1
ADD (
CONSTRAINT TABLE1_PK
PRIMARY KEY
(ID) ,
CONSTRAINT TABLE1_FK foreign key(ID2)
references TABLE2 (ID) ON DELETE CASCADE);

-- ONLY ONE CONSTRAINT ADDITION SCENARIO
ALTER TABLE TABLE1
ADD
CONSTRAINT TABLE1_FK foreign key(ID2)
references TABLE2 (ID) ON DELETE CASCADE;
Copy

Problemas conhecidos

  1. Algumas propriedades das tabelas podem ser adaptadas ou não aplicáveis.

Drop Table

Nota

Algumas partes do código de saída foram omitidas por motivos de clareza.

Descrição

A instrução Drop Table é usada para remover uma tabela. Essa instrução varia um pouco entre o Oracle e o Snowflake. Verifique novamente cada documentação para obter mais informações sobre as diferenças.

No Oracle, a sintaxe de Drop Table é a seguinte:

 DROP TABLE <table_name> [ CASCADE CONSTRAINTS ] [ PURGE ]
Copy

No Snowflake, a sintaxe de Drop Table é a seguinte:

 DROP TABLE [ IF EXISTS ] <table_name> [ CASCADE | RESTRICT ]
Copy

A principal diferença é que o Snowflake não tem uma cláusula igual para PURGE, pois a tabela não será removida permanentemente do sistema. No entanto, as cláusulas CASCADE CONSTRAINTS e CASCADE são as mesmas. Ambas eliminam a tabela, mesmo que existam chaves estrangeiras que façam referência a essa tabela.

Exemplos

Agora, vamos ver alguns exemplos de código e como ele ficaria depois de ser transformado. Cada exemplo usa uma variação diferente da instrução Drop Table.

Exemplo 1:

Este exemplo usa a instrução Drop Table da forma mais simples possível.

Código de entrada:

 DROP TABLE TEST_TABLE1;
Copy

Código transformado:

 DROP TABLE TEST_TABLE1;
Copy
Exemplo 2:

Este exemplo usa a instrução Drop Table com a cláusula PURGE. Lembre-se de que não há equivalente no Snowflake para a cláusula PURGE dentro de uma instrução Drop Table.

Código de entrada:

 DROP TABLE TEST_TABLE1 PURGE;
Copy

Código transformado:

 DROP TABLE TEST_TABLE1;
Copy
Exemplo 3:

Este exemplo usa a instrução Drop Table com a cláusula CASCADE CONSTRAINTS.

Código de entrada:

 DROP TABLE TEST_TABLE1 CASCADE CONSTRAINTS;
Copy

Código transformado:

 DROP TABLE TEST_TABLE1 CASCADE;
Copy

No código transformado, a palavra CONSTRAINTS é removida da cláusula CASCADE CONSTRAINTS.

Exemplo 4:

Este exemplo usa a instrução Drop Table com as cláusulas CASCADE CONSTRAINTS e PURGE.

Código de entrada:

 DROP TABLE TEST_TABLE1 CASCADE CONSTRAINTS PURGE;
Copy

Código transformado:

 DROP TABLE TEST_TABLE1 CASCADE;
Copy

Como visto, o código muda. No novo código do Snowflake, a cláusula PURGE foi removida e a palavra CONSTRAINTS também foi removida da cláusula CASCADE.

Equivalência funcional

Execute o código a seguir para verificar a equivalência funcional; lembre-se de que a única parte que não é equivalente é a cláusula PURGE, que no Oracle remove completamente a tabela do sistema e não há igual para o Snowflake. Em ambos os casos, a tabela é descartada mesmo que seja referenciada em outra tabela.

Oracle:

 CREATE TABLE TEST_TABLE2 (
    col2 INTEGER,
    CONSTRAINT constraint_name PRIMARY KEY (col2)
);

CREATE TABLE OTHER_TABLE (
    other_col INTEGER REFERENCES TEST_TABLE2 (col2)
);

DROP TABLE TEST_TABLE2 CASCADE CONSTRAINTS PURGE;
Copy

Snowflake:

 CREATE OR REPLACE TABLE TEST_TABLE2 (
       col2 INTEGER,
       CONSTRAINT constraint_name PRIMARY KEY (col2)
   )
   COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
   ;

   CREATE OR REPLACE TABLE OTHER_TABLE (
          other_col INTEGER REFERENCES TEST_TABLE2 (col2)
      )
   COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
   ;

   DROP TABLE TEST_TABLE2 CASCADE;
Copy

EWIs relacionados

Sem EWIs relacionados.

Create Index

Aviso

Atualmente, a instrução _ Create Index _ não está sendo convertida, mas está sendo analisada. Além disso, se o seu código-fonte tiver instruções Create index, elas serão contabilizadas no _ Relatório de avaliação. _

Exemplo de um código analisado de create index:

 CREATE UNIQUE INDEX COL1_INDEX ILM (ADD POLICY OPTIMIZE AFTER 10 DAYS OF NO ACCESS) ON CLUSTER CLUSTER1
ONLINE USABLE DEFERRED INVALIDATION;

CREATE BITMAP INDEX COL1_INDEX ILM (ADD POLICY OPTIMIZE ( ON FUNC1 )) ON TABLE1 AS TAB1 (COL1 ASC) GLOBAL PARTITION BY RANGE (COL1, COL2) ( PARTITION VALUES LESS THAN (MAXVALUE) ) UNUSABLE IMMEDIATE INVALIDATION;

CREATE MULTIVALUE INDEX COL1_INDEX ILM (ADD POLICY SEGMENT TIER TO LOW_COST_TBS) ON TABLE1( TAB1 COL1 DESC, TAB1 COL2 ASC) FROM TABLE1 AS TAB1 WHERE COL1 > 0 LOCAL STORE IN (STORAGE1)
VISIBLE USABLE DEFERRED INVALIDATION;

CREATE INDEX COL1_INDEX ILM (DELETE POLICY POLICY1) ON CLUSTER CLUSTER1
PCTFREE 10
LOGGING
ONLINE
TABLESPACE DEFAULT
NOCOMPRESS
SORT
REVERSE
VISIBLE
INDEXING PARTIAL
NOPARALLEL;

CREATE INDEX COL1_INDEX ILM (DELETE_ALL) ON TABLE1 AS TAB1 (COL1 ASC) LOCAL (
PARTITION PARTITION1 TABLESPACE TABLESPACE1 NOCOMPRESS USABLE) DEFERRED INVALIDATION;

CREATE INDEX COL1_INDEX ON TABLE1 (COL1 ASC) GLOBAL
PARTITION BY HASH (COL1, COL2) (PARTITION PARTITION1 LOB(LOB1) STORE AS BASICFILE LOB_NAME (TABLESPACE TABLESPACE1)) USABLE IMMEDIATE INVALIDATION;

CREATE INDEX COL1_INDEX ON TABLE1 (COL1 DESC, COL2 ASC) INDEXTYPE IS INDEXTYPE1 LOCAL ( PARTITION PARTITION1 PARAMETERS('PARAMS')) NOPARALLEL PARAMETERS('PARAMS') USABLE DEFERRED INVALIDATION;

CREATE INDEX COL1_INDEX ON TABLE1 (COL1 ASC) INDEXTYPE IS XDB.XMLINDEX LOCAL ( PARTITION PARTITION1) PARALLEL 6 UNUSABLE IMMEDIATE INVALIDATION;
Copy

Nota

Por motivos arquitetônicos, o Snowflake não oferece suporte a índices, portanto, o SnowConvert removerá todo o código relacionado à criação de índices. O Snowflake cria automaticamente micropartições para cada tabela que ajudam a acelerar o desempenho das operações de DML. O usuário não precisa se preocupar em criar ou gerenciar essas micropartições.

Normalmente, isso é suficiente para obter um desempenho de consulta excepcionalmente bom. No entanto, há maneiras de aprimorá-lo criando chaves de clustering de dados. A página oficial do Snowflake fornece mais informações sobre micropartições e clustering de dados.

Create Materialized Views

Descrição

No Snowconvert, as exibições materializadas do Oracle são transformadas em tabelas dinâmicas do Snowflake. Para configurar corretamente as tabelas dinâmicas, dois parâmetros essenciais devem ser definidos: TARGET_LAG e WAREHOUSE. Se esses parâmetros não forem especificados nas opções de configuração, o Snowconvert usará como padrão os valores predefinidos durante a conversão, conforme demonstrado no exemplo abaixo.

Para obter mais informações sobre exibições materializadas, clique aqui.

Para obter detalhes sobre os parâmetros necessários para as tabelas dinâmicas, clique aqui.

Amostra de padrões da origem

Oracle

 CREATE MATERIALIZED VIEW sales_total
AS
SELECT SUM(amount) AS total_sales
FROM sales;
Copy

Snowflake

 CREATE OR REPLACE DYNAMIC TABLE sales_total
--** SSC-FDM-0031 - DYNAMIC TABLE REQUIRED PARAMETERS SET BY DEFAULT **
TARGET_LAG='1 day'
WAREHOUSE=UPDATE_DUMMY_WAREHOUSE
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
AS
SELECT SUM(amount) AS total_sales
FROM
sales;
Copy

Modos de atualização

As tabelas dinâmicas do Snowflake suportam um equivalente aos modos de atualização de exibição materializada da Oracle. Os modos correspondentes são os seguintes:

  • Oracle:

    • FAST: Atualiza apenas as linhas que foram alteradas.

    • COMPLETE: Atualiza toda a exibição materializada.

    • FORCE: Usa FAST se possível, caso contrário, usa COMPLETE.

  • Snowflake:

    • AUTO: Determina automaticamente o melhor método de atualização.

    • FULL: Atualiza a tabela inteira, equivalente ao modo COMPLETE do Oracle.

    • INCREMENTAL: Atualiza apenas as linhas alteradas.

Modo de atualização padrão

Ao usar o SnowConvert, o modo de atualização padrão da tabela dinâmica é AUTO.

Mapeamentos de modo
  • Oracle FAST e FORCE -> Snowflake AUTO

  • Oracle COMPLETE -> Snowflake FULL

Para obter mais detalhes, consulte a documentação oficial sobre os modos de atualização do Oracle e os modos de atualização do Snowflake.

Oracle

 CREATE MATERIALIZED VIEW CUSTOMER_SALES_SUMMARY
REFRESH COMPLETE
AS
SELECT
    CUSTOMER_ID,
    SUM(AMOUNT) AS TOTAL_AMOUNT
FROM
    SALES
GROUP BY
    CUSTOMER_ID;
Copy

Snowflake

 CREATE OR REPLACE DYNAMIC TABLE CUSTOMER_SALES_SUMMARY
--** SSC-FDM-0031 - DYNAMIC TABLE REQUIRED PARAMETERS SET BY DEFAULT **
TARGET_LAG='1 day'
WAREHOUSE=UPDATE_DUMMY_WAREHOUSE
REFRESH_MODE=FULL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
AS
SELECT
   CUSTOMER_ID,
   SUM(AMOUNT) AS TOTAL_AMOUNT
FROM
   SALES
GROUP BY
   CUSTOMER_ID;
Copy

Problemas conhecidos

Nenhum erro conhecido foi detectado até o momento.

EWIs relacionados

  1. ssc-fdm-0031.md: Parâmetros obrigatórios da tabela dinâmica definidos por padrão

Create Sequence

Vejamos primeiro um exemplo de código e como ele ficaria depois de ser transformado.

Código de entrada:

 CREATE SEQUENCE SequenceSample
START WITH 1000
INCREMENT BY 1
NOCACHE
NOCYCLE;
Copy

Código de saída:

 CREATE OR REPLACE SEQUENCE SequenceSample
START WITH 1000
INCREMENT BY 1
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}';
Copy

A primeira alteração que é feita é aplicar o esquema ou datawarehouse ao nome da sequência. A segunda transformação consiste em remover alguns elementos e adicioná-los como comentários, já que o oracle tem alguns elementos na sequência de criação que não são compatíveis com o snowflake.

No Oracle, após o nome da sequência, os elementos que não são comentados são os seguintes

  • START WITH 1000

  • INCREMENT BY 1

Se o elemento não for um desses, ele será comentado e adicionado como um aviso logo antes da sequência de criação, como no exemplo.

Os elementos a seguir são os que foram removidos

  • MAXVALUE

  • NOMAXVALUE

  • MINVALUE

  • NOMINVALUE

  • CYCLE

  • NOCYCLE

  • CACHE

  • NOCACHE

  • ORDER

  • NOORDER

  • KEEP

  • NOKEEP

  • SESSION

  • GLOBAL

  • SCALE

  • EXTEND

  • SCALE

  • NOEXTEND

  • NOSCALE

  • SHARD

  • EXTEND

  • SHARD

  • NOEXTEND

  • NOSHARD

SEQUENCE EXPRESSIONS

  • NEXTVAL: A gramática do Snowflake é a mesma do Oracle.

  • CURRVAL: O Snowflake não tem um equivalente, portanto é transformado em uma função de stub. Consulte este link para entender a abordagem do Snowflake.

Código de entrada:
 select seq1.nextval from dual;
select seq1.currval from dual;
Copy
Código de saída:
 select seq1.nextval from dual;

select
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0069 - THE SEQUENCE CURRVAL PROPERTY IS NOT SUPPORTED IN SNOWFLAKE. ***/!!! seq1.currval from dual;
Copy

Sequência STARTWITH

O valor da instrução START WITH pode exceder o valor máximo permitido pelo Snowflake. O que a Snowflake disse sobre o valor inicial é o seguinte: Especifica o primeiro valor retornado pela sequência. Os valores compatíveis são qualquer valor que possa ser representado por um número inteiro de dois complementos de 64 bits (de -2^63 a 2^63-1). Portanto, de acordo com o que foi mencionado anteriormente, o valor máximo permitido é 9223372036854775807 para números positivos e 9223372036854775808 para números negativos.

Exemplo de código

Código de entrada:
 CREATE SEQUENCE SEQUENCE1
START WITH 9223372036854775808;

CREATE SEQUENCE SEQUENCE2
START WITH -9223372036854775809;
Copy
Código de saída:
 CREATE OR REPLACE SEQUENCE SEQUENCE1
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0068 - SEQUENCE START VALUE EXCEEDS THE MAX VALUE ALLOWED BY SNOWFLAKE. ***/!!!
START WITH 9223372036854775808
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}';

CREATE OR REPLACE SEQUENCE SEQUENCE2
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0068 - SEQUENCE START VALUE EXCEEDS THE MAX VALUE ALLOWED BY SNOWFLAKE. ***/!!!
START WITH -9223372036854775809
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}';
Copy

EWIs relacionados

  1. SSC-EWI-OR0069: A propriedade CURRVAL da sequência não é compatível com o Snowflake.

  2. SSC-EWI-OR0068: O valor de início da sequência excede o valor máximo permitido pelo Snowflake.

Alter Session

Alter session

Alter session tem um equivalente no Snowflake e algumas das variáveis são mapeadas para as variáveis do Snowflake. Se uma permutação de Alter Session não for compatível, o nó será comentado e um aviso será adicionado.

Código Oracle:

 alter session set nls_date_format = 'DD-MM-YYYY';
Copy
Código Snowflake:
 ALTER SESSION SET DATE_INPUT_FORMAT = 'DD-MM-YYYY' DATE_OUTPUT_FORMAT = 'DD-MM-YYYY';
Copy

Referência dos parâmetros da sessão

Nota

Os parâmetros de sessão que não aparecem na tabela não estão sendo transformados no momento.

Parâmetro de sessão

Transformação do Snowflake

NLS_DATE_FORMAT

DATE_INPUT_FORMAT e DATE_OUTPUT_FORMAT

NLS_NUMERIC_CHARACTERS

NOT SUPPORTED

Problemas conhecidos

Não foram encontrados problemas.

EWIs Relacionados

Sem EWIs relacionados.

Create Synonym

Nota

Algumas partes do código de saída foram omitidas por motivos de clareza.

Create Synonym

Os sinônimos não são compatíveis com o Snowflake. As referências aos sinônimos serão alteradas para o objeto original.

Código de entrada:

 CREATE OR REPLACE SYNONYM B.TABLITA_SYNONYM FOR TABLITA;
Copy
Código de saída:
 ----** SSC-FDM-OR0005 - SYNONYMS NOT SUPPORTED IN SNOWFLAKE BUT REFERENCES TO THIS SYNONYM WERE CHANGED BY THE ORIGINAL OBJECT NAME. **
--CREATE OR REPLACE SYNONYM B.TABLITA_SYNONYM FOR TABLITA
                                                       ;
Copy

Exemplo 1: Sinônimo que se refere a uma tabela.

Código-fonte Oracle:

 CREATE TABLE TABLITA
(
    COLUMN1 NUMBER
);

CREATE OR REPLACE SYNONYM B.TABLITA_SYNONYM FOR TABLITA;

SELECT * FROM B.TABLITA_SYNONYM WHERE B.TABLITA_SYNONYM.COLUMN1 = 20;
Copy

Código migrado do Snowflake: você notará que SELECT se refere originalmente a um sinônimo, mas agora se refere à tabela que aponta o sinônimo.

 CREATE OR REPLACE TABLE TABLITA
    (
        COLUMN1 NUMBER(38, 18) /*** SSC-FDM-0006 - NUMBER TYPE COLUMN MAY NOT BEHAVE SIMILARLY IN SNOWFLAKE. ***/
    )
    COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
    ;

--    --** SSC-FDM-OR0005 - SYNONYMS NOT SUPPORTED IN SNOWFLAKE BUT REFERENCES TO THIS SYNONYM WERE CHANGED BY THE ORIGINAL OBJECT NAME. **

--    CREATE OR REPLACE SYNONYM B.TABLITA_SYNONYM FOR TABLITA
                                                           ;

SELECT * FROM
    TABLITA
    WHERE
    TABLITA.COLUMN1 = 20;
Copy

Exemplo 2: Sinônimo que se refere a outro sinônimo.

Código-fonte Oracle:

 CREATE TABLE TABLITA
(
    COLUMN1 NUMBER
);

CREATE OR REPLACE SYNONYM B.TABLITA_SYNONYM FOR TABLITA;
CREATE OR REPLACE SYNONYM C.TABLITA_SYNONYM2 FOR B.TABLITA_SYNONYM;

SELECT * FROM C.TABLITA_SYNONYM2 WHERE C.TABLITA_SYNONYM2.COLUMN1 = 20;

UPDATE C.TABLITA_SYNONYM2 SET COLUMN1 = 10;

INSERT INTO C.TABLITA_SYNONYM2 VALUES (1);
Copy

Código migrado do Snowflake: você notará que originalmente SELECT, UPDATE, INSERT se referem a um sinônimo e agora se referem ao objeto atômico, que é uma tabela.

 CREATE OR REPLACE TABLE TABLITA
    (
        COLUMN1 NUMBER(38, 18) /*** SSC-FDM-0006 - NUMBER TYPE COLUMN MAY NOT BEHAVE SIMILARLY IN SNOWFLAKE. ***/
    )
    COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
    ;

--    --** SSC-FDM-OR0005 - SYNONYMS NOT SUPPORTED IN SNOWFLAKE BUT REFERENCES TO THIS SYNONYM WERE CHANGED BY THE ORIGINAL OBJECT NAME. **

--    CREATE OR REPLACE SYNONYM B.TABLITA_SYNONYM FOR TABLITA
                                                           ;

--    --** SSC-FDM-OR0005 - SYNONYMS NOT SUPPORTED IN SNOWFLAKE BUT REFERENCES TO THIS SYNONYM WERE CHANGED BY THE ORIGINAL OBJECT NAME. **
--CREATE OR REPLACE SYNONYM C.TABLITA_SYNONYM2 FOR B.TABLITA_SYNONYM
                                                                  ;

SELECT * FROM
    TABLITA
    WHERE
    TABLITA.COLUMN1 = 20;

    UPDATE TABLITA
    SET COLUMN1 = 10;

    INSERT INTO TABLITA
    VALUES (1);
Copy

Exemplo 3: Sinônimo que se refere a uma visualização

Código-fonte Oracle

 CREATE OR REPLACE SYNONYM B.TABLITA_SYNONYM FOR TABLITA;

CREATE OR REPLACE SYNONYM C.TABLITA_SYNONYM2 FOR B.TABLITA_SYNONYM;

CREATE VIEW VIEW_ORGINAL AS SELECT * FROM C.TABLITA_SYNONYM2;

CREATE OR REPLACE SYNONYM VIEW_SYNONYM FOR VIEW_ORGINAL;

SELECT * FROM VIEW_SYNONYM;
Copy

Código migrado do Snowflake: você notará que originalmente SELECT se refere a um sinônimo e agora se refere aos objetos atômicos, que é uma exibição.

 ----** SSC-FDM-OR0005 - SYNONYMS NOT SUPPORTED IN SNOWFLAKE BUT REFERENCES TO THIS SYNONYM WERE CHANGED BY THE ORIGINAL OBJECT NAME. **
--CREATE OR REPLACE SYNONYM B.TABLITA_SYNONYM FOR TABLITA
                                                       ;

----** SSC-FDM-OR0005 - SYNONYMS NOT SUPPORTED IN SNOWFLAKE BUT REFERENCES TO THIS SYNONYM WERE CHANGED BY THE ORIGINAL OBJECT NAME. **
--CREATE OR REPLACE SYNONYM C.TABLITA_SYNONYM2 FOR B.TABLITA_SYNONYM
                                                                  ;

CREATE OR REPLACE VIEW VIEW_ORGINAL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
AS
--** SSC-FDM-0001 - VIEWS SELECTING ALL COLUMNS FROM A SINGLE TABLE ARE NOT REQUIRED IN SNOWFLAKE AND MAY IMPACT PERFORMANCE. **
SELECT * FROM
TABLITA;

----** SSC-FDM-OR0005 - SYNONYMS NOT SUPPORTED IN SNOWFLAKE BUT REFERENCES TO THIS SYNONYM WERE CHANGED BY THE ORIGINAL OBJECT NAME. **

--CREATE OR REPLACE SYNONYM VIEW_SYNONYM FOR VIEW_ORGINAL
                                                       ;

SELECT * FROM
VIEW_ORGINAL;
Copy

A transformação de sinônimos pode ser ativada ou desativada nas configurações de UI.

EWIs relacionados

  1. SSC-FDM-0001: As visualizações que selecionam todas as colunas de uma única tabela não são necessárias no Snowflake.

  2. SSC-FDM-0006: A coluna de tipo de número pode não se comportar de forma semelhante no Snowflake.

  3. SSC-FDM-OR0005: Os sinônimos não são compatíveis com o Snowflake, mas as referências a esse sinônimo foram alteradas pelo nome original do objeto.

Create Table

1. Description

No Oracle, a instrução CREATE TABLE é usada para criar um dos seguintes tipos de tabelas: uma tabela relacional, que é a estrutura básica para manter os dados do usuário, ou uma tabela de objetos, que é uma tabela que usa um tipo de objeto para a definição de uma coluna. (Documentação do Oracle)

Sintaxe do Oracle

 CREATE [ { GLOBAL | PRIVATE } TEMPORARY | SHARDED | DUPLICATED | [ IMMUTABLE ] BLOCKCHAIN 
  | IMMUTABLE  ] 
   TABLE
  [ schema. ] table
  [ SHARING = { METADATA | DATA | EXTENDED DATA | NONE } ]
  { relational_table | object_table | XMLType_table }
  [ MEMOPTIMIZE FOR READ ]
  [ MEMOPTIMIZE FOR WRITE ]
  [ PARENT [ schema. ] table ] ;
Copy

Sintaxe do Snowflake

 CREATE [ OR REPLACE ]
    [ { [ { LOCAL | GLOBAL } ] TEMP | TEMPORARY | VOLATILE | TRANSIENT } ]
  TABLE [ IF NOT EXISTS ] <table_name> (
    -- Column definition
    <col_name> <col_type>
      [ inlineConstraint ]
      [ NOT NULL ]
      [ COLLATE '<collation_specification>' ]
      [
        {
          DEFAULT <expr>
          | { AUTOINCREMENT | IDENTITY }
            [
              {
                ( <start_num> , <step_num> )
                | START <num> INCREMENT <num>
              }
            ]
            [ { ORDER | NOORDER } ]
        }
      ]
      [ [ WITH ] MASKING POLICY <policy_name> [ USING ( <col_name> , <cond_col1> , ... ) ] ]
      [ [ WITH ] TAG ( <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' , ... ] ) ]
      [ COMMENT '<string_literal>' ]

    -- Additional column definitions
    [ , <col_name> <col_type> [ ... ] ]

    -- Out-of-line constraints
    [ , outoflineConstraint [ ... ] ]
  )
  [ CLUSTER BY ( <expr> [ , <expr> , ... ] ) ]
  [ ENABLE_SCHEMA_EVOLUTION = { TRUE | FALSE } ]
  [ STAGE_FILE_FORMAT = (
     { FORMAT_NAME = '<file_format_name>'
       | TYPE = { CSV | JSON | AVRO | ORC | PARQUET | XML } [ formatTypeOptions ]
     } ) ]
  [ STAGE_COPY_OPTIONS = ( copyOptions ) ]
  [ DATA_RETENTION_TIME_IN_DAYS = <integer> ]
  [ MAX_DATA_EXTENSION_TIME_IN_DAYS = <integer> ]
  [ CHANGE_TRACKING = { TRUE | FALSE } ]
  [ DEFAULT_DDL_COLLATION = '<collation_specification>' ]
  [ COPY GRANTS ]
  [ COMMENT = '<string_literal>' ]
  [ [ WITH ] ROW ACCESS POLICY <policy_name> ON ( <col_name> [ , <col_name> ... ] ) ]
  [ [ WITH ] TAG ( <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' , ... ] ) ]
Copy

Nota

Para obter mais informações sobre o Snowflake, consulte a documentação a seguir.

2. Sample Source Patterns

2.1. Propriedades físicas e de tabela

Oracle

 CREATE TABLE "MySchema"."BaseTable"
(
    BaseId NUMBER DEFAULT 10 NOT NULL ENABLE
) SEGMENT CREATION IMMEDIATE
  PCTFREE 0 PCTUSED 40 INITRANS 1 MAXTRANS 255
  COLUMN STORE COMPRESS FOR QUERY HIGH NO ROW LEVEL LOCKING LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "MyTableSpace"
  PARTITION BY LIST ("BaseId")
 (
    PARTITION "P20211231"  VALUES (20211231) SEGMENT CREATION DEFERRED
    PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
    ROW STORE COMPRESS ADVANCED LOGGING
    STORAGE(
    BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
    TABLESPACE "MyTableSpace" 
  )
  PARALLEL;
Copy

Snowflake

 CREATE OR REPLACE TABLE "MySchema"."BaseTable"
 (
     BaseId NUMBER(38, 18) /*** SSC-FDM-0006 - NUMBER TYPE COLUMN MAY NOT BEHAVE SIMILARLY IN SNOWFLAKE. ***/ DEFAULT 10 NOT NULL
 )
 COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
 ;
Copy

Nota

As propriedades da tabela são removidas porque não são necessárias após a migração no Snowflake.

2.2. Restrições e estados de restrição

As restrições a seguir serão comentadas:

  • Restrição CHECK

Nota

A restrição USING INDEX será totalmente removida do código de saída durante a conversão.

Oracle

 CREATE TABLE "MySchema"."BaseTable"
(
    BaseId NUMBER DEFAULT 10 NOT NULL ENABLE NOVALIDATE,
    "COL1" NUMBER CHECK( "COL1" IS NOT NULL ),
	  CHECK( "COL1" IS NOT NULL ),
    CONSTRAINT "Constraint1BaseTable" PRIMARY KEY (BaseId)
        USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
        STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
        PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1) ENABLE
);
Copy

Snowflake

 CREATE OR REPLACE TABLE "MySchema"."BaseTable"
	(
	    BaseId NUMBER(38, 18) /*** SSC-FDM-0006 - NUMBER TYPE COLUMN MAY NOT BEHAVE SIMILARLY IN SNOWFLAKE. ***/ DEFAULT 10 NOT NULL,
	    "COL1" NUMBER(38, 18) /*** SSC-FDM-0006 - NUMBER TYPE COLUMN MAY NOT BEHAVE SIMILARLY IN SNOWFLAKE. ***/ NOT NULL
 	                                                                                                                     !!!RESOLVE EWI!!! /*** SSC-EWI-0035 - CHECK STATEMENT NOT SUPPORTED ***/!!!
 	                                                                                                                     CHECK( "COL1" IS NOT NULL ),
	!!!RESOLVE EWI!!! /*** SSC-EWI-0035 - CHECK STATEMENT NOT SUPPORTED ***/!!!
		  CHECK( "COL1" IS NOT NULL ),
	    CONSTRAINT "Constraint1BaseTable" PRIMARY KEY (BaseId)
	)
	COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
	;
Copy

Por outro lado, mas da mesma forma, caso você tenha algum estado de restrição após uma restrição NOT NULL, como segue:

  • RELY

  • NO RELY

  • RELY ENABLE

  • RELY DISABLE

  • VALIDATE

  • NOVALIDATE

Elas também serão comentadas.

Nota

O estado da restrição ENABLE será completamente removido do código de saída durante o processo de conversão. No caso do estado DISABLE, ele também será removido simultaneamente com a restrição NOT NULL.

Oracle

 CREATE TABLE Table1(
  col1 INT NOT NULL ENABLE,
  col2 INT NOT NULL DISABLE,
  col3 INT NOT NULL RELY
);
Copy

Snowflake

 CREATE OR REPLACE TABLE Table1 (
    col1 INT NOT NULL,
    col2 INT ,
    col3 INT NOT NULL /*** SSC-FDM-OR0006 - CONSTRAINT STATE RELY REMOVED FROM NOT NULL INLINE CONSTRAINT ***/
  )
  COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
  ;
Copy

2.3. Chave estrangeira

Se houver uma tabela com uma coluna NUMBER sem precisão nem escala e outra tabela com uma coluna NUMBER(*,0) que faça referência à coluna NUMBER mencionada anteriormente, comentaremos essa chave estrangeira.

Oracle

 CREATE TABLE "MySchema"."MyTable"
(
    "COL1" NUMBER, 
    CONSTRAINT "PK" PRIMARY KEY ("COL1")
);
Copy

Snowflake

 CREATE OR REPLACE TABLE "MySchema"."MyTable"
    (
        "COL1" NUMBER(38, 18) /*** SSC-FDM-0006 - NUMBER TYPE COLUMN MAY NOT BEHAVE SIMILARLY IN SNOWFLAKE. ***/,
        CONSTRAINT "PK" PRIMARY KEY ("COL1")
    )
    COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
    ;
Copy

2.4. Coluna virtual

Oracle

 CREATE TABLE "MySchema"."MyTable"
(
    "COL1" NUMBER GENERATED ALWAYS AS (COL1 * COL2) VIRTUAL
);
Copy

Snowflake

 CREATE OR REPLACE TABLE "MySchema"."MyTable"
    (
        "COL1" NUMBER(38, 18) /*** SSC-FDM-0006 - NUMBER TYPE COLUMN MAY NOT BEHAVE SIMILARLY IN SNOWFLAKE. ***/ AS (COL1 * COL2)
    )
    COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
    ;
Copy

2.5. Coluna de identidade

Para colunas de identidade, uma sequência é criada e atribuída à coluna.

Oracle

 CREATE TABLE "MySchema"."BaseTable"
(
	"COL0" NUMBER GENERATED BY DEFAULT ON NULL 
		AS IDENTITY MINVALUE 1 MAXVALUE 9999999999999999999999999999 
		INCREMENT BY 1 
		START WITH 621 
		CACHE 20 
		NOORDER  NOCYCLE  NOT NULL ENABLE
);
Copy

Snowflake

 CREATE OR REPLACE SEQUENCE MySchema.BaseTable_COL0
	INCREMENT BY 1
	START WITH 621
COMMENT = 'FOR TABLE-COLUMN "MySchema.BaseTable".COL0';

CREATE OR REPLACE TABLE "MySchema"."BaseTable" (
	"COL0" NUMBER(38, 18) /*** SSC-FDM-0006 - NUMBER TYPE COLUMN MAY NOT BEHAVE SIMILARLY IN SNOWFLAKE. ***/ DEFAULT MySchema.BaseTable_COL0.NEXTVAL NOT NULL
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
;
Copy

2.6. Declaração de coluna CLOB e BLOB

As colunas declaradas como CLOB ou BLOB serão alteradas para VARCHAR.

Oracle

 CREATE TABLE T
(
 Col1 BLOB DEFAULT EMPTY_BLOB(),
Col5 CLOB DEFAULT EMPTY_CLOB()
);
Copy

Snowflake

 CREATE OR REPLACE TABLE T
 (
  Col1 BINARY,
 Col5 VARCHAR
 )
 COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
 ;
Copy

2.7. Nome da restrição

Aviso

O nome da restrição é removido do código porque não é aplicável no Snowflake.

Oracle

 CREATE TABLE "CustomSchema"."BaseTable"(
 "PROPERTY" VARCHAR2(64) CONSTRAINT "MICROSOFT_NN_PROPERTY" NOT NULL ENABLE
  );
Copy

Snowflake

 CREATE OR REPLACE TABLE "CustomSchema"."BaseTable" (
  "PROPERTY" VARCHAR(64) NOT NULL
   )
   COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
   ;
Copy

2.8. Colunas padrão com horários

As colunas declaradas como tipos de data serão convertidas para corresponder ao tipo de data específico.

Oracle

 CREATE TABLE TABLE1
(
"COL1" VARCHAR(50) DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE TABLE1
(
 COL0 TIMESTAMP(6) DEFAULT CURRENT_TIMESTAMP,
 COL1 TIMESTAMP(6) DEFAULT CURRENT_TIME,
 COL2 TIMESTAMP(6) WITH LOCAL TIME ZONE DEFAULT '1900-01-01 12:00:00',
 COL3 TIMESTAMP(6) WITH TIME ZONE DEFAULT '1900-01-01 12:00:00',
 COL4 TIMESTAMP(6) WITHOUT TIME ZONE DEFAULT '1900-01-01 12:00:00',
 COL5 TIMESTAMP(6) DEFAULT TO_TIMESTAMP('01/01/1900 12:00:00.000000 AM', 'MM/DD/YYYY HH:MI:SS.FF6 AM')
 );
Copy

Snowflake

 CREATE OR REPLACE TABLE TABLE1
 (
 "COL1" VARCHAR(50) DEFAULT TO_VARCHAR(CURRENT_TIMESTAMP(), 'YYYY-MM-DD HH:MI:SS')
 )
 COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
 ;

 --** SSC-FDM-0019 - SEMANTIC INFORMATION COULD NOT BE LOADED FOR TABLE1. CHECK IF THE NAME IS INVALID OR DUPLICATED. **
 CREATE OR REPLACE TABLE TABLE1
 (
  COL0 TIMESTAMP(6) DEFAULT CURRENT_TIMESTAMP() :: TIMESTAMP(6),
  COL1 TIMESTAMP(6) DEFAULT CURRENT_TIME() :: TIMESTAMP(6),
  COL2 TIMESTAMP_LTZ(6) DEFAULT '1900-01-01 12:00:00' :: TIMESTAMP_LTZ(6),
  COL3 TIMESTAMP_TZ(6) DEFAULT '1900-01-01 12:00:00' :: TIMESTAMP_TZ(6),
  COL4 TIMESTAMP(6) WITHOUT TIME ZONE DEFAULT '1900-01-01 12:00:00' :: TIMESTAMP(6) WITHOUT TIME ZONE,
  COL5 TIMESTAMP(6) DEFAULT TO_TIMESTAMP('01/01/1900 12:00:00.000000 AM', 'MM/DD/YYYY HH:MI:SS.FF6 AM') :: TIMESTAMP(6)
  )
 COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
 ;
Copy

2.9 Opções Sharing e Memoptimize

Algumas opções no Oracle não são necessárias no Snowflake. Esse é o caso das opções sharing e memoptimize, que serão removidas do código de saída.

Oracle

 CREATE TABLE table1 
    SHARING = METADATA (
     id NUMBER,
     name VARCHAR2(50),
     date DATE,
     CONSTRAINT pk_table PRIMARY KEY (id)
 ) MEMOPTIMIZE FOR READ;
Copy

Snowflake

 CREATE OR REPLACE TABLE table1 (
     id NUMBER(38, 18) /*** SSC-FDM-0006 - NUMBER TYPE COLUMN MAY NOT BEHAVE SIMILARLY IN SNOWFLAKE. ***/,
     name VARCHAR(50),
     date TIMESTAMP /*** SSC-FDM-OR0042 - DATE TYPE COLUMN HAS A DIFFERENT BEHAVIOR IN SNOWFLAKE. ***/,
     CONSTRAINT pk_table PRIMARY KEY (id)
 )
 COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
 ;
Copy

2.10 AS SubQuery

As propriedades e cláusulas a seguir não são compatíveis com a criação de uma tabela por meio do AS SubQuery no Snowflake.

[ immutable_table_clauses ]
[ blockchain_table_clauses ]
[ DEFAULT COLLATION collation_name ]
[ ON COMMIT { DROP | PRESERVE } DEFINITION ]
[ ON COMMIT { DELETE | PRESERVE } ROWS ]
[ physical_properties ]

Copy

Oracle

 create table table1
-- NO DROP NO DELETE HASHING USING sha2_512 VERSION v1 -- blockchain_clause not yet supported
DEFAULT COLLATION somename
ON COMMIT DROP DEFINITION
ON COMMIT DELETE ROWS
COMPRESS
NOLOGGING
AS
   select
      *
   from
      table1;
Copy

Snowflake

 CREATE OR REPLACE TABLE table1
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
-- NO DROP NO DELETE HASHING USING sha2_512 VERSION v1 -- blockchain_clause not yet supported
AS
   select
      *
   from
      table1;
Copy

Problemas conhecidos

  1. Algumas propriedades das tabelas podem ser adaptadas ou comentadas porque o comportamento no Snowflake é diferente.

EWIs relacionados

  1. SSC-EWI-0035: Instrução Check não suportada.

  2. SSC-FDM-0006: A coluna de tipo de número pode não se comportar de forma semelhante no Snowflake.

  3. SSC-FDM-0019: Não foi possível carregar as informações semânticas.

  4. SSC-FDM-OR0042: O tipo de data transformado em carimbo de data/hora tem um comportamento diferente.

  5. SSC-FDM-OR0006: Estado da restrição removido da restrição inline não nula.

Create View

Nota

Algumas partes do código de saída foram omitidas por motivos de clareza.

Create View

 CREATE OR REPLACE VIEW View1 AS SELECT Column1 from Schema1.Table1;
Copy
 CREATE OR REPLACE VIEW View1
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
AS
SELECT Column1 from
Schema1.Table1;
Copy

As seguintes cláusulas para Create View foram removidas:

  • No Force/ Force

  • Cláusula Edition

  • Cláusula Sharing

  • Agrupamento padrão

  • Cláusula Bequeath

  • Cláusula Container

 CREATE OR REPLACE
NO FORCE
NONEDITIONABLE
VIEW Schema1.View1
SHARING = DATA
DEFAULT COLLATION Collation1
BEQUEATH CURRENT_USER
AS SELECT Column1 from Schema1.Table1
CONTAINER_MAP;
Copy
 CREATE OR REPLACE VIEW Schema1.View1
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
AS
SELECT Column1 from
Schema1.Table1;
Copy

Alter View

Alter ainda não é compatível com o SnowConvert.

Drop View

A cláusula CASCADE CONSTRAINT ainda não é compatível.

 DROP VIEW Schema1.View1;

DROP VIEW Schema1.View1
CASCADE CONSTRAINTS;
Copy
 DROP VIEW Schema1.View1;

DROP VIEW Schema1.View1
CASCADE CONSTRAINTS !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'DropBehavior' NODE ***/!!!;
Copy

EWIs relacionados

  1. SSC-EWI-0073: Revisão de equivalência funcional pendente.

Create Type

Descrição geral

Um dos recursos mais importantes que o mecanismo de banco de dados Oracle oferece é uma abordagem orientada a objetos. PL/SQL oferece recursos que vão além de outros bancos de dados relacionais na forma de OOP, usando instruções semelhantes a Java na forma de pacotes, funções, tabelas e tipos. Este documento abordará a última questão e como o SnowConvert a resolve, mantendo a conformidade com a funcionalidade.

O Oracle é compatível com as seguintes especificações:

  • Tipo de dados abstrato (ADT) (incluindo um tipo de objeto SQLJ).

  • Tipo de matriz variável autônoma (varray).

  • Tipo de tabela aninhada autônoma.

  • Tipo de objeto incompleto.

Tudo isso de acordo com as informações encontradas na documentação da instrução Oracle Create Type

CREATE [ OR REPLACE ] [ EDITIONABLE | NONEDITIONAL ] TYPE <type name>
[ <type source creation options> ]
[<type definition>]
[ <type properties> ]

Copy

Limitações

O Snowflake não oferece suporte a tipos de dados definidos pelo usuário, de acordo com sua documentação online Tipos de dados sem suporte, mas oferece suporte a Tipos de dados semiestruturados, que podem ser usados para imitar a estrutura semelhante à hierarquia da maioria dos tipos definidos pelo usuário. Por esse motivo, há vários recursos de tipo que não têm solução alternativa.

A seguir, os recursos de Tipos definidos pelo usuário para os quais NO propõe uma solução alternativa:

Subtipos: Hierarquia de tipos

Essas instruções não são compatíveis com o Snowflake. O SnowConvert apenas os reconhece, mas nenhuma conversão é oferecida.

 CREATE TYPE person_t AS OBJECT (name VARCHAR2(100), ssn NUMBER) 
   NOT FINAL;
/

CREATE TYPE employee_t UNDER person_t 
   (department_id NUMBER, salary NUMBER) 
   NOT FINAL;
/

CREATE TYPE part_time_emp_t UNDER employee_t (num_hrs NUMBER);
/
Copy

Propriedades de tipo

Elas se referem às opções normalmente usadas ao utilizar OOP em PL/SQL: Persistable, Instantiable e Final.

 CREATE OR REPLACE TYPE type1 AS OBJECT () NOT FINAL NOT INSTANTIABLE NOT PERSISTABLE;
CREATE OR REPLACE TYPE type2 AS OBJECT () FINAL INSTANTIABLE PERSISTABLE;
Copy

Tipo de tabela aninhada

Essas instruções não são compatíveis com o Snowflake. O SnowConvert apenas os reconhece, mas nenhuma conversão é oferecida.

 CREATE TYPE textdoc_typ AS OBJECT
    ( document_typ      VARCHAR2(32)
    , formatted_doc     BLOB
    ) ;
/

CREATE TYPE textdoc_tab AS TABLE OF textdoc_typ;
/
Copy

Opções de criação de fonte de tipo

Essas opções representam opções personalizadas relacionadas ao acesso e à consulta do tipo.

 CREATE TYPE type1 FORCE OID 'abc' SHARING = METADATA DEFAULT COLLATION schema1.collation ACCESSIBLE BY (schema1.unitaccesor) AS OBJECT ();
CREATE TYPE type2 FORCE OID 'abc' SHARING = NONE DEFAULT COLLATION collation ACCESSIBLE BY (PROCEDURE unitaccesor) AS OBJECT ();
CREATE TYPE type3 AUTHID CURRENT_USER AS OBJECT ();
CREATE TYPE type4 AUTHID DEFINER AS OBJECT ();
Copy

Soluções alternativas propostas

Sobre a definição de tipos

Para a definição, a solução proposta é criar um tipo de dados semiestruturado para imitar o tipo de dados do Oracle.

Sobre a função de membro types

Para as funções de membro que contêm lógica e DML, a solução proposta depende de auxiliares para converter isso em procedimentos armazenados.

Suporte atual do SnowConvert

A próxima tabela mostra um resumo do suporte atual fornecido pela ferramenta SnowConvert. Você deve levar em conta que as conversões podem ainda não ser definitivas e que pode ser necessário mais trabalho.

Type Statement ElementCurrent recognition statusCurrent translation statusHas Known Workarounds
Object Type DefinitionsRecognized.Partially Translated.Yes.
Subtype DefinitionsRecognized.Not Translated.No.
Array Type DefinitionsRecognized.Not Translated.Yes.
Nested Table DefinitionsRecognized.Not Translated.No.
Member Function DefinitionsRecognized.Not Translated.Yes.

Problemas conhecidos

1. DML usages for Object Types are not being transformed

No momento, apenas as definições do DDL que usam tipos definidos pelo usuário estão sendo transformadas em Variant. Isso significa que todas as inserções, atualizações ou exclusões que usam tipos definidos pelo usuário não estão sendo transformadas e precisam ser transformadas manualmente. Não há EWI para isso, mas há um item de trabalho para adicionar esse EWI correspondente.

2. Create Type creation options are not supported

No momento, não há nenhuma solução alternativa conhecida para nenhuma das opções de criação; por esse motivo, elas não são levadas em consideração ao definir o tipo.

EWIs relacionados

Sem EWIs relacionados.

Definição do tipo de matriz

O SnowConvert reconhece apenas essas definições e, no momento, não oferece suporte a nenhuma conversão para elas. Esta página é usada apenas como referência futura para conversões.

Nota

Algumas partes do código de saída foram omitidas por motivos de clareza.

Descrição

Array Types definem uma estrutura de matriz de um tipo de dado existente anteriormente (incluindo outros Custom Types).

Para a conversão de tipos de matriz, a definição do tipo é substituída por um tipo de dados semiestruturado e, em seguida, é expandida em qualquer uso no código. Isso significa pegar a definição do tipo e depois expandi-la no código original.

 CREATE TYPE <type name>
AS { VARRAY | [VARYING] ARRAY } ( <size limit> ) OF <data type>
Copy

Amostra de padrões da origem

Inserções para o uso da matriz

Os próximos dados serão inseridos na tabela antes de consultar select. Observe que, no momento, essas inserções precisam ser migradas manualmente para o Snowflake.

Oracle
 INSERT INTO customer_table_demo(customer_table_id, customer_data) VALUES
(1, phone_list_typ_demo('2000-0000', '4000-0000', '0000-0000'));

INSERT INTO customer_table_demo(customer_table_id, customer_data) VALUES
(1, phone_list_typ_demo('8000-2000', '0000-0000', '5000-0000'));
Copy
Snowflake
 INSERT INTO customer_table_demo(customer_table_id, customer_data)
SELECT 1, ARRAY_CONSTRUCT('2000-0000', '4000-0000', '0000-0000');

INSERT INTO customer_table_demo(customer_table_id, customer_data)
SELECT 1, ARRAY_CONSTRUCT('8000-2000', '0000-0000', '5000-0000');
Copy

Uso do tipo de matriz

Oracle
 CREATE TYPE phone_list_typ_demo AS VARRAY(3) OF VARCHAR2(25);
/

CREATE TABLE customer_table_demo (
    customer_table_id INTEGER,
    customer_data phone_list_typ_demo
);
/

SELECT * FROM customer_table_demo;
/
Copy
CUSTOMER_TABLE_ID|CUSTOMER_DATA                          |
-----------------+---------------------------------------+
                1|[['2000-0000','4000-0000','0000-0000']]|
                1|[['8000-2000','0000-0000','5000-0000']]|

Copy
Snowflake
 !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'VARYING ARRAY' NODE ***/!!!
CREATE TYPE phone_list_typ_demo AS VARRAY(3) OF VARCHAR2(25);

CREATE OR REPLACE TABLE customer_table_demo (
        customer_table_id INTEGER,
        customer_data VARIANT !!!RESOLVE EWI!!! /*** SSC-EWI-0062 - CUSTOM TYPE 'phone_list_typ_demo' USAGE CHANGED TO VARIANT ***/!!!
    )
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
;

CREATE OR REPLACE VIEW PUBLIC.customer_table_demo_view
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "oracle",  "convertedOn": "" }}'
AS
SELECT
        customer_table_id,
        customer_data
FROM
        customer_table_demo;

    SELECT * FROM
        customer_table_demo_view;
Copy
CUSTOMER_TABLE_ID|CUSTOMER_DATA                          |
-----------------+---------------------------------------+
                1|{['2000-0000','4000-0000','0000-0000']}|
                1|{['8000-2000','0000-0000','5000-0000']}|

Copy

Problemas conhecidos

1. Create Type creation options are not supported

No momento, não há nenhuma solução alternativa conhecida para nenhuma das opções de criação; por esse motivo, elas não são levadas em consideração ao definir o tipo.

2. Migrated code output is not functional

As instruções estão sendo alteradas desnecessariamente, o que faz com que elas não sejam mais funcionais no código de saída. Isso será resolvido quando houver uma transformação adequada para elas.

EWIs relacionados

  1. SSC-EWI-0062: O uso do tipo personalizado foi alterado para variante.

  2. SSC-EWI-0073: Revisão de equivalência funcional pendente.

Definições de funções de membro

O SnowConvert ainda não reconhece funções de membro de tipo nem definições de corpo de tipo. Esta página é usada apenas como referência futura para conversão.

Nota

Algumas partes do código de saída foram omitidas por motivos de clareza.

Descrição

Como outras definições de classe, o TYPE da Oracle pode implementar métodos para expor comportamentos com base em seus atributos. MEMBER FUCTION serão transformados em procedimentos armazenados do Snowflake, para manter a equivalência funcional devido às limitações.

Como as funções estão sendo transformadas em procedimentos, a referência de transformação para PL/SQL também se aplica aqui.

Amostra de padrões da origem

Inserções para a função de membro Simple square()

Os próximos dados serão inseridos na tabela antes de consultar select. Observe que, no momento, essas inserções precisam ser migradas manualmente para o Snowflake.

Oracle
 INSERT INTO table_member_function_demo(column1) VALUES
(type_member_function_demo(5));
Copy
Snowflake
 INSERT INTO table_member_function_demo (column1)
SELECT OBJECT_CONSTRUCT('a1', 5);
Copy

Função de membro Simple square()

Oracle
 -- TYPE DECLARATION
CREATE TYPE type_member_function_demo AS OBJECT (
    a1 NUMBER,
    MEMBER FUNCTION get_square RETURN NUMBER
);
/

-- TYPE BODY DECLARATION
CREATE TYPE BODY type_member_function_demo IS
   MEMBER FUNCTION get_square
   RETURN NUMBER
   IS x NUMBER;
   BEGIN
      SELECT c.column1.a1*c.column1.a1 INTO x
      FROM table_member_function_demo c;
      RETURN (x);
   END;
END;
/

-- TABLE
CREATE TABLE table_member_function_demo (column1 type_member_function_demo);
/

-- QUERYING DATA
SELECT
    t.column1.get_square()
FROM
    table_member_function_demo t;
/
Copy
T.COLUMN1.GET_SQUARE()|
----------------------+
                    25|

Copy
Snowflake
-- TYPE DECLARATION
!!!RESOLVE EWI!!! /*** SSC-EWI-0056 - CUSTOM TYPES ARE NOT SUPPORTED IN SNOWFLAKE BUT REFERENCES TO THIS CUSTOM TYPE WERE CHANGED TO VARIANT ***/!!!
CREATE TYPE type_member_function_demo AS OBJECT (
    a1 NUMBER,
    MEMBER FUNCTION get_square RETURN NUMBER
)
;

---- TYPE BODY DECLARATION
--!!!RESOLVE EWI!!! /*** SSC-EWI-OR0007 - CREATE TYPE WITHOUT BODY IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
--CREATE TYPE BODY type_member_function_demo IS
--   MEMBER FUNCTION get_square
--   RETURN NUMBER
--   IS x NUMBER;
--   BEGIN
--      SELECT c.column1.a1*c.column1.a1 INTO x
--      FROM table_member_function_demo c;
--      RETURN (x);
--   END;
--END
   ;

-- TABLE
CREATE OR REPLACE TABLE table_member_function_demo (column1 VARIANT !!!RESOLVE EWI!!! /*** SSC-EWI-0062 - CUSTOM TYPE 'type_member_function_demo' USAGE CHANGED TO VARIANT ***/!!!
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
;

CREATE OR REPLACE VIEW PUBLIC.table_member_function_demo_view
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "oracle",  "convertedOn": "" }}'
AS
SELECT
    column1:a1 :: NUMBER AS a1
FROM
    table_member_function_demo;

-- QUERYING DATA
SELECT
    t.column1.get_square() !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 't.column1.get_square' NODE ***/!!!
FROM
    table_member_function_demo t;
Copy
GET_SQUARE()|
------------+
          25|

Copy

Problemas conhecidos

Nenhum problema conhecido.

EWIs relacionados

  1. SSC-EWI-0056: Create Type não tem suporte.

  2. SSC-EWI-0062: O uso do tipo personalizado foi alterado para variante.

  3. SSC-EWI-0073: Revisão de equivalência funcional pendente.

  4. SSC-EWI-OR0007: Create Type não é compatível com o Snowflake

Definição do tipo de tabela aninhada

O SnowConvert reconhece apenas essas definições, não oferece suporte a nenhuma conversão e não há nenhuma solução alternativa conhecida para elas.

Description

Os tipos de tabela aninhada definem uma estrutura de tabela incorporada de um tipo de dados existente anteriormente (incluindo outros tipos personalizados). Eles podem ser usados como uma versão mais avançada do tipo de matriz.

Ao contrário dos outros tipos, ainda não há uma solução alternativa conhecida ou uma conversão possível para eles.

 CREATE TYPE <type name> AS TABLE OF <data type>
Copy

Sample Source Patterns

Uso do tipo de tabela aninhada

Oracle
 CREATE TYPE textdoc_typ AS OBJECT (
    document_typ VARCHAR2(32),
    formatted_doc BLOB
);
/

CREATE TYPE textdoc_tab AS TABLE OF textdoc_typ;
/
Copy
Snowflake
Snowflake
 !!!RESOLVE EWI!!! /*** SSC-EWI-0056 - CUSTOM TYPES ARE NOT SUPPORTED IN SNOWFLAKE BUT REFERENCES TO THIS CUSTOM TYPE WERE CHANGED TO VARIANT ***/!!!
CREATE TYPE textdoc_typ AS OBJECT (
    document_typ VARCHAR2(32),
    formatted_doc BLOB
)
;

!!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'NESTED TABLE' NODE ***/!!!

CREATE TYPE textdoc_tab AS TABLE OF textdoc_typ;
Copy

Known Issues

1. Create Type creation options are not supported

Atualmente, não há nenhuma solução alternativa conhecida para nenhuma das opções de criação; por esse motivo, elas não são levadas em conta na definição do tipo.

Related EWIs

  1. SSC-EWI-0073: Revisão de equivalência funcional pendente

  2. SSC-EWI-0056: Create Type não tem suporte.

Definição do tipo de objeto

Nota

O SnowConvert suporta uma conversão para as próprias definições de tipo de objeto. No entanto, seus usos ainda estão em andamento.

Nota

Algumas partes do código de saída foram omitidas por motivos de clareza.

Descrição

Os tipos de objeto definem uma estrutura de dados semelhante a um registro, com as vantagens adicionais das definições de função de membro. Isso significa que seus dados podem ser usados em algum comportamento dentro do tipo.

Para a conversão de tipos de objetos, a definição do tipo é substituída por um tipo de dados semiestruturado e, em seguida, é expandida em qualquer uso no código. No caso das tabelas, isso significa substituir a coluna por uma variante e adicionar uma exibição para que as seleções (e também exibições) da tabela original ainda possam funcionar.

 CREATE TYPE <type name> AS OBJECT
( [{<type column definition> | type method definition } , ...]);
Copy

Amostra de padrões da origem

Uso de Inserts for Simple Type

Os próximos dados serão inseridos na tabela antes de consultar select. Observe que, no momento, essas inserções precisam ser migradas manualmente para o Snowflake.

Oracle
 INSERT INTO customer_table_demo(customer_table_id, customer_data)
VALUES ( 1, customer_typ_demo(1, 'First Name 1', 'Last Name 1'));

INSERT INTO customer_table_demo(customer_table_id, customer_data)
VALUES ( 2, customer_typ_demo(2, 'First Name 2', 'Last Name 2'));
Copy
Snowflake
 INSERT INTO customer_table_demo(customer_table_id, customer_data)
VALUES ( 1, customer_typ_demo(1, 'First Name 1', 'Last Name 1') !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'customer_typ_demo' NODE ***/!!!);

INSERT INTO customer_table_demo(customer_table_id, customer_data)
VALUES ( 2, customer_typ_demo(2, 'First Name 2', 'Last Name 2') !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'customer_typ_demo' NODE ***/!!!);
Copy

Uso de Simple Type

Oracle
 CREATE TYPE customer_typ_demo AS OBJECT (
    customer_id INTEGER,
    cust_first_name VARCHAR2(20),
    cust_last_name VARCHAR2(20)
);

CREATE TABLE customer_table_demo (
    customer_table_id INTEGER,
    customer_data customer_typ_demo
);

SELECT * FROM customer_table_demo;
Copy
CUSTOMER_TABLE_ID|CUSTOMER_DATA                 |
-----------------+------------------------------+
                1|[1, First Name 1, Last Name 1]|
                2|[2, First Name 2, Last Name 2]|

Copy
Snowflake
 !!!RESOLVE EWI!!! /*** SSC-EWI-0056 - CUSTOM TYPES ARE NOT SUPPORTED IN SNOWFLAKE BUT REFERENCES TO THIS CUSTOM TYPE WERE CHANGED TO VARIANT ***/!!!
CREATE TYPE customer_typ_demo AS OBJECT (
    customer_id INTEGER,
    cust_first_name VARCHAR2(20),
    cust_last_name VARCHAR2(20)
)
;

CREATE OR REPLACE TABLE customer_table_demo (
        customer_table_id INTEGER,
        customer_data VARIANT !!!RESOLVE EWI!!! /*** SSC-EWI-0062 - CUSTOM TYPE 'customer_typ_demo' USAGE CHANGED TO VARIANT ***/!!!
    )
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
;

CREATE OR REPLACE VIEW PUBLIC.customer_table_demo_view
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "oracle",  "convertedOn": "" }}'
AS
SELECT
        customer_table_id,
        customer_data:customer_id :: INTEGER AS customer_id,
        customer_data:cust_first_name :: VARCHAR AS cust_first_name,
        customer_data:cust_last_name :: VARCHAR AS cust_last_name
FROM
        customer_table_demo;

    SELECT * FROM
        customer_table_demo_view;
Copy
CUSTOMER_TABLE_ID|CUST_ID|CUST_FIRST_NAME|CUST_LAST_NAME|
-----------------+-------+---------------+--------------+
                1|1      |First Name 1   |Last Name 1   |
                2|2      |First Name 2   |Last Name 2   |

Copy

Uso de Inserts for Nested Type

Essas instruções precisam ser colocadas entre a criação da tabela e a instrução select para testar a saída.

Oracle
 INSERT INTO customer_table_demo(customer_id, customer_data) values
(1, customer_typ_demo('Customer 1', email_typ_demo('email@domain.com')));

INSERT INTO customer_table_demo(customer_id, customer_data) values
(2, customer_typ_demo('Customer 2', email_typ_demo('email2@domain.com')));
Copy
Snowflake
 INSERT INTO customer_table_demo(customer_id, customer_data) values
(1, customer_typ_demo('Customer 1', email_typ_demo('email@domain.com') !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'email_typ_demo' NODE ***/!!!) !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'customer_typ_demo' NODE ***/!!!);

INSERT INTO customer_table_demo(customer_id, customer_data) values
(2, customer_typ_demo('Customer 2', email_typ_demo('email2@domain.com') !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'email_typ_demo' NODE ***/!!!) !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'customer_typ_demo' NODE ***/!!!);
Copy

Uso de Nested Type

Oracle
 CREATE TYPE email_typ_demo AS OBJECT (email VARCHAR2(20));

CREATE TYPE customer_typ_demo AS OBJECT (
    cust_name VARCHAR2(20),
    cust_email email_typ_demo
);

CREATE TABLE customer_table_demo (
    customer_id INTEGER,
    customer_data customer_typ_demo
);

SELECT * FROM customer_table_demo;
Copy
CUSTOMER_ID|CUSTOMER_DATA                    |
-----------+---------------------------------+
          1|[Customer 1, [email@domain.com]] |
          2|[Customer 2, [email2@domain.com]]|

Copy
Snowflake
 !!!RESOLVE EWI!!! /*** SSC-EWI-0056 - CUSTOM TYPES ARE NOT SUPPORTED IN SNOWFLAKE BUT REFERENCES TO THIS CUSTOM TYPE WERE CHANGED TO VARIANT ***/!!!
CREATE TYPE email_typ_demo AS OBJECT (email VARCHAR2(20))
;

!!!RESOLVE EWI!!! /*** SSC-EWI-0056 - CUSTOM TYPES ARE NOT SUPPORTED IN SNOWFLAKE BUT REFERENCES TO THIS CUSTOM TYPE WERE CHANGED TO VARIANT ***/!!!

CREATE TYPE customer_typ_demo AS OBJECT (
    cust_name VARCHAR2(20),
    cust_email email_typ_demo
)
;

CREATE OR REPLACE TABLE customer_table_demo (
    customer_id INTEGER,
    customer_data VARIANT !!!RESOLVE EWI!!! /*** SSC-EWI-0062 - CUSTOM TYPE 'customer_typ_demo' USAGE CHANGED TO VARIANT ***/!!!
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
;

CREATE OR REPLACE VIEW PUBLIC.customer_table_demo_view
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "oracle",  "convertedOn": "" }}'
AS
SELECT
    customer_id,
    customer_data:cust_name :: VARCHAR AS cust_name,
    customer_data:cust_email:email :: VARCHAR AS email
FROM
    customer_table_demo;

SELECT * FROM
    customer_table_demo_view;
Copy
CUSTOMER_ID|CUST_NAME |CUST_EMAIL       |
-----------+----------+-----------------+
          1|Customer 1|email@domain.com |
          2|Customer 2|email2@domain.com|

Copy

Problemas conhecidos

1. Migrated code output is not the same

A instrução view está sendo alterada desnecessariamente, o que faz com que a tabela não tenha mais o mesmo comportamento no código de saída. Há um item de trabalho para corrigir esse problema.

2. DML for User-defined Types is not being transformed

DML que interage com elementos que têm tipos definidos pelo usuário (como uma tabela) não estão sendo transformados. Há um item de trabalho para implementar isso no futuro.

3. Create Type creation options are not supported

No momento, não há nenhuma solução alternativa conhecida para nenhuma das opções de criação; por esse motivo, elas não são levadas em consideração ao definir o tipo.

EWIs relacionados

  1. SSC-EWI-0056: Create Type não tem suporte.

  2. SSC-EWI-0062: O uso do tipo personalizado foi alterado para variante.

  3. SSC-EWI-0073: Revisão de equivalência funcional pendente.

Definição do subtipo

Como não há soluções alternativas conhecidas, o SnowConvert reconhece apenas essas definições e não oferece suporte a nenhuma conversão para elas.

Description

Os subtipos definem uma estrutura de dados semelhante a um registro, com as vantagens adicionais das definições de função de membro. Isso significa que seus dados podem ser usados em algum comportamento dentro do tipo. Ao contrário dos tipos de objeto, os subtipos são criados como uma extensão de outro tipo existente.

Com relação às definições de subtipo, ainda não há conversão, mas pode haver uma maneira de reimplementá-las usando Definições de tipo de objeto e, em seguida, usando sua respectiva conversão.

 CREATE TYPE <type name> UNDER <super type name>
( [{<type column definition> | type method definition } , ...]);
Copy

Sample Source Patterns

Subtipos em um tipo de objeto

Oracle
 CREATE TYPE person_t AS OBJECT (name VARCHAR2(100), ssn INTEGER) 
   NOT FINAL;
/

CREATE TYPE employee_t UNDER person_t 
   (department_id INTEGER, salary INTEGER) 
   NOT FINAL;
/

CREATE TYPE part_time_emp_t UNDER employee_t (num_hrs INTEGER);
/
Copy
Snowflake
 !!!RESOLVE EWI!!! /*** SSC-EWI-0056 - CUSTOM TYPES ARE NOT SUPPORTED IN SNOWFLAKE BUT REFERENCES TO THIS CUSTOM TYPE WERE CHANGED TO VARIANT ***/!!!
CREATE TYPE person_t AS OBJECT (name VARCHAR2(100), ssn INTEGER)
   NOT FINAL;

--!!!RESOLVE EWI!!! /*** SSC-EWI-OR0007 - CREATE TYPE SUBTYPE IS NOT SUPPORTED IN SNOWFLAKE ***/!!!

--CREATE TYPE employee_t UNDER person_t
--   (department_id INTEGER, salary INTEGER)
--   NOT FINAL
            ;

--!!!RESOLVE EWI!!! /*** SSC-EWI-OR0007 - CREATE TYPE SUBTYPE IS NOT SUPPORTED IN SNOWFLAKE ***/!!!

--CREATE TYPE part_time_emp_t UNDER employee_t (num_hrs INTEGER)
                                                              ;
Copy

Known Issues

1. Create Type creation options are not supported

No momento, não há nenhuma solução alternativa conhecida para nenhuma das opções de criação; por esse motivo, elas não são levadas em consideração ao definir o tipo.

Related EWIs

  1. SSC-EWI-0056: Create Type não tem suporte.

  2. SSC-EWI-OR0007: Create Type não é compatível com o Snowflake.