SnowConvert AI – Teradata – DDL¶
Nesta seção, você encontrará a documentação para a referência de tradução de Elementos de linguagem de definição de dados.
Índice¶
Referência de tradução para converter a instrução INDEX para o Snowflake
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 criação de índice
Entrada do Teradata¶
CREATE INDEX (col1, col2, col3) ORDER BY VALUES (col2) ON table1;
CREATE INDEX my_index_name ON my_table (column1, column2);
Nota
Por razões arquitetônicas, o Snowflake não oferece suporte a índices, então a SnowConvert AI removerá todo o código relacionado à criação de índices. O Snowflake automaticamente cria micropartições para cada tabela. Isso ajuda a acelerar o desempenho das operações DML, e o usuário não precisa se preocupar em criar ou gerenciar essas micropartições.
Normalmente, isso é suficiente para ter um desempenho de consulta muito bom; no entanto, há maneiras de melhorá-lo criando chaves de clustering de dados. A página oficial do Snowflake fornece mais informações sobre micropartições e clustering de dados.
Índice de junção¶
Descrição ¶
No SnowConvert AI, os índices de junção do Teradata são transformados 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 AI usará os valores pré-atribuídos por padrão durante a conversão, conforme demonstrado no exemplo abaixo.
Para obter mais informações sobre índices de junção, clique aqui.
Para obter detalhes sobre os parâmetros necessários para as tabelas dinâmicas, clique aqui.
Amostra de padrões da origem¶
Teradata
Índice de junção
CREATE JOIN INDEX Employee
AS
SELECT
Employee_Id,
First_Name,
Last_Name,
BirthDate,
DepartmentNo
FROM Employee
PRIMARY INDEX (First_Name);
Snowflake
Tabela dinâmica
CREATE OR REPLACE DYNAMIC TABLE Employee
--** 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":"teradata"}}'
AS
SELECT
Employee_Id,
First_Name,
Last_Name,
BirthDate,
DepartmentNo
FROM
Employee;
Problemas conhecidos¶
Nenhum erro conhecido foi detectado até o momento.
Esquema¶
Descrição ¶
A conversão da instrução CREATE SCHEMA do Teradata para o Snowflake é simples, pois a sintaxe básica permanece a mesma.
Amostra de padrões da origem¶
Teradata
Índice de junção
CREATE SCHEMA IF EXISTS schema_name;
Snowflake
Tabela dinâmica
CREATE SCHEMA IF EXISTS schema_name
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "teradata", "convertedOn": "07/23/2024" }}'
;
Problemas conhecidos¶
Propriedades WITH de CREATE SCHEMA¶
As propriedades WITH associadas à instrução CREATE SCHEMA no Teradata não são compatíveis com o Snowflake, pois não há funcionalidade equivalente disponível.
Teradata
Índice de junção
CREATE SCHEMA IF EXISTS schema_name
WITH ( PROPERTY1 = PROPERTYNAME, PROPERTY2 = PROPERTTYNAME, PROPERTY3 = PROPERTTYNAME);
Snowflake
Tabela dinâmica
CREATE SCHEMA IF EXISTS schema_name
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "teradata", "convertedOn": "07/23/2024" }}'
!!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'SCHEMA WITH' NODE ***/!!!
WITH ( PROPERTY1 = PROPERTYNAME, PROPERTY2 = PROPERTTYNAME, PROPERTY3 = PROPERTTYNAME);
EWIs relacionados¶
SSC-EWI-0073: Revisão de equivalência funcional pendente.
Exibições¶
Referência de tradução para converter a instrução Teradata VIEW para o Snowflake
Nota
Algumas partes do código de saída foram omitidas por motivos de clareza.
Descrição ¶
A instrução VIEW do Teradata é convertida para a sintaxe do Snowflake VIEW.
Para obter mais informações sobre o Teradata VIEW, acesse aqui.
Amostra de padrões da origem¶
Criar transformação de visualização¶
Teradata
Exibição¶
CREATE VIEW view1 (someTable.col1, someTable.col2) AS locking row for access
SELECT
my_table.col1, my_table.col2
FROM table1 AS my_table
WHERE my_table.col1 = 'SpecificValue'
UNION ALL
SELECT other_table.col2
FROM table2 AS other_table
WHERE my_table.col2 = other_table.col2
Snowflake
Exibição¶
--** SSC-FDM-0007 - MISSING DEPENDENT OBJECTS "table1", "table2" **
CREATE OR REPLACE VIEW view1
(
col1,
col2)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "teradata", "convertedOn": "07/02/2025", "domain": "no-domain-provided" }}'
AS
SELECT
my_table.col1,
my_table.col2
FROM
table1 AS my_table
WHERE
UPPER(RTRIM( my_table.col1)) = UPPER(RTRIM('SpecificValue'))
UNION ALL
SELECT
other_table.col2
FROM
table2 AS other_table
WHERE my_table.col2 = other_table.col2;
Tag de esquema personalizado¶
O esquema personalizado é especificado na seção de comentários antes da especificação da visualização, com uma tag XML chamada «sc-view» que contém apenas o valor do esquema e o nome da visualização separados por um ponto «.», conforme mostrado abaixo: <sc-view>SCHEMANAME.VIEWNAME</sc-view>
O esquema personalizado será usado como um qualificador de visualização e, em seguida, o nome da visualização e todos os objetos mencionados nas consultas FROM e nas consultas internas usarão esse esquema personalizado. Portanto, pode haver várias exibições com o mesmo nome, mas com diferentes tags personalizadas. Exemplo: duas exibições com o mesmo nome usarão as informações da tag de esquema personalizado para realizar a conversão.
Teradata¶
Exibição¶
/*<sc-view>RMSviews.EMPLOYEEB</sc-view>*/
REPLACE VIEW EMPLOYEEB AS
SELECT * FROM EMPLOYEE
WHERE AREA = "AREAB";
/*<sc-view>Views.EMPLOYEEB</sc-view>*/
REPLACE VIEW EMPLOYEEB AS
SELECT * FROM EMPLOYEE
WHERE AREA = "AREAB";
Snowflake¶
A transformação para o Snowflake variará dependendo do nome do esquema personalizado MySchema, do nome do banco de dados personalizado MyDatabase ou da não seleção de um banco de dados ou esquema personalizado nas configurações de conversão.
Esquema personalizado¶
/*<sc-view>RMSviews.EMPLOYEEB</sc-view>*/
--** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "EMPLOYEE" **
CREATE OR REPLACE VIEW RMSviews.EMPLOYEEB
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
AS
SELECT
* FROM
RMSviews.EMPLOYEE
WHERE AREA = "AREAB";
/*<sc-view>Views.EMPLOYEEB</sc-view>*/
--** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "EMPLOYEE" **
--** SSC-FDM-0019 - SEMANTIC INFORMATION COULD NOT BE LOADED FOR Views.EMPLOYEEB. CHECK IF THE NAME IS INVALID OR DUPLICATED. **
CREATE OR REPLACE VIEW Views.EMPLOYEEB
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
AS
SELECT
* FROM
Views.EMPLOYEE
WHERE AREA = "AREAB";
Banco de dados personalizado¶
/*<sc-view>RMSviews.EMPLOYEEB</sc-view>*/
CREATE OR REPLACE VIEW MyDatabase.RMSviews.EMPLOYEEB
AS
SELECT * FROM MyDatabase.RMSviews.EMPLOYEE
WHERE AREA = "AREAB";
/*<sc-view>Views.EMPLOYEEB</sc-view>*/
CREATE OR REPLACE VIEW MyDatabase.Views.EMPLOYEEB
AS
SELECT * FROM MyDatabase.Views.EMPLOYEE
WHERE AREA = "AREAB";
Non selected¶
/*<sc-view>RMSviews.EMPLOYEEB</sc-view>*/
CREATE OR REPLACE VIEW RMSviews.PUBLIC.EMPLOYEEB
AS
SELECT * FROM RMSviews.PUBLIC.EMPLOYEE
WHERE AREA = "AREAB";
/*<sc-view>Views.EMPLOYEEB</sc-view>*/
CREATE OR REPLACE VIEW Views.PUBLIC.EMPLOYEEB
AS
SELECT * FROM Views.PUBLIC.EMPLOYEE
WHERE AREA = "AREAB";
Problemas conhecidos¶
1. Locking row for access logic difference¶
No Snowflake, o acesso a objetos e elementos é baseado em usuários e privilégios.
EWIs relacionados¶
SSC-FDM-0007: Elemento com dependências ausentes.
SSC-FDM-0019: Não foi possível carregar as informações semânticas.
Tabelas¶
Referência de tradução para converter a instrução Teradata TABLE para o Snowflake
Nota
Algumas partes do código de saída foram omitidas por motivos de clareza.
Descrição ¶
A instrução TABLE do Teradata é convertida para a sintaxe do Snowflake TABLE.
Para obter mais informações sobre Teradata TABLEs, acesse aqui.
Amostra de padrões da origem¶
Criação simples Tabela¶
Teradata
Tabela¶
CREATE TABLE table1, no fallback,
no before journal,
no after journal (
c1 INTEGER NOT NULL,
f1 INTEGER NOT NULL,
p1 INTEGER NOT NULL,
DATE,
TIME,
FOREIGN KEY(f1) REFERENCES WITH CHECK OPTION table2 (d1)
)
UNIQUE PRIMARY INDEX(c1)
PARTITION BY COLUMN(p1);
Snowflake
Tabela¶
CREATE OR REPLACE TABLE table1 (
c1 INTEGER NOT NULL,
f1 INTEGER NOT NULL,
p1 INTEGER NOT NULL,
DATE,
TIME,
FOREIGN KEY(f1) REFERENCES table2 (d1) ,
UNIQUE (c1)
)
----** SSC-FDM-0038 - MICRO-PARTITIONING IS AUTOMATICALLY HANDLED ON ALL SNOWFLAKE TABLES **
--PARTITION BY COLUMN(p1)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "teradata", "convertedOn": "09/19/2025", "domain": "no-domain-provided" }}'
;
Cláusula de tipo de tabela - SET e MULTISET¶
A cláusula kind do Teradata determina se as linhas duplicadas são permitidas (MULTISET) ou não (SET).
Teradata¶
Tabela¶
-- Set semantics
CREATE SET TABLE table1 (
column1 INTEGER
);
--Multiset semantics
CREATE MULTISET TABLE table2(
column1 INTEGER
);
Snowflake¶
Tabela¶
-- Set semantics
--** SSC-FDM-TD0024 - SET TABLE FUNCTIONALITY NOT SUPPORTED. TABLE MIGHT HAVE DUPLICATE ROWS **
CREATE OR REPLACE TABLE table1 (
column1 INTEGER
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
;
--Multiset semantics
CREATE OR REPLACE TABLE table2 (
column1 INTEGER
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
;
Tabelas temporárias voláteis e globais¶
As tabelas Volatile e Global Temporary do Teradata são usadas para o armazenamento temporário de dados. A diferença está no fato de que a definição da tabela (DDL) das tabelas Global Temporary é mantida no Data Dictionary, enquanto a definição das tabelas Volatile não é armazenada.
Teradata¶
Tabela¶
--Global Temporary Table
CREATE MULTISET GLOBAL TEMPORARY TABLE table1 (
column1 INTEGER
);
--Volatile Table
CREATE MULTISET VOLATILE TABLE table3 (
column1 INTEGER
);
Snowflake¶
Tabela¶
--Global Temporary Table
--** SSC-FDM-0009 - GLOBAL TEMPORARY TABLE FUNCTIONALITY NOT SUPPORTED. **
CREATE OR REPLACE TABLE table1 (
column1 INTEGER
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
;
--Volatile Table
CREATE OR REPLACE TEMPORARY TABLE table3 (
column1 INTEGER
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
;
Com opção de dados e sem dados¶
Teradata
Tabela¶
-- With data
CREATE TABLE table1 AS table2 WITH DATA
-- With no data
CREATE TABLE table1 AS table2 WITH NO DATA
Snowflake
Tabela¶
-- With data
CREATE OR REPLACE TABLE table1 CLONE table2
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
;
-- With no data
--** SSC-FDM-0019 - SEMANTIC INFORMATION COULD NOT BE LOADED FOR table1. CHECK IF THE NAME IS INVALID OR DUPLICATED. **
CREATE OR REPLACE TABLE table1 LIKE table2
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
;
Palavras-chave reservadas e limitadas do Snowflake¶
SnowConvert AI facilita o sem interrupções SQL Migrações de para Snowflake abordando desafios associados a palavras-chave reservadas. De acordo com a documentação de palavras-chave reservadas e limitadas, certas palavras-chave não podem ser usadas como nomes de colunas, nomes de tabelas ou aliases sem tratamento especial. SnowConvert AI inclui funcionalidade para garantir SQL compatibilidade de código nesses casos.
Palavras-chave ANSI reservadas como nomes de colunas
Para nomes de colunas que correspondam a ANSI ou Snowflake palavras-chave reservadas, o SnowConvert AI envolve automaticamente o nome da coluna entre aspas duplas (") para cumprir as regras de sintaxe do Snowflake. Esse ajuste garante que as consultas com esses nomes de coluna sejam compiladas corretamente no Snowflake sem exigir intervenção manual.
Exemplo:
Tabela¶
CREATE TABLE ReservedKeywords (
"CREATE" VARCHAR(50),
FOLLOWING VARCHAR(50),
"ILIKE" VARCHAR(50),
RLIKE VARCHAR(50)
);
Snowflake
Tabela¶
CREATE OR REPLACE TABLE ReservedKeywords (
"CREATE" VARCHAR(50),
"FOLLOWING" VARCHAR(50),
"ILIKE" VARCHAR(50),
"RLIKE" VARCHAR(50)
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "transact", "convertedOn": "11/28/2024", "domain": "test" }}'
;
Palavras-chave reservadas específicas do Snowflake
Colunas que correspondem a palavras-chave reservadas específicas do Snowflake (por exemplo, CONSTRAINT, CURRENT_DATE, CURRENT_TIME) ainda podem causar problemas de compilação, mesmo quando entre aspas. O SnowConvert AI detecta essas instâncias e gera um aviso com código SSC-EWI-0045, solicitando aos usuários que revisem e potencialmente renomeiem essas colunas para compatibilidade.
Exemplo:
Tabela¶
CREATE TABLE ColumnReservedNames (
"CONSTRAINT" VARCHAR(50),
"CURRENT_DATE" VARCHAR(50),
"CURRENT_TIME" VARCHAR(50)
);
Snowflake
Tabela¶
CREATE OR REPLACE TABLE ColumnReservedNames (
!!!RESOLVE EWI!!! /*** SSC-EWI-0045 - COLUMN NAME 'CONSTRAINT' IS A SNOWFLAKE RESERVED KEYWORD ***/!!!
"CONSTRAINT" VARCHAR(50),
!!!RESOLVE EWI!!! /*** SSC-EWI-0045 - COLUMN NAME 'CURRENT_DATE' IS A SNOWFLAKE RESERVED KEYWORD ***/!!!
"CURRENT_DATE" VARCHAR(50),
!!!RESOLVE EWI!!! /*** SSC-EWI-0045 - COLUMN NAME 'CURRENT_TIME' IS A SNOWFLAKE RESERVED KEYWORD ***/!!!
"CURRENT_TIME" VARCHAR(50)
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "transact", "convertedOn": "11/28/2024", "domain": "test" }}'
;
Problemas conhecidos¶
1. Create table options not supported¶
Conforme mostrado no exemplo «Simple Create Table», o Snowflake não oferece suporte às opções de criação de tabela do Teradata. Eles são removidos.
2. Partition by performance issues¶
No exemplo «Simple Create Table», a instrução partition by foi removida devido a considerações de desempenho.
3. Primary Index moved¶
No Teradata, a restrição de índice primário é declarada fora da instrução create table, mas no Snowflake é necessário que ela esteja dentro, conforme mostrado no exemplo «Simple Create Table».
4. SET semantics not supported¶
Conforme mostrado no exemplo «Cláusula de tipo de tabela - SET e MULTISET», o Snowflake não oferece suporte à semântica SET do Teradata. Eles são removidos.
5. Global Temporary table option not supported¶
Conforme mostrado no exemplo «Tabela temporária volátil e global», o Snowflake não oferece suporte à opção de tabela temporária global do Teradata. Ela será removido.
6. Compress unsupported¶
COMPRESS (value1. value2, value3) foi removido por não ser suportado.
7. On commit unsupported¶
On commit é removido por não ter suporte.
8. Block compression unsupported¶
Block compression foi removido por não ser suportado.
9. Normalize unsupported¶
Normalize foi removido por não ser suportado.
EWIs relacionados¶
SSC-FDM-0009: GLOBAL TEMPORARY TABLE functionality not supported.
SSC-FDM-0019: Não foi possível carregar as informações semânticas.
SSC-FDM-TD0024: A funcionalidade de tabela definida não é compatível.
SSC-PRF-0007: CLUSTER BY performance review.
SSC-EWI-0045: O nome da coluna é Snowflake Reserved Keyword.
WITH DEFAULT¶
Referência de tradução para converter a cláusula Teradata WITH DEFAULT em definições de coluna para Snowflake
Nota
Algumas partes do código de saída foram omitidas por motivos de clareza.
Descrição ¶
A cláusula WITH DEFAULT do Teradata define um valor padrão do sistema para as colunas que são inseridas sem valores. Esse valor é normalmente equivalente a zero ou vazio.
Sintaxe:¶
WITH DEFAULT
A tabela a seguir mostra os tipos de dados do Teradata, seu tipo correspondente no Snowflake e o valor padrão a ser definido, se suportado.
| Teradata | Snowflake | Default Value |
|---|---|---|
| BLOB[(n)] | BYTE | NOT SUPPORTED |
| BYTE[(n)] | BYTE | NOT SUPPORTED |
| VARBYTE[(n)] | BYTE | NOT SUPPORTED |
| BIGINT | BIGINT | 0 |
| BYTEINT | BYTEINT | 0 |
| DECIMAL [(n[,m])] | DECIMAL | 0 |
| DOUBLE PRECISION | DOUBLE PRECISION | 0 |
| FLOAT | FLOAT | 0 |
| INTEGER | INTEGER | 0 |
| NUMBER(n[,m]) | NUMBER | 0 |
| NUMBER[(*[,m])] | NUMBER | 0 |
| NUMERIC [(n[,m])] | NUMERIC | 0 |
| REAL | REAL | 0 |
| SMALLINT | SMALLINT | 0 |
| DATE | DATE | CURRENT_DATE |
| TIME [(n)] | TIME | CURRENT_TIME |
| TIMESTAMP [(n)] | TIMESTAMP | CURRENT_TIMESTAMP |
| TIMESTAMP WITH TIME ZONE | TIMESTAMP_TZ | LOCALTIMESTAMP |
| INTERVAL DAY [(n)] | VARCHAR(21) | '0DAY' |
| INTERVAL DAY [(n)] TO HOUR | VARCHAR(21) | '0DAY' |
| INTERVAL DAY [(n)] TO MINUTE | VARCHAR(21) | '0DAY' |
| INTERVAL DAY [(n)] TO SECOND | VARCHAR(21) | '0DAY' |
| INTERVAL HOUR [(n)] | VARCHAR(21) | '0HOUR' |
| INTERVAL HOUR [(n)] TO MINUTE | VARCHAR(21) | '0HOUR' |
| INTERVAL HOUR [(n)] TO SECOND | VARCHAR(21) | '0HOUR' |
| INTERVAL MINUTE [(n)] | VARCHAR(21) | '0MINUTE' |
| INTERVAL MINUTE [(n)] TO SECOND [(m)] | VARCHAR(21) | '0MINUTE' |
| INTERVAL MONTH | VARCHAR(21) | '0MONTH' |
| INTERVAL SECOND [(n,[m])] | VARCHAR(21) | '0SECOND' |
| INTERVAL YEAR [(n)] | VARCHAR(21) | '0YEAR' |
| INTERVAL YEAR [(n)] TO MONTH | VARCHAR(21) | '0YEAR' |
| CHAR[(n)] | CHAR | '' |
| CHARACTER(n) CHARACTER SET GRAPHIC | - | NOT SUPPORTED |
| CLOB | - | NOT SUPPORTED |
| CHAR VARYING(n) | VARCHAR | '' |
| LONG VARCHAR | - | NOT SUPPORTED |
| LONG VARCHAR CHARACTER SET GRAPHIC | - | NOT SUPPORTED |
| VARCHAR(n) | VARCHAR | '' |
| VARCHAR(n) CHARACTER SET GRAPHIC | - | NOT SUPPORTED |
| PERIOD(DATE) | VARCHAR(24) | NOT SUPPORTED |
| PERIOD(TIME [(n)]) | VARCHAR(24) | NOT SUPPORTED |
| PERIOD(TIMESTAMP [(n)]) | VARCHAR(24) | NOT SUPPORTED |
Amostra de padrões da origem¶
Teradata¶
Consulta¶
CREATE TABLE SAMPLE_TABLE
(
ID INT,
-- Numeric Types
big_integer_col BIGINT WITH DEFAULT,
byteint_col BYTEINT WITH DEFAULT,
decimal_col DECIMAL(10,2) WITH DEFAULT,
double_precision_col DOUBLE PRECISION WITH DEFAULT,
float_col FLOAT WITH DEFAULT,
integer_col INTEGER WITH DEFAULT,
number_col NUMBER WITH DEFAULT,
numeric_col NUMERIC(10,2) WITH DEFAULT,
real_col REAL WITH DEFAULT,
smallint_col SMALLINT WITH DEFAULT,
-- Character Types
char_col CHAR(50) WITH DEFAULT,
character_col CHARACTER(50) WITH DEFAULT,
--clob_col CLOB,
char_varying_col CHAR VARYING(100) WITH DEFAULT,
--long_varchar_col LONG VARCHAR WITH DEFAULT,
--long_varchar_graphic_col LONG VARCHAR CHARACTER SET GRAPHIC WITH DEFAULT,
varchar_col VARCHAR(255) WITH DEFAULT,
--varchar_graphic_col VARCHAR(255) CHARACTER SET GRAPHIC WITH DEFAULT,
-- Date and Time Types
date_col DATE WITH DEFAULT,
time_col TIME WITH DEFAULT,
time_precision_col TIME(6) WITH DEFAULT,
timestamp_col TIMESTAMP WITH DEFAULT,
timestamp_precision_col TIMESTAMP(6) WITH DEFAULT,
tz_timestamp_col TIMESTAMP WITH TIME ZONE WITH DEFAULT,
tz_timestamp_precision_col TIMESTAMP(6) WITH TIME ZONE WITH DEFAULT,
interval_col INTERVAL DAY(4) WITH DEFAULT,
interval_day_to_hour_col INTERVAL DAY(4) TO HOUR WITH DEFAULT,
interval_hour_col INTERVAL HOUR(2) WITH DEFAULT,
interval_minute_col INTERVAL MINUTE(2) WITH DEFAULT,
interval_month_col INTERVAL MONTH WITH DEFAULT,
interval_second_col INTERVAL SECOND(2) WITH DEFAULT,
interval_year_col INTERVAL YEAR(4) WITH DEFAULT,
-- Binary Types
-- blob_col BLOB(1000),
byte_col BYTE(1000) WITH DEFAULT,
varbyte_col VARBYTE(1000) WITH DEFAULT
);
Snowflake ¶
Consulta¶
CREATE OR REPLACE TABLE SAMPLE_TABLE
(
ID INT,
-- Numeric Types
big_integer_col BIGINT DEFAULT 0,
byteint_col BYTEINT DEFAULT 0,
decimal_col DECIMAL(10,2) DEFAULT 0,
double_precision_col DOUBLE PRECISION DEFAULT 0,
float_col FLOAT DEFAULT 0,
integer_col INTEGER DEFAULT 0,
number_col NUMBER(38, 18) DEFAULT 0,
numeric_col NUMERIC(10,2) DEFAULT 0,
real_col REAL DEFAULT 0,
smallint_col SMALLINT DEFAULT 0,
-- Character Types
char_col CHAR(50) DEFAULT '',
character_col CHARACTER(50) DEFAULT '',
--clob_col CLOB,
char_varying_col CHAR VARYING(100) DEFAULT '',
--long_varchar_col LONG VARCHAR WITH DEFAULT,
--long_varchar_graphic_col LONG VARCHAR CHARACTER SET GRAPHIC WITH DEFAULT,
varchar_col VARCHAR(255) DEFAULT '',
--varchar_graphic_col VARCHAR(255) CHARACTER SET GRAPHIC WITH DEFAULT,
-- Date and Time Types
date_col DATE DEFAULT CURRENT_DATE,
time_col TIME DEFAULT CURRENT_TIME,
time_precision_col TIME(6) DEFAULT CURRENT_TIME(6),
timestamp_col TIMESTAMP
-- !!!RESOLVE EWI!!! /*** SSC-EWI-0013 - EXCEPTION THROWN WHILE CONVERTING ITEM: Mobilize.T12Data.Sql.Ast.TdWithDefaultAttribute. LINE: 31 OF FILE: /Users/hbadillabonilla/Documents/Workspace/migrations-snowconvert/Tools/DocVerifier/out/temp/CUebOYutwG1Dca8jb0Fo/8921d487/SOURCE/Teradata_01.sql ***/!!!
-- WITH DEFAULT
,
timestamp_precision_col TIMESTAMP(6)
-- !!!RESOLVE EWI!!! /*** SSC-EWI-0013 - EXCEPTION THROWN WHILE CONVERTING ITEM: Mobilize.T12Data.Sql.Ast.TdWithDefaultAttribute. LINE: 32 OF FILE: /Users/hbadillabonilla/Documents/Workspace/migrations-snowconvert/Tools/DocVerifier/out/temp/CUebOYutwG1Dca8jb0Fo/8921d487/SOURCE/Teradata_01.sql ***/!!!
-- WITH DEFAULT
,
tz_timestamp_col TIMESTAMP_TZ
-- WITH DEFAULT
-- !!!RESOLVE EWI!!! /*** SSC-EWI-0021 - WITH DEFAULT FOR 'TIMESTAMP WITH TIME ZONE' NOT SUPPORTED IN SNOWFLAKE ***/!!!
,
tz_timestamp_precision_col TIMESTAMP_TZ(6)
-- WITH DEFAULT
-- !!!RESOLVE EWI!!! /*** SSC-EWI-0021 - WITH DEFAULT FOR 'TIMESTAMP(6) WITH TIME ZONE' NOT SUPPORTED IN SNOWFLAKE ***/!!!
,
interval_col VARCHAR(21) !!!RESOLVE EWI!!! /*** SSC-EWI-0036 - INTERVAL DAY(4) DATA TYPE CONVERTED TO VARCHAR ***/!!! DEFAULT '0DAY',
interval_day_to_hour_col VARCHAR(21) !!!RESOLVE EWI!!! /*** SSC-EWI-0036 - INTERVAL DAY(4) TO HOUR DATA TYPE CONVERTED TO VARCHAR ***/!!! DEFAULT '0DAY',
interval_hour_col VARCHAR(21) !!!RESOLVE EWI!!! /*** SSC-EWI-0036 - INTERVAL HOUR(2) DATA TYPE CONVERTED TO VARCHAR ***/!!! DEFAULT '0HOUR',
interval_minute_col VARCHAR(21) !!!RESOLVE EWI!!! /*** SSC-EWI-0036 - INTERVAL MINUTE(2) DATA TYPE CONVERTED TO VARCHAR ***/!!! DEFAULT '0MINUTE',
interval_month_col VARCHAR(21) !!!RESOLVE EWI!!! /*** SSC-EWI-0036 - INTERVAL MONTH DATA TYPE CONVERTED TO VARCHAR ***/!!! DEFAULT '0MONTH',
interval_second_col VARCHAR(21) !!!RESOLVE EWI!!! /*** SSC-EWI-0036 - INTERVAL SECOND(2) DATA TYPE CONVERTED TO VARCHAR ***/!!! DEFAULT '0SECOND',
interval_year_col VARCHAR(21) !!!RESOLVE EWI!!! /*** SSC-EWI-0036 - INTERVAL YEAR(4) DATA TYPE CONVERTED TO VARCHAR ***/!!! DEFAULT '0YEAR',
-- Binary Types
-- blob_col BLOB(1000),
byte_col BINARY
-- WITH DEFAULT
-- !!!RESOLVE EWI!!! /*** SSC-EWI-0021 - WITH DEFAULT FOR 'BYTE(1000)' NOT SUPPORTED IN SNOWFLAKE ***/!!!
,
varbyte_col BINARY(1000)
-- WITH DEFAULT
-- !!!RESOLVE EWI!!! /*** SSC-EWI-0021 - WITH DEFAULT FOR 'VARBYTE(1000)' NOT SUPPORTED IN SNOWFLAKE ***/!!!
)
Problemas conhecidos¶
1. Unsupported types¶
Conforme mostrado na tabela de descrição, alguns tipos não são compatíveis e nenhum valor padrão será definido ao transformar a cláusula WITH DEFAULT.
EWIs relacionados¶
SSC-EWI-0021: Não compatível com a do Snowflake.
SSC-EWI-0036: Tipo de dados convertido em outro tipo de dados.
CREATE MACRO¶
Referência de tradução para converter Teradata CREATE MACRO para Script Snowflake
Descrição ¶
O Teradata CREATE MACRO define uma ou mais instruções que são comumente usadas ou que executam uma operação complexa, evitando assim escrever a mesma sequência de instruções várias vezes. A macro é executada quando é chamada pela instrução EXECUTE.
Para obter mais informações sobre CREATE MACRO, clique aqui.
CREATE MACRO <macroname> [(parameter1, parameter2,...)] (
<sql_statements>
);
[ EXECUTE | EXEC ] <macroname>;
Amostra de padrões de origem ¶
Dados de configuração¶
O código a seguir é necessário para executar os padrões de amostra apresentados nesta seção.
Teradata¶
CREATE TABLE DEPOSIT
(
ACCOUNTNO NUMBER,
ACCOUNTNAME VARCHAR(100)
);
INSERT INTO DEPOSIT VALUES (1, 'Account 1');
INSERT INTO DEPOSIT VALUES (2, 'Account 2');
INSERT INTO DEPOSIT VALUES (3, 'Account 3');
INSERT INTO DEPOSIT VALUES (4, 'Account 4');
Snowflake¶
CREATE OR REPLACE TABLE DEPOSIT
(
ACCOUNTNO NUMBER(38, 18),
ACCOUNTNAME VARCHAR(100)
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
;
INSERT INTO DEPOSIT
VALUES (1, 'Account 1');
INSERT INTO DEPOSIT
VALUES (2, 'Account 2');
INSERT INTO DEPOSIT
VALUES (3, 'Account 3');
INSERT INTO DEPOSIT
VALUES (4, 'Account 4');
Macro básica ¶
Como não há nenhum objeto de macro no Snowflake, a ferramenta de conversão transforma as macros do Teradata em procedimentos armazenados do Snowflake Scripting. Além disso, para replicar a funcionalidade do conjunto de resultados retornado, no Snowflake Scripting, a consulta que deve retornar um conjunto de dados de uma macro é atribuída a uma variável RESULTSET que será então retornada.
Teradata ¶
Consulta¶
REPLACE MACRO DEPOSITID (ID INT)
AS
(
SELECT * FROM DEPOSIT WHERE ACCOUNTNO=:ID;
);
EXECUTE DEPOSITID(2);
Resultado¶
+--------------+--------------+
| ACCOUNTNO | ACCOUNTNAME |
|--------------+--------------|
| 2 | Account 2 |
+--------------+--------------+
Snowflake Scripting ¶
Consulta¶
CREATE OR REPLACE PROCEDURE DEPOSITID (ID FLOAT)
RETURNS TABLE ()
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
EXECUTE AS CALLER
AS
$$
BEGIN
LET res RESULTSET := (SELECT * FROM DEPOSIT WHERE ACCOUNTNO=:ID);
RETURN TABLE(res);
END;
$$;
CALL DEPOSITID(2);
Resultado¶
+--------------+--------------+
| ACCOUNTNO | ACCOUNTNAME |
|--------------+--------------|
| 2 | Account 2 |
+--------------+--------------+
Macro chama outra macro ¶
O SnowConvert AI oferece suporte ao cenário em que uma macro chama outra macro e, por transitividade, um conjunto de resultados é retornado obtendo os resultados das do Snowflake RESULT_SCAN(LAST_QUERY_ID()).
Teradata¶
Consulta¶
REPLACE MACRO MacroCallOtherMacro (ID INT)
AS
(
EXECUTE DEPOSITID(:ID);
);
EXECUTE MacroCallOtherMacro(2);
Resultado¶
+--------------+--------------+
| ACCOUNTNO | ACCOUNTNAME |
|--------------+--------------|
| 2 | Account 2 |
+--------------+--------------+
Snowflake Scripting ¶
Consulta¶
CREATE OR REPLACE PROCEDURE MacroCallOtherMacro (ID FLOAT)
RETURNS TABLE (
)
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "teradata", "convertedOn": "09/09/2024" }}'
EXECUTE AS CALLER
AS
$$
BEGIN
CALL DEPOSITID(:ID);
LET res RESULTSET :=
(
SELECT
*
FROM
TABLE(RESULT_SCAN(LAST_QUERY_ID()))
);
RETURN TABLE(res);
END;
$$;
CALL MacroCallOtherMacro(2);
Resultado¶
+--------------+--------------+
| ACCOUNTNO | ACCOUNTNAME |
|--------------+--------------|
| 2 | Account 2 |
+--------------+--------------+
Macro sem conjunto de resultados¶
Nem todas as macros têm a intenção de retornar um conjunto de resultados. O cenário mencionado também é suportado.
Teradata¶
Consulta¶
REPLACE MACRO MacroWithoutSelect (ACCOUNTNO NUMBER, ACCOUNTNAME VARCHAR(100))
AS
(
INSERT INTO DEPOSIT VALUES (:ACCOUNTNO, :ACCOUNTNAME);
);
EXECUTE MacroWithoutSelect(5, 'Account 5');
SELECT * FROM DEPOSIT;
Resultado¶
+--------------+--------------+
| ACCOUNTNO | ACCOUNTNAME |
|--------------+--------------|
| 1 | Account 1 |
+--------------+--------------+
| 2 | Account 2 |
+--------------+--------------+
| 3 | Account 3 |
+--------------+--------------+
| 4 | Account 4 |
+--------------+--------------+
| 5 | Account 5 |
+--------------+--------------+
Snowflake Scripting ¶
Consulta¶
CREATE OR REPLACE PROCEDURE MacroWithoutSelect (ACCOUNTNO FLOAT, ACCOUNTNAME VARCHAR(100))
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
EXECUTE AS CALLER
AS
$$
BEGIN
INSERT INTO DEPOSIT
VALUES (:ACCOUNTNO, :ACCOUNTNAME);
END;
$$;
CALL MacroWithoutSelect(5, 'Account 5');
SELECT * FROM DEPOSIT;
Resultado¶
+--------------+--------------+
| ACCOUNTNO | ACCOUNTNAME |
|--------------+--------------|
| 1 | Account 1 |
+--------------+--------------+
| 2 | Account 2 |
+--------------+--------------+
| 3 | Account 3 |
+--------------+--------------+
| 4 | Account 4 |
+--------------+--------------+
| 5 | Account 5 |
+--------------+--------------+
A macro retorna vários conjuntos de resultados¶
No Teradata, as macros podem retornar mais de um conjunto de resultados de uma única macro.
Os procedimentos do Snowflake Scripting permitem que apenas um conjunto de resultados seja retornado por procedimento. Para replicar o comportamento do Teradata, quando há dois ou mais conjuntos de resultados a serem retornados, eles são armazenados em tabelas temporárias. O procedimento Snowflake Scripting retornará uma matriz contendo o nome das tabelas temporárias.
Teradata¶
Consulta¶
REPLACE MACRO DEPOSITID (ID INT)
AS
(
SELECT * FROM DEPOSIT WHERE ACCOUNTNO=4;
SELECT * FROM DEPOSIT WHERE ACCOUNTNO=:ID;
EXECUTE DEPOSITID(:ID);
);
EXECUTE DEPOSITID(2);
Result Set 1¶
+--------------+--------------+
| ACCOUNTNO | ACCOUNTNAME |
|--------------+--------------|
| 4 | Account 4 |
+--------------+--------------+
Result Set 2¶
+--------------+--------------+
| ACCOUNTNO | ACCOUNTNAME |
|--------------+--------------|
| 2 | Account 2 |
+--------------+--------------+
Snowflake Scripting ¶
Consulta¶
CREATE OR REPLACE PROCEDURE DEPOSITID (ID FLOAT)
RETURNS ARRAY
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "teradata", "convertedOn": "09/09/2024" }}'
EXECUTE AS CALLER
AS
$$
DECLARE
return_arr ARRAY := array_construct();
tbl_nm VARCHAR;
BEGIN
tbl_nm := 'RESULTSET_' || REPLACE(UPPER(UUID_STRING()), '-', '_');
CREATE OR REPLACE TEMPORARY TABLE IDENTIFIER(:tbl_nm) AS
SELECT
* FROM
DEPOSIT
WHERE ACCOUNTNO=4;
return_arr := array_append(return_arr, :tbl_nm);
tbl_nm := 'RESULTSET_' || REPLACE(UPPER(UUID_STRING()), '-', '_');
CREATE OR REPLACE TEMPORARY TABLE IDENTIFIER(:tbl_nm) AS
SELECT
* FROM
DEPOSIT
WHERE ACCOUNTNO=:ID;
return_arr := array_append(return_arr, :tbl_nm);
CALL DEPOSITID(:ID);
tbl_nm := 'RESULTSET_' || REPLACE(UPPER(UUID_STRING()), '-', '_');
CREATE OR REPLACE TEMPORARY TABLE IDENTIFIER(:tbl_nm) AS
SELECT
*
FROM
TABLE(RESULT_SCAN(LAST_QUERY_ID()));
return_arr := array_append(return_arr, :tbl_nm);
--** SSC-FDM-0020 - MULTIPLE RESULT SETS ARE RETURNED IN TEMPORARY TABLES **
RETURN return_arr;
END;
$$;
CALL DEPOSITID(2);
Result Set 1¶
+-----------------------------------------------------+
| DEPOSIDID |
|-----------------------------------------------------|
| [ |
| "RESULTSET_93D50CBB_F22C_418A_A88C_4E1DE101B500", |
| "RESULTSET_6BDE39D7_0554_406E_B52F_D9E863A3F15C" |
| ] |
+-----------------------------------------------------+
Visualize conjuntos de resultados¶
Ao executar o procedimento acima no Snowflake, será retornado uma matriz com nomes de tabelas temporárias:
[ «RESULTSET_93D50CBB_F22C_418A_A88C_4E1DE101B500», «RESULTSET_6BDE39D7_0554_406E_B52F_D9E863A3F15C»]
É necessário executar as seguintes consultas para exibir os conjuntos de resultados como no Teradata.
Consulta¶
SELECT * FROM table('RESULTSET_93D50CBB_F22C_418A_A88C_4E1DE101B500');
SELECT * FROM table('RESULTSET_6BDE39D7_0554_406E_B52F_D9E863A3F15C');
Result Set 1¶
+--------------+--------------+
| ACCOUNTNO | ACCOUNTNAME |
|--------------+--------------|
| 4 | Account 4 |
+--------------+--------------+
Result Set 2¶
+--------------+--------------+
| ACCOUNTNO | ACCOUNTNAME |
|--------------+--------------|
| 2 | Account 2 |
+--------------+--------------+
Problemas conhecidos ¶
Não foram encontrados problemas.
EWIs relacionados¶
CREATE PROCEDURE¶
Referência de tradução para converter Teradata CREATE PROCEDURE para Script Snowflake
Descrição
A instrução do Teradata CREATE PROCEDURE e REPLACE PROCEDURE gera ou substitui uma implementação de procedimento armazenado e a compila.
Para obter mais informações sobre CREATE PROCEDURE ou REPLACE PROCEDURE , clique aqui.
-- Create/replace procedure syntax
{CREATE | REPLACE} PROCEDURE [database_name. | user_name.] procedure_name
([<parameter_definition>[, ...n]])
[<SQL_data_access>]
[DYNAMIC RESULT SETS number_of_sets]
[SQL SECURITY <privilege_option>]
statement;
<parameter_definition> := [IN | OUT | INOUT] parameter_name data_type
<SQL_data_access> := {CONTAINS SQL | MODIFIES SQL DATA | READS SQL DATA}
<privilege_option> := {CREATOR | DEFINER | INVOKER | OWNER}
Amostra de padrões de origem ¶
Dados de configuração¶
O código a seguir é necessário para executar os padrões de amostra apresentados nesta seção.
Teradata¶
CREATE TABLE inventory (
product_name VARCHAR(50),
price INTEGER
);
INSERT INTO inventory VALUES ('Bread', 50);
INSERT INTO inventory VALUES ('Tuna', 150);
INSERT INTO inventory VALUES ('Gum', 20);
INSERT INTO inventory VALUES ('Milk', 80);
Snowflake¶
CREATE OR REPLACE TABLE inventory (
product_name VARCHAR(50),
price INTEGER
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
;
INSERT INTO inventory
VALUES ('Bread', 50);
INSERT INTO inventory
VALUES ('Tuna', 150);
INSERT INTO inventory
VALUES ('Gum', 20);
INSERT INTO inventory
VALUES ('Milk', 80);
Procedimento básico ¶
Teradata ¶
Consulta¶
REPLACE PROCEDURE BasicProcedure(IN counterValue INTEGER)
BEGIN
DECLARE productName VARCHAR(50);
DECLARE productPrice INTEGER DEFAULT 0;
DECLARE whileCounter INTEGER DEFAULT 0;
SET productName = 'Salt';
WHILE (whileCounter < counterValue) DO
SET productPrice = 10 + productPrice;
SET whileCounter = whileCounter + 1;
END WHILE;
INSERT INTO inventory VALUES (productName, productPrice);
END;
CALL BasicProcedure(5);
SELECT product_name, price FROM inventory WHERE product_name = 'Salt';
Resultado¶
+--------------+--------------+
| product_name | price |
|--------------+--------------|
| Salt | 50 |
+--------------+--------------+
Snowflake Scripting ¶
Consulta¶
CREATE OR REPLACE PROCEDURE BasicProcedure (COUNTERVALUE INTEGER)
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "teradata", "convertedOn": "07/10/2025", "domain": "no-domain-provided" }}'
EXECUTE AS CALLER
AS
$$
DECLARE
productName VARCHAR(50);
productPrice INTEGER DEFAULT 0;
whileCounter INTEGER DEFAULT 0;
BEGIN
productName := 'Salt';
WHILE (:whileCounter < :counterValue) LOOP
productPrice := 10 + productPrice;
whileCounter := whileCounter + 1;
END LOOP;
INSERT INTO inventory
VALUES (:productName, :productPrice);
END;
$$;
CALL BasicProcedure(5);
SELECT
product_name,
price FROM
inventory
WHERE
UPPER(RTRIM( product_name)) = UPPER(RTRIM('Salt'));
Resultado¶
+--------------+--------------+
| product_name | price |
|--------------+--------------|
| Salt | 50 |
+--------------+--------------+
Parâmetro isolado ¶
Teradata¶
Consulta¶
REPLACE PROCEDURE procedureLabelSingle(OUT Message VARCHAR(100))
BEGIN
set Message = 'Assignment value. Thanks';
END;
CALL procedureLabelSingle(?);
Resultado¶
Message |
------------------------+
Assignment value. Thanks|
Snowflake Scripting ¶
Consulta¶
CREATE OR REPLACE PROCEDURE procedureLabelSingle (MESSAGE OUT VARCHAR(100))
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "teradata", "convertedOn": "07/23/2024" }}'
EXECUTE AS CALLER
AS
$$
BEGIN
Message := 'Assignment value. Thanks';
END;
$$;
CALL procedureLabelSingle(?);
Resultado¶
+───────────────────────────────+
| PROCEDURELABELSINGLE |
+───────────────────────────────+
| ""Assignment value. Thanks"" |
+───────────────────────────────+
Parâmetro de saída múltipla ¶
Teradata¶
Consulta¶
REPLACE PROCEDURE procedureLabelMultiple(OUT Message VARCHAR(100), OUT Message2 VARCHAR(100))
BEGIN
set Message = 'Assignment value. Thanks';
set Message2 = 'Assignment value2. Thanks';
END;
CALL procedureLabelSingle(?, ?);
Resultado¶
1 |2 |
------------------------+-------------------------+
Assignment value. Thanks|Assignment value2. Thanks|
Snowflake Scripting ¶
Consulta¶
CREATE OR REPLACE PROCEDURE procedureLabelMultiple (MESSAGE OUT VARCHAR(100), MESSAGE2 OUT VARCHAR(100))
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "teradata", "convertedOn": "07/16/2025", "domain": "no-domain-provided" }}'
EXECUTE AS CALLER
AS
$$
BEGIN
Message := 'Assignment value. Thanks';
Message2 := 'Assignment value2. Thanks';
END;
$$;
--** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "procedureLabelSingle" **
CALL procedureLabelSingle(?, ?);
Resultado¶
+─────────────────────────+────────────────────────────────+
| PROCEDURELABELMULTIPLE | |
+─────────────────────────+────────────────────────────────+
| "{ | |
| ""Message"" | ""Assignment value. Thanks"", |
| ""Message2"" | ""Assignment value2. Thanks"" |
| }" | |
+─────────────────────────+────────────────────────────────+
Parâmetro de saída múltipla com conjuntos de resultados dinâmicos ¶
Teradata¶
Consulta¶
REPLACE PROCEDURE Procedure1(out product_name VARCHAR(50), out price integer)
DYNAMIC RESULT SETS 2
BEGIN
DECLARE result_set CURSOR WITH RETURN ONLY FOR
SELECT * FROM inventory;
DECLARE result_set2 CURSOR WITH RETURN ONLY FOR
SELECT * FROM inventory;
SET price = 100;
SET product_name = 'another2';
OPEN result_set2;
OPEN result_set;
END;
REPLACE PROCEDURE Procedure2()
BEGIN
DECLARE price INTEGER;
DECLARE productName varchar(10);
CALL Procedure1(productName, price);
INSERT INTO inventory VALUES(:productName, :price);
END;
CALL Procedure2();
Resultado¶
 (1).png)
Snowflake Scripting ¶
Consulta¶
--** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "inventory" **
CREATE OR REPLACE PROCEDURE Procedure1 (PRODUCT_NAME OUT VARCHAR(50), PRICE OUT integer)
RETURNS ARRAY
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "teradata", "convertedOn": "07/16/2025", "domain": "no-domain-provided" }}'
EXECUTE AS CALLER
AS
$$
DECLARE
tbl_result_set VARCHAR;
tbl_result_set2 VARCHAR;
return_arr ARRAY := array_construct();
BEGIN
tbl_result_set := 'RESULTSET_' || REPLACE(UPPER(UUID_STRING()), '-', '_');
CREATE OR REPLACE TEMPORARY TABLE IDENTIFIER(:tbl_result_set) AS
SELECT
* FROM
inventory;
LET result_set CURSOR
FOR
SELECT
*
FROM
IDENTIFIER(?);
tbl_result_set2 := 'RESULTSET_' || REPLACE(UPPER(UUID_STRING()), '-', '_');
CREATE OR REPLACE TEMPORARY TABLE IDENTIFIER(:tbl_result_set2) AS
SELECT
* FROM
inventory;
LET result_set2 CURSOR
FOR
SELECT
*
FROM
IDENTIFIER(?);
price := 100;
product_name := 'another2';
OPEN result_set2 USING (tbl_result_set2);
return_arr := array_append(return_arr, :tbl_result_set2);
OPEN result_set USING (tbl_result_set);
return_arr := array_append(return_arr, :tbl_result_set);
--** SSC-FDM-0020 - MULTIPLE RESULT SETS ARE RETURNED IN TEMPORARY TABLES **
RETURN return_arr;
END;
$$;
--** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "inventory" **
CREATE OR REPLACE PROCEDURE Procedure2 ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "teradata", "convertedOn": "07/16/2025", "domain": "no-domain-provided" }}'
EXECUTE AS CALLER
AS
$$
DECLARE
price INTEGER;
productName varchar(10);
BEGIN
CALL Procedure1(:productName, :price);
INSERT INTO inventory
VALUES (:productName, :price);
END;
$$;
CALL Procedure2();
Problemas conhecidos ¶
1. SQL Data Access
Por padrão, os procedimentos do Snowflake suportam a execução de qualquer tipo de instrução SQL, incluindo instruções de leitura ou modificação de dados, tornando a cláusula de acesso a dados SQL irrelevante. Essa cláusula será ignorada ao converter o procedimento.
2. Objetos de nível superior no relatório de avaliação
Os elementos (tabelas temporais ou exibições) dentro dos procedimentos armazenados estão sendo contados no relatório de avaliação como objetos de nível superior. A equipe do SnowConvert AI está trabalhando agora em uma correção para este cenário.
EWIs relacionados¶
SSC-EWI-0073: Revisão de equivalência funcional pendente.
SSC-FDM-0020: Vários conjuntos de resultados são retornados em tabelas temporárias.