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 }
] ...
;
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;
Snowflake
ALTER TABLE SOMESCHEMA.SOMENAME
ADD (SOMECOLUMN NUMBER(38, 18), SOMEOTHERCOLUMN VARCHAR(23));
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));
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));
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);
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;
Problemas conhecidos¶
Algumas propriedades das tabelas podem ser adaptadas ou não aplicáveis.
Create Database Link¶
Aviso
Atualmente, a instrução _ Create Database Link _ não está sendo convertida, mas está sendo analisada. Além disso, se o seu código-fonte tiver instruçõescreate database link
, elas serão contabilizadas no _ Relatório de avaliação. _
Exemplo de um código-fonte¶
CREATE PUBLIC DATABASE LINK db_link_name
CONNECT TO CURRENT_USER
USING 'connect string'
CREATE DATABASE LINK db_link_name2
CONNECT TO user_name IDENTIFIED BY user_password
USING 'connect string'
CREATE PUBLIC DATABASE LINK db_link_name3
Saída do Snowflake¶
----** SSC-OOS - OUT OF SCOPE CODE UNIT. CREATE DATABASE LINK IS OUT OF TRANSLATION SCOPE. **
--CREATE PUBLIC DATABASE LINK db_link_name
--CONNECT TO CURRENT_USER
--USING 'connect string'
----** SSC-OOS - OUT OF SCOPE CODE UNIT. CREATE DATABASE LINK IS OUT OF TRANSLATION SCOPE. **
--CREATE DATABASE LINK db_link_name2
--CONNECT TO user_name IDENTIFIED BY user_password
--USING 'connect string'
----** SSC-OOS - OUT OF SCOPE CODE UNIT. CREATE DATABASE LINK IS OUT OF TRANSLATION SCOPE. **
--CREATE PUBLIC DATABASE LINK db_link_name3
Referências de links de banco de dados¶
Se no seu código de entrada você usar objetos do link do banco de dados, o código de saída manterá o nome desses objetos, mas o nome do link do banco de dados que eles estão usando será removido.
Exemplo de um código-fonte¶
-- CREATE DATABASE LINK STATEMENTS
CREATE DATABASE LINK mylink1
CONNECT TO user1 IDENTIFIED BY password1
USING 'my_connection_string1';
CREATE DATABASE LINK mylink2
CONNECT TO user2 IDENTIFIED BY password2
USING 'my_connection_string2';
-- SQL statements that use the database links
SELECT * FROM products@mylink1;
INSERT INTO employees@mylink2
(employee_id, last_name, email, hire_date, job_id)
VALUES (999, 'Claus', 'sclaus@oracle.com', SYSDATE, 'SH_CLERK');
UPDATE jobs@mylink2 SET min_salary = 3000
WHERE job_id = 'SH_CLERK';
DELETE FROM employees@mylink2
WHERE employee_id = 999;
-- SQL statement where it uses an object from
-- a database link that is not created
SELECT * FROM products@mylink;
Saída do Snowflake¶
---- CREATE DATABASE LINK STATEMENTS
----** SSC-OOS - OUT OF SCOPE CODE UNIT. CREATE DATABASE LINK IS OUT OF TRANSLATION SCOPE. **
--CREATE DATABASE LINK mylink1
-- CONNECT TO user1 IDENTIFIED BY password1
-- USING 'my_connection_string1'
----** SSC-OOS - OUT OF SCOPE CODE UNIT. CREATE DATABASE LINK IS OUT OF TRANSLATION SCOPE. **
--CREATE DATABASE LINK mylink2
-- CONNECT TO user2 IDENTIFIED BY password2
-- USING 'my_connection_string2'
-- SQL statements that use the database links
SELECT * FROM
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0123 - DBLINK CONNECTIONS NOT SUPPORTED [ DBLINK : mylink1 | USER: user1/password1 | CONNECTION: 'my_connection_string1' ] ***/!!!
products;
INSERT INTO
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0123 - DBLINK CONNECTIONS NOT SUPPORTED [ DBLINK : mylink2 | USER: user2/password2 | CONNECTION: 'my_connection_string2' ] ***/!!!
employees
(employee_id, last_name, email, hire_date, job_id)
VALUES (999, 'Claus', 'sclaus@oracle.com', CURRENT_TIMESTAMP(), 'SH_CLERK');
UPDATE
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0123 - DBLINK CONNECTIONS NOT SUPPORTED [ DBLINK : mylink2 | USER: user2/password2 | CONNECTION: 'my_connection_string2' ] ***/!!!
jobs
SET min_salary = 3000
WHERE job_id = 'SH_CLERK';
DELETE FROM
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0123 - DBLINK CONNECTIONS NOT SUPPORTED [ DBLINK : mylink2 | USER: user2/password2 | CONNECTION: 'my_connection_string2' ] ***/!!!
employees
WHERE employee_id = 999;
-- SQL statement where it uses an object from
-- a database link that is not created
--** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "mylink" **
SELECT * FROM
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0123 - DBLINK CONNECTIONS NOT SUPPORTED [ DBLINK : mylink | USER: / | CONNECTION: ] ***/!!!
products;
EWIs relacionados¶
SSC-EWI-OR0123: Não há suporte para conexões Db Link.
SSC-FDM-0007: Elemento com dependências ausentes.
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 ]
No Snowflake, a sintaxe de Drop Table é a seguinte:
DROP TABLE [ IF EXISTS ] <table_name> [ CASCADE | RESTRICT ]
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;
Código transformado:
DROP TABLE TEST_TABLE1;
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;
Código transformado:
DROP TABLE TEST_TABLE1;
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;
Código transformado:
DROP TABLE TEST_TABLE1 CASCADE;
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;
Código transformado:
DROP TABLE TEST_TABLE1 CASCADE;
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;
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;
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;
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;
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;
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;
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;
Problemas conhecidos¶
Nenhum erro conhecido foi detectado até o momento.
EWIs relacionados¶
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;
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"}}';
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;
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;
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;
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"}}';
EWIs relacionados¶
SSC-EWI-OR0069: A propriedade CURRVAL da sequência não é compatível com o Snowflake.
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';
Código Snowflake:¶
ALTER SESSION SET DATE_INPUT_FORMAT = 'DD-MM-YYYY' DATE_OUTPUT_FORMAT = 'DD-MM-YYYY';
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;
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
;
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;
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;
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);
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);
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;
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;
A transformação de sinônimos pode ser ativada ou desativada nas configurações de UI.
EWIs relacionados¶
SSC-FDM-0001: As visualizações que selecionam todas as colunas de uma única tabela não são necessárias no Snowflake.
SSC-FDM-0006: A coluna de tipo de número pode não se comportar de forma semelhante no Snowflake.
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 ] ;
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>' , ... ] ) ]
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;
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"}}'
;
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
);
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"}}'
;
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
);
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"}}'
;
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")
);
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"}}'
;
2.4. Coluna virtual¶
Oracle
CREATE TABLE "MySchema"."MyTable"
(
"COL1" NUMBER GENERATED ALWAYS AS (COL1 * COL2) VIRTUAL
);
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"}}'
;
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
);
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"}}'
;
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()
);
Snowflake
CREATE OR REPLACE TABLE T
(
Col1 BINARY,
Col5 VARCHAR
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
;
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
);
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"}}'
;
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')
);
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"}}'
;
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 ]
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;
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;
Problemas conhecidos¶
Algumas propriedades das tabelas podem ser adaptadas ou comentadas porque o comportamento no Snowflake é diferente.
EWIs relacionados¶
SSC-EWI-0035: Instrução Check não suportada.
SSC-FDM-0006: A coluna de tipo de número pode não se comportar de forma semelhante no Snowflake.
SSC-FDM-0019: Não foi possível carregar as informações semânticas.
SSC-FDM-OR0042: O tipo de data transformado em carimbo de data/hora tem um comportamento diferente.
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;
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;
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;
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;
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;
DROP VIEW Schema1.View1;
DROP VIEW Schema1.View1
CASCADE CONSTRAINTS !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'DropBehavior' NODE ***/!!!;
EWIs relacionados¶
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> ]
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);
/
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;
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;
/
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 ();
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 Element | Current recognition status | Current translation status | Has Known Workarounds |
---|---|---|---|
Object Type Definitions | Recognized. | Partially Translated. | Yes. |
Subtype Definitions | Recognized. | Not Translated. | No. |
Array Type Definitions | Recognized. | Not Translated. | Yes. |
Nested Table Definitions | Recognized. | Not Translated. | No. |
Member Function Definitions | Recognized. | 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>
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'));
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');
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;
/
CUSTOMER_TABLE_ID|CUSTOMER_DATA |
-----------------+---------------------------------------+
1|[['2000-0000','4000-0000','0000-0000']]|
1|[['8000-2000','0000-0000','5000-0000']]|
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;
CUSTOMER_TABLE_ID|CUSTOMER_DATA |
-----------------+---------------------------------------+
1|{['2000-0000','4000-0000','0000-0000']}|
1|{['8000-2000','0000-0000','5000-0000']}|
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¶
SSC-EWI-0062: O uso do tipo personalizado foi alterado para variante.
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));
Snowflake¶
INSERT INTO table_member_function_demo (column1)
SELECT OBJECT_CONSTRUCT('a1', 5);
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;
/
T.COLUMN1.GET_SQUARE()|
----------------------+
25|
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;
GET_SQUARE()|
------------+
25|
Problemas conhecidos¶
Nenhum problema conhecido.
EWIs relacionados¶
SSC-EWI-0056: Create Type não tem suporte.
SSC-EWI-0062: O uso do tipo personalizado foi alterado para variante.
SSC-EWI-0073: Revisão de equivalência funcional pendente.
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>
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;
/
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;
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
SSC-EWI-0073: Revisão de equivalência funcional pendente
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 } , ...]);
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'));
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 ***/!!!);
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;
CUSTOMER_TABLE_ID|CUSTOMER_DATA |
-----------------+------------------------------+
1|[1, First Name 1, Last Name 1]|
2|[2, First Name 2, Last Name 2]|
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;
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 |
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')));
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 ***/!!!);
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;
CUSTOMER_ID|CUSTOMER_DATA |
-----------+---------------------------------+
1|[Customer 1, [email@domain.com]] |
2|[Customer 2, [email2@domain.com]]|
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;
CUSTOMER_ID|CUST_NAME |CUST_EMAIL |
-----------+----------+-----------------+
1|Customer 1|email@domain.com |
2|Customer 2|email2@domain.com|
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¶
SSC-EWI-0056: Create Type não tem suporte.
SSC-EWI-0062: O uso do tipo personalizado foi alterado para variante.
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 } , ...]);
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);
/
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)
;
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
SSC-EWI-0056: Create Type não tem suporte.
SSC-EWI-OR0007: Create Type não é compatível com o Snowflake.