SnowConvert AI - Oracle - CREATE FUNCTION¶
Criação de função Oracle para Snowflake Snow Scripting
Descrição¶
Nota
Algumas partes do código de saída foram omitidas por motivos de clareza.
Uma função armazenada (também chamada de função de usuário ou função definida pelo usuário) é um conjunto de instruções PL/SQL que você pode chamar pelo nome. As funções armazenadas são muito semelhantes aos procedimentos, exceto pelo fato de que uma função retorna um valor ao ambiente em que é chamada. As funções de usuário podem ser usadas como parte de uma expressão SQL.
Uma especificação de chamada declara um método Java ou uma rotina de linguagem de terceira geração (3GL) para que possa ser chamada a partir de PL/SQL. Você também pode usar a instrução
CALLSQL para chamar esse método ou rotina. A especificação de chamada informa ao Oracle Database qual método Java, ou qual função nomeada em qual biblioteca compartilhada, deve ser invocada quando uma chamada é feita. Ele também informa ao banco de dados quais conversões de tipo devem ser feitas para os argumentos e o valor de retorno. Função Create da referência de linguagem Oracle SQL.
Sintaxe do Oracle¶
Para obter mais informações sobre a função Oracle Create, veja aqui.
Sintaxe da função de criação da Oracle¶
CREATE [ OR REPLACE ] [ EDITIONABLE | NONEDITIONABLE ]
FUNCTION
[ schema. ] function_name
[ ( parameter_declaration [, parameter_declaration]... ) ] RETURN datatype
[ sharing_clause ]
[ { invoker_rights_clause
| accessible_by_clause
| default_collation_clause
| deterministic_clause
| parallel_enable_clause
| result_cache_clause
| aggregate_clause
| pipelined_clause
| sql_macro_clause
}...
]
{ IS | AS } { [ declare_section ]
BEGIN statement ...
[ EXCEPTION exception_handler [ exception_handler ]... ]
END [ name ] ;
|
{ java_declaration | c_declaration } } ;
Sintaxe do Snowflake¶
O Snowflake permite 3 idiomas diferentes em suas funções definidas pelo usuário:
SQL
JavaScript
Java
Por enquanto, o SnowConvert AI será compatível somente com SQL e JavaScript como linguagens de destino.
Para obter mais informações sobre a função Snowflake Create, veja aqui.
SQL¶
Nota
Funções SQL definidas pelo usuário suportam apenas uma consulta como corpo. Elas podem ler do banco de dados, mas não têm permissão para gravar ou modificar (SQL UDFs escalares).
CREATE [ OR REPLACE ] [ SECURE ] FUNCTION <name> ( [ <arg_name> <arg_data_type> ] [ , ... ] )
RETURNS { <result_data_type> | TABLE ( <col_name> <col_data_type> [ , ... ] ) }
[ [ NOT ] NULL ]
[ { CALLED ON NULL INPUT | { RETURNS NULL ON NULL INPUT | STRICT } } ]
[ VOLATILE | IMMUTABLE ]
[ COMMENT = '<string_literal>' ]
AS '<function_definition>'
JavaScript¶
Nota
Funções JavaScript definidas pelo usuário permitem várias instruções em seus corpos, mas não podem realizar consultas ao banco de dados. (JavaScript UDFs escalares).
CREATE [ OR REPLACE ] [ SECURE ] FUNCTION <name> ( [ <arg_name> <arg_data_type> ] [ , ... ] )
RETURNS { <result_data_type> | TABLE ( <col_name> <col_data_type> [ , ... ] ) }
[ [ NOT ] NULL ]
LANGUAGE JAVASCRIPT
[ { CALLED ON NULL INPUT | { RETURNS NULL ON NULL INPUT | STRICT } } ]
[ VOLATILE | IMMUTABLE ]
[ COMMENT = '<string_literal>' ]
AS '<function_definition>'
Amostra de padrões da origem¶
Amostra de dados auxiliares¶
Nota
Esse código foi executado para uma melhor compreensão dos exemplos:
Oracle¶
CREATE TABLE table1 (col1 int, col2 int, col3 varchar2(250), col4 varchar2(250), col5 date);
INSERT INTO table1 VALUES (1, 11, 'val1_1', 'val1_2', TO_DATE('2004/05/03', 'yyyy-MM-dd'));
INSERT INTO table1 VALUES (2, 22, 'val2_1', 'val2_2', TO_DATE('2014/05/03', 'yyyy-MM-dd'));
INSERT INTO table1 VALUES (3, 33, 'val3_1', 'val3_2', TO_DATE('2024/05/03', 'yyyy-MM-dd'));
Snowflake¶
CREATE OR REPLACE TABLE table1 (col1 int,
col2 int,
col3 VARCHAR(250),
col4 VARCHAR(250),
col5 TIMESTAMP /*** SSC-FDM-OR0042 - DATE TYPE COLUMN HAS A DIFFERENT BEHAVIOR IN SNOWFLAKE. ***/
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "oracle", "convertedOn": "07/25/2024" }}'
;
INSERT INTO table1
VALUES (1, 11, 'val1_1', 'val1_2', TO_DATE('2004/05/03', 'yyyy-MM-dd'));
INSERT INTO table1
VALUES (2, 22, 'val2_1', 'val2_2', TO_DATE('2014/05/03', 'yyyy-MM-dd'));
INSERT INTO table1
VALUES (3, 33, 'val3_1', 'val3_2', TO_DATE('2024/05/03', 'yyyy-MM-dd'));
Problemas conhecidos¶
Não foram encontrados problemas.
Cursor para uma variável de retorno¶
Nota
Algumas partes do código de saída foram omitidas por motivos de clareza.
Esse padrão define uma função no Oracle PL/SQL que usa um cursor para buscar um único valor e retorná-lo.
Componentes:
Declaração de função:
CREATE FUNCTION functionName(parameters) RETURN returnTypeDeclara a função com os parâmetros de entrada e o tipo de retorno.
Instruções de variáveis:
Declara variáveis, inclusive a variável de retorno.
Declaração de cursor:
CURSOR cursorName IS SELECT singleColumn FROM ... WHERE ... [AND col1 = localVar1];Define um cursor para selecionar uma única coluna de uma tabela com condições de filtragem opcionais.
Bloco BEGIN-END:
Atribuição de variáveis.
Abre o cursor.
Busca o resultado na variável de retorno.
Fecha o cursor.
Retorna o valor buscado.
Nesse caso, as variáveis são transformadas em uma expressão de tabela comum (CTE). Assim como a consulta dentro do cursor ao qual, além disso, a cláusula FETCH FIRST 1 ROW ONLY é adicionada para simular o comportamento FETCH CURSOR.
RETURN é transformada no select final.
Consultas¶
Oracle¶
CREATE OR REPLACE FUNCTION func1 (
company_ IN VARCHAR2,
book_id_ IN DATE,
object_id_ IN VARCHAR2 ) RETURN INTEGER
IS
temp_ table1.col2%TYPE;
CURSOR get_attr IS
SELECT col2
FROM table1
WHERE col3 = company_
AND col4 = object_id_
AND col5 = book_id_;
BEGIN
OPEN get_attr;
FETCH get_attr INTO temp_;
CLOSE get_attr;
RETURN temp_;
END func1;
Snowflake¶
CREATE OR REPLACE FUNCTION func1 (company_ VARCHAR, book_id_ TIMESTAMP /*** SSC-FDM-OR0042 - DATE TYPE COLUMN HAS A DIFFERENT BEHAVIOR IN SNOWFLAKE. ***/, object_id_ VARCHAR)
RETURNS INTEGER
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "oracle", "convertedOn": "09/06/2024" }}'
AS
$$
WITH declaration_variables_cte1 AS
(
SELECT
(
SELECT col2
FROM table1
WHERE col3 = company_
AND col4 = object_id_
AND col5 = book_id_
FETCH FIRST 1 ROW ONLY) AS temp_
)
SELECT
temp_
FROM
declaration_variables_cte1
$$;
Resultado¶
FUNC1() |
|---|
2004-05-03. |
Oracle¶
CREATE FUNCTION func2 (
fa_period_ IN NUMBER,
to_date_ IN DATE DEFAULT NULL,
from_date_ IN DATE DEFAULT NULL ) RETURN NUMBER
IS
value_ NUMBER;
cond_date_to_ DATE;
cond_date_from_ DATE;
CURSOR get_acq_value IS
SELECT NVL(SUM(col1),0)
FROM table1
WHERE col3 IN (DECODE(fa_period_, 1, 'val1_1', 'val2_1'))
AND col5 <= cond_date_to_
AND col5 >= cond_date_from_;
BEGIN
value_ := 0;
cond_date_to_ := Get_Cond_Date( to_date_, 'MAX' );
cond_date_from_ := Get_Cond_Date( from_date_, 'MIN' );
OPEN get_acq_value;
FETCH get_acq_value INTO value_;
CLOSE get_acq_value;
RETURN (NVL(value_,0));
END func2;
Snowflake¶
CREATE OR REPLACE FUNCTION func2 (fa_period_ NUMBER(38, 18),
to_date_ TIMESTAMP /*** SSC-FDM-OR0042 - DATE TYPE COLUMN HAS A DIFFERENT BEHAVIOR IN SNOWFLAKE. ***/ DEFAULT NULL,
from_date_ TIMESTAMP /*** SSC-FDM-OR0042 - DATE TYPE COLUMN HAS A DIFFERENT BEHAVIOR IN SNOWFLAKE. ***/ DEFAULT NULL )
RETURNS NUMBER(38, 18)
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "oracle", "convertedOn": "09/06/2024" }}'
AS
$$
WITH declaration_variables_cte1 AS
(
SELECT
0 AS
value_,
Get_Cond_Date( to_date_, 'MAX' ) !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'Get_Cond_Date' NODE ***/!!! AS
cond_date_to_,
Get_Cond_Date( from_date_, 'MIN' ) !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'Get_Cond_Date' NODE ***/!!! AS
cond_date_from_
),
declaration_variables_cte2 AS
(
SELECT
(
SELECT NVL(SUM(col1),0)
FROM table1
WHERE col3 IN (DECODE(fa_period_, 1, 'val1_1', 'val2_1'))
AND col5 <= cond_date_to_
AND col5 >= cond_date_from_
FETCH FIRST 1 ROW ONLY) AS value_,
cond_date_to_,
cond_date_from_
FROM
declaration_variables_cte1
)
SELECT
(NVL(value_,0))
FROM
declaration_variables_cte2
$$;
Resultado¶
FUNC1() |
|---|
2004-05-03. |
Problemas conhecidos¶
Não foram encontrados problemas.
EWIS relacionados¶
SSC-FDM-OR0042: O tipo de data transformado em carimbo de data/hora tem um comportamento diferente.
SSC-EWI-0073: Revisão de equivalência funcional pendente.
Cursor com a instrução IF¶
Nota
Algumas partes do código de saída foram omitidas por motivos de clareza.
Esse padrão define uma função que usa condicionalmente um cursor para buscar e retornar um valor com base em uma instrução IF.
Componentes:
Declaração de função:
CREATE FUNCTION functionName(parameters) RETURN returnTypeDeclara a função com os parâmetros de entrada e o tipo de retorno.
Declaração de cursor:
CURSOR cursorName IS SELECT singleColumn FROM ... WHERE ... [AND col1 = localVar1];Define um cursor para selecionar uma única coluna de uma tabela com condições de filtragem opcionais.
Declaração de variáveis:
Declara variáveis, inclusive a variável de retorno.
Bloco BEGIN-END com instrução IF:
Atribuição de variáveis.
Verifique se uma condição é verdadeira.
Se verdadeiro, abre o cursor, busca o resultado na variável de retorno, fecha o cursor e retorna o valor buscado. (O cursor também pode ser aberto no bloco
ELSEe deve atender às mesmas condições)O bloco
ELSEé opcional; se existir, deverá conter apenas um único comando que pode ser uma atribuição ou um comandoRETURN.
As variáveis são transformadas em uma expressão de tabela comum (CTE). Assim como a consulta dentro do cursor ao qual, além disso, a cláusula FETCH FIRST 1 ROW ONLY é adicionada para simular o comportamento FETCH CURSOR.
A instrução IF/ELSE pode ser tratada usando CASE EXPRESSION dentro de select, permitindo condicionais dentro das consultas. A instrução RETURN é transformada no select final.
Consultas¶
Oracle¶
CREATE OR REPLACE FUNCTION func1 (
company_ IN NUMBER) RETURN NUMBER
IS
CURSOR getmaxperiod IS
SELECT max(col2)
FROM table1;
max_period_ NUMBER := 12;
BEGIN
IF 1 = 1 THEN
OPEN getmaxperiod;
FETCH getmaxperiod INTO max_period_ ;
CLOSE getmaxperiod;
RETURN max_period_;
ELSE
RETURN NULL;
END IF;
END func1;
Snowflake¶
CREATE OR REPLACE FUNCTION func1 (company_ NUMBER(38, 18))
RETURNS NUMBER(38, 18)
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "oracle", "convertedOn": "09/06/2024" }}'
AS
$$
WITH declaration_variables_cte0 AS
(
SELECT
12 AS
max_period_
),
declaration_variables_cte1 AS
(
SELECT
CASE
WHEN 1 = 1
THEN (
SELECT max(col2)
FROM table1
FETCH FIRST 1 ROW ONLY)
ELSE NULL
END AS max_period_
FROM
declaration_variables_cte0
)
SELECT
max_period_
FROM
declaration_variables_cte1
$$;
Resultado¶
FUNC2(0) |
|---|
NULL |
FUNC2(1) |
|---|
33 |
Oracle¶
CREATE OR REPLACE FUNCTION func2(
company_ IN NUMBER) RETURN NUMBER
IS
CURSOR getmaxperiod IS
SELECT max(col2)
FROM table1;
max_period_ NUMBER := 1;
BEGIN
max_period_:= 2;
IF company_ = 1 THEN
RETURN max_period_ * 2;
ELSE
OPEN getmaxperiod;
FETCH getmaxperiod INTO max_period_ ;
CLOSE getmaxperiod;
RETURN max_period_;
END IF;
END func2;
Snowflake¶
CREATE OR REPLACE FUNCTION func2 (company_ NUMBER(38, 18))
RETURNS NUMBER(38, 18)
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "oracle", "convertedOn": "09/06/2024" }}'
AS
$$
WITH declaration_variables_cte0 AS
(
SELECT
1 AS
max_period_
),
declaration_variables_cte1 AS
(
SELECT
2 AS
max_period_
FROM
declaration_variables_cte0
),
declaration_variables_cte2 AS
(
SELECT
CASE
WHEN company_ = 1
THEN max_period_ * 2
ELSE (
SELECT max(col2)
FROM table1
FETCH FIRST 1 ROW ONLY)
END AS max_period_
FROM
declaration_variables_cte1
)
SELECT
max_period_
FROM
declaration_variables_cte2
$$;
Resultado¶
FUNC2(0) |
|---|
33 |
FUNC2(1) |
|---|
2 |
Oracle¶
CREATE OR REPLACE FUNCTION func3 (
company_ IN NUMBER) RETURN NUMBER
IS
CURSOR getmaxperiod IS
SELECT max(col2)
FROM table1;
max_period_ NUMBER := 0;
BEGIN
IF company_ = 1 THEN
OPEN getmaxperiod;
FETCH getmaxperiod INTO max_period_ ;
CLOSE getmaxperiod;
END IF;
RETURN max_period_;
END func10;
Snowflake¶
CREATE OR REPLACE FUNCTION func3 (company_ NUMBER(38, 18))
RETURNS NUMBER(38, 18)
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "oracle", "convertedOn": "09/06/2024" }}'
AS
$$
WITH declaration_variables_cte0 AS
(
SELECT
0 AS
max_period_
),
declaration_variables_cte1 AS
(
SELECT
CASE
WHEN company_ = 1
THEN (
SELECT max(col2)
FROM table1
FETCH FIRST 1 ROW ONLY)
ELSE max_period_
END AS max_period_
FROM
declaration_variables_cte0
)
SELECT
max_period_
FROM
declaration_variables_cte1
$$;
Resultado¶
FUNC2(0) |
|---|
0 |
FUNC2(1) |
|---|
33 |
Problemas conhecidos¶
Não foram encontrados problemas.
EWIS relacionados¶
Sem EWIs relacionados
Instrução com múltiplos IFs¶
Esse padrão define uma função que usa instruções condicionais sobre variáveis locais.
Componentes:
Declaração de função:
CREATE FUNCTION functionName(parameters) RETURN returnTypeDeclara a função com os parâmetros de entrada e o tipo de retorno.
Declaração de variáveis:
Declara variáveis, inclusive a variável de retorno.
Bloco BEGIN-END com instrução IF:
Verifique se uma condição é verdadeira.
Cada caso é usado para atribuir um valor à mesma variável.
Conversão:¶
DECLARE SECTION: variáveis com uma expressão padrão são movidas para uma expressão de tabela comum.
A instrução IF/ELSE pode ser tratada usando CASE EXPRESSION dentro de select, permitindo condicionais dentro das consultas.
RETURN é transformada no select final.
Oracle¶
CREATE OR REPLACE FUNCTION Case1 (
in_date_ IN DATE,
min_max_ IN VARCHAR2 )
RETURN DATE
IS
cond_date_ DATE := CURRENT_DATE;
BEGIN
IF ( in_date_ IS NULL ) THEN
IF ( min_max_ = 'MIN' ) THEN
cond_date_ := FOO1();
ELSE
cond_date_ := FOO2();
END IF;
ELSE
cond_date_ := TRUNC(in_date_);
END IF;
RETURN cond_date_;
END Case1;
Snowflake¶
CREATE OR REPLACE FUNCTION Case1 (in_date_ TIMESTAMP /*** SSC-FDM-OR0042 - DATE TYPE COLUMN HAS A DIFFERENT BEHAVIOR IN SNOWFLAKE. ***/, min_max_ VARCHAR)
RETURNS TIMESTAMP /*** SSC-FDM-OR0042 - DATE TYPE COLUMN HAS A DIFFERENT BEHAVIOR IN SNOWFLAKE. ***/
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "oracle", "convertedOn": "09/06/2024" }}'
AS
$$
WITH declaration_variables_cte0 AS
(
SELECT
CURRENT_DATE AS
cond_date_
),
declaration_variables_cte1 AS
(
SELECT
CASE
WHEN ( in_date_ IS NULL )
THEN CASE
WHEN ( min_max_ = 'MIN' )
THEN FOO1() !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'FOO1' NODE ***/!!!
ELSE FOO2() !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'FOO2' NODE ***/!!!
END
ELSE TRUNC(in_date_, 'DD')
END AS cond_date_
FROM
declaration_variables_cte0
)
SELECT
cond_date_
FROM
declaration_variables_cte1
$$;
Oracle¶
CREATE OR REPLACE FUNCTION Case2 (
year_ IN NUMBER,
id IN NUMBER)
RETURN VARCHAR2
IS
base_value_ NUMBER;
fully_depritiated_ VARCHAR2(5);
residual_value_ NUMBER;
acc_depr_prev_ NUMBER;
acc_depr_ NUMBER;
BEGIN
base_value_ := FOO1(year_, id);
acc_depr_ := FOO2(year_, id);
acc_depr_prev_ := FOO3(year_, id);
residual_value_ := NVL(base_value_,0) -(acc_depr_ + acc_depr_prev_);
IF (residual_value_=0 AND base_value_!=0) THEN
fully_depritiated_ := 'TRUE';
ELSE
fully_depritiated_ := 'FALSE';
END IF;
RETURN fully_depritiated_;
END Case2;
Snowflake¶
CREATE OR REPLACE FUNCTION Case2 (year_ NUMBER(38, 18), id NUMBER(38, 18))
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "oracle", "convertedOn": "09/06/2024" }}'
AS
$$
WITH declaration_variables_cte1 AS
(
SELECT
FOO1(year_, id) !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'FOO1' NODE ***/!!! AS
base_value_,
FOO2(year_, id) !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'FOO2' NODE ***/!!! AS
acc_depr_,
FOO3(year_, id) !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'FOO3' NODE ***/!!! AS
acc_depr_prev_,
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0036 - TYPES RESOLUTION ISSUES, ARITHMETIC OPERATION '-' MAY NOT BEHAVE CORRECTLY BETWEEN NUMBER AND unknown ***/!!!
NVL(base_value_,0) -(acc_depr_ + acc_depr_prev_) AS
residual_value_,
CASE
WHEN (residual_value_=0 AND base_value_!=0)
THEN 'TRUE'
ELSE 'FALSE'
END AS fully_depritiated_
)
SELECT
fully_depritiated_
FROM
declaration_variables_cte1
$$;
Oracle¶
CREATE OR REPLACE FUNCTION Case2_1 (
year_ IN NUMBER,
id IN NUMBER)
RETURN VARCHAR2
IS
base_value_ NUMBER;
fully_depritiated_ VARCHAR2(5);
residual_value_ NUMBER;
acc_depr_prev_ NUMBER;
acc_depr_ NUMBER;
BEGIN
base_value_ := FOO1(year_, id);
acc_depr_ := FOO2(year_, id);
acc_depr_prev_ := FOO3(year_, id);
residual_value_ := NVL(base_value_,0) -(acc_depr_ + acc_depr_prev_);
IF (residual_value_=0 AND base_value_!=0) THEN
fully_depritiated_ := 'TRUE';
ELSE
fully_depritiated_ := 'FALSE';
END IF;
fully_depritiated := fully_depritiated || ' CONCAT FOR TESTING';
fully_depritiated := fully_depritiated || ' CONCAT FOR TESTING2';
RETURN fully_depritiated_;
END Case2;
Snowflake¶
--** SSC-FDM-0007 - MISSING DEPENDENT OBJECTS "FOO1", "FOO2", "FOO3" **
CREATE OR REPLACE FUNCTION Case2_1 (year_ NUMBER(38, 18), id NUMBER(38, 18))
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "oracle", "convertedOn": "07/16/2025", "domain": "no-domain-provided" }}'
AS
$$
WITH declaration_variables_cte1 AS
(
SELECT
FOO1(year_, id) !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'FOO1' NODE ***/!!! AS
base_value_,
FOO2(year_, id) !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'FOO2' NODE ***/!!! AS
acc_depr_,
FOO3(year_, id) !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'FOO3' NODE ***/!!! AS
acc_depr_prev_,
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0036 - TYPES RESOLUTION ISSUES, ARITHMETIC OPERATION '-' MAY NOT BEHAVE CORRECTLY BETWEEN NUMBER AND unknown ***/!!!
NVL(base_value_,0) -(acc_depr_ + acc_depr_prev_) AS
residual_value_,
CASE
WHEN (residual_value_=0 AND base_value_!=0)
THEN 'TRUE'
ELSE 'FALSE'
END AS fully_depritiated_,
NVL(fully_depritiated :: STRING, '') || ' CONCAT FOR TESTING' AS
fully_depritiated
),
declaration_variables_cte2 AS
(
SELECT
NVL(fully_depritiated :: STRING, '') || ' CONCAT FOR TESTING2' AS
fully_depritiated,
base_value_,
acc_depr_,
acc_depr_prev_,
residual_value_
FROM
declaration_variables_cte1
)
SELECT
fully_depritiated_
FROM
declaration_variables_cte2
$$;
Oracle¶
CREATE OR REPLACE FUNCTION Case2_1 (
year_ IN NUMBER,
id IN NUMBER)
RETURN VARCHAR2
IS
base_value_ NUMBER;
fully_depritiated_ VARCHAR2(5);
residual_value_ NUMBER;
acc_depr_prev_ NUMBER;
acc_depr_ NUMBER;
BEGIN
base_value_ := FOO1(year_, id);
acc_depr_ := FOO2(year_, id);
acc_depr_prev_ := FOO3(year_, id);
residual_value_ := NVL(base_value_,0) -(acc_depr_ + acc_depr_prev_);
IF (residual_value_=0 AND base_value_!=0) THEN
fully_depritiated_ := 'TRUE';
ELSE
fully_depritiated_ := 'FALSE';
END IF;
fully_depritiated := fully_depritiated || ' CONCAT FOR TESTING';
fully_depritiated := fully_depritiated || ' CONCAT FOR TESTING2';
RETURN fully_depritiated_;
END Case2;
Snowflake¶
CREATE OR REPLACE FUNCTION Case2_1 (year_ NUMBER(38, 18), id NUMBER(38, 18))
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "oracle", "convertedOn": "09/06/2024" }}'
AS
$$
WITH declaration_variables_cte1 AS
(
SELECT
FOO1(year_, id) !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'FOO1' NODE ***/!!! AS
base_value_,
FOO2(year_, id) !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'FOO2' NODE ***/!!! AS
acc_depr_,
FOO3(year_, id) !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'FOO3' NODE ***/!!! AS
acc_depr_prev_,
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0036 - TYPES RESOLUTION ISSUES, ARITHMETIC OPERATION '-' MAY NOT BEHAVE CORRECTLY BETWEEN NUMBER AND unknown ***/!!!
NVL(base_value_,0) -(acc_depr_ + acc_depr_prev_) AS
residual_value_,
CASE
WHEN (residual_value_=0 AND base_value_!=0)
THEN 'TRUE'
ELSE 'FALSE'
END AS fully_depritiated_,
NVL(fully_depritiated :: STRING, '') || ' CONCAT FOR TESTING' AS
fully_depritiated
),
declaration_variables_cte2 AS
(
SELECT
NVL(fully_depritiated :: STRING, '') || ' CONCAT FOR TESTING2' AS
fully_depritiated,
base_value_,
acc_depr_,
acc_depr_prev_,
residual_value_
FROM
declaration_variables_cte1
)
SELECT
fully_depritiated_
FROM
declaration_variables_cte2
$$;
Problemas conhecidos¶
Não foram encontrados problemas.
EWIS relacionados¶
SSC-FDM-OR0042: O tipo de data transformado em carimbo de data/hora tem um comportamento diferente.
SSC-EWI-0073: Revisão de equivalência funcional pendente.
SSC-EWI-OR0036: Problemas de resolução de tipos; a operação aritmética pode não se comportar corretamente entre a cadeia de caracteres e a data
UDF do Script Snowflake (SCALAR)¶
Referência de tradução de funções definidas pelo usuário do Oracle para [Snowflake Scripting UDFs]Snowflake Scripting UDFs
Nota
Algumas partes do código de saída foram omitidas por motivos de clareza.
Descrição¶
O SnowConvert agora oferece suporte à tradução de funções definidas pelo usuário do Oracle PL/SQL diretamente para Scripts Snowflake UDFs (SnowScript UDFs) quando atendem a critérios específicos.
Snowflake Scripting UDFs are user-defined functions written using Snowflake’s procedural language syntax (Snowscript) within a SQL UDF body. Eles oferecem suporte a variáveis, loops, lógica condicional e tratamento de exceções sem exigir acesso ao banco de dados.
Quando as funções se tornam UDFs do SnowScript¶
O SnowConvert analisa cada função do Oracle e determina automaticamente o destino do Snowflake apropriado. Uma função se torna uma UDF do SnowScript quando contém apenas lógica de procedimento sem operações de acesso a dados.
Amostra de padrões da origem¶
Função de cálculo simples¶
Uma função básica que realiza cálculos sem consultar dados.
Oracle¶
CREATE OR REPLACE FUNCTION CalculateTax (
amount_ IN NUMBER,
tax_rate_ IN NUMBER
) RETURN NUMBER
IS
tax_amount_ NUMBER;
BEGIN
tax_amount_ := amount_ * (tax_rate_ / 100);
RETURN tax_amount_;
END CalculateTax;
Resultado¶
CALCULATETAX(1000, 15) |
|---|
150 |
Snowflake (SnowScript UDF)¶
CREATE OR REPLACE FUNCTION CalculateTax (amount_ NUMBER(38, 18), tax_rate_ NUMBER(38, 18)
)
RETURNS NUMBER(38, 18)
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "oracle", "convertedOn": "10/09/2025", "domain": "no-domain-provided", "migrationid": "zsqZAVE5n32hZZFtsi0zsg==" }}'
AS
$$
DECLARE
tax_amount_ NUMBER(38, 18);
BEGIN
tax_amount_ := :amount_ * (:tax_rate_ / 100);
RETURN :tax_amount_;
END;
$$;
Resultado¶
CALCULATETAX |
|---|
150 |
Função com lógica IF/ELSIF/ELSE¶
Funções que usam instruções condicionais para lógica de negócios.
Oracle¶
CREATE OR REPLACE FUNCTION GetShippingCost (
distance_ IN NUMBER,
weight_ IN NUMBER
) RETURN NUMBER
IS
shipping_cost_ NUMBER := 0;
BEGIN
IF distance_ < 50 THEN
shipping_cost_ := 10;
ELSIF distance_ < 100 THEN
shipping_cost_ := 20;
ELSIF distance_ < 200 THEN
shipping_cost_ := 35;
ELSE
shipping_cost_ := 50;
END IF;
IF weight_ > 20 THEN
shipping_cost_ := shipping_cost_ * 1.5;
END IF;
RETURN shipping_cost_;
END GetShippingCost;
Resultado¶
GETSHIPPINGCOST(75, 25) |
|---|
30 |
Snowflake (SnowScript UDF)¶
CREATE OR REPLACE FUNCTION GetShippingCost (distance_ NUMBER(38, 18), weight_ NUMBER(38, 18)
)
RETURNS NUMBER(38, 18)
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "oracle", "convertedOn": "10/09/2025", "domain": "no-domain-provided", "migrationid": "zsqZAVE5n32hZZFtsi0zsg==" }}'
AS
$$
DECLARE
shipping_cost_ NUMBER(38, 18) := 0;
BEGIN
IF (:distance_ < 50) THEN
shipping_cost_ := 10;
ELSEIF (:distance_ < 100) THEN
shipping_cost_ := 20;
ELSEIF (:distance_ < 200) THEN
shipping_cost_ := 35;
ELSE
shipping_cost_ := 50;
END IF;
IF (:weight_ > 20) THEN
shipping_cost_ := :shipping_cost_ * 1.5;
END IF;
RETURN :shipping_cost_;
END;
$$;
Resultado¶
GETSHIPPINGCOST |
|---|
30 |
Função com Loop FOR¶
Funções que usam loops para cálculos iterativos.
Oracle¶
CREATE OR REPLACE FUNCTION CalculateCompoundInterest (
principal_ IN NUMBER,
rate_ IN NUMBER,
years_ IN NUMBER
) RETURN NUMBER
IS
amount_ NUMBER;
i NUMBER;
BEGIN
amount_ := principal_;
FOR i IN 1..years_ LOOP
amount_ := amount_ * (1 + rate_ / 100);
END LOOP;
RETURN ROUND(amount_, 2);
END CalculateCompoundInterest;
Resultado¶
CALCULATECOMPOUNDINTEREST(1000, 5, 3) |
|---|
1157.63 |
Snowflake (SnowScript UDF)¶
CREATE OR REPLACE FUNCTION CalculateCompoundInterest (principal_ NUMBER(38, 18), rate_ NUMBER(38, 18), years_ NUMBER(38, 18)
)
RETURNS NUMBER(38, 18)
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "oracle", "convertedOn": "10/09/2025", "domain": "no-domain-provided", "migrationid": "zsqZAVE5n32hZZFtsi0zsg==" }}'
AS
$$
DECLARE
amount_ NUMBER(38, 18);
i NUMBER(38, 18);
BEGIN
amount_ := :principal_;
--** SSC-PRF-0008 - PERFORMANCE REVIEW - LOOP USAGE **
FOR i IN 1 TO :years_
--** SSC-PRF-0008 - PERFORMANCE REVIEW - LOOP USAGE **
LOOP
amount_ := :amount_ * (
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0036 - TYPES RESOLUTION ISSUES, ARITHMETIC OPERATION '+' MAY NOT BEHAVE CORRECTLY BETWEEN Number AND unknown ***/!!!1 + :rate_ / 100);
END LOOP;
RETURN ROUND(:amount_, 2);
END;
$$;
Resultado¶
CALCULATECOMPOUNDINTEREST |
|---|
1157.63 |
Lógica CASE e DECODE¶
Funções usadas por expressões CASE e DECODE para categorização.
Oracle¶
CREATE OR REPLACE FUNCTION GetCustomerTier (
annual_spend_ IN NUMBER,
years_active_ IN NUMBER
) RETURN VARCHAR2
IS
tier_ VARCHAR2(20);
base_tier_ VARCHAR2(20);
BEGIN
-- Determine base tier by spending
base_tier_ := CASE
WHEN annual_spend_ >= 10000 THEN 'PLATINUM'
WHEN annual_spend_ >= 5000 THEN 'GOLD'
WHEN annual_spend_ >= 2000 THEN 'SILVER'
ELSE 'BRONZE'
END;
-- Upgrade tier if customer is loyal (5+ years)
IF years_active_ >= 5 THEN
tier_ := DECODE(base_tier_,
'GOLD', 'PLATINUM',
'SILVER', 'GOLD',
'BRONZE', 'SILVER',
base_tier_);
ELSE
tier_ := base_tier_;
END IF;
RETURN tier_;
END GetCustomerTier;
Resultado¶
GETCUSTOMERTIER(3000, 6) |
|---|
GOLD |
Snowflake (SnowScript UDF)¶
CREATE OR REPLACE FUNCTION GetCustomerTier (annual_spend_ NUMBER(38, 18), years_active_ NUMBER(38, 18)
)
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "oracle", "convertedOn": "10/09/2025", "domain": "no-domain-provided", "migrationid": "zsqZAVE5n32hZZFtsi0zsg==" }}'
AS
$$
DECLARE
tier_ VARCHAR(20);
base_tier_ VARCHAR(20);
BEGIN
-- Determine base tier by spending
base_tier_ := CASE
WHEN :annual_spend_ >= 10000 THEN 'PLATINUM'
WHEN :annual_spend_ >= 5000 THEN 'GOLD'
WHEN :annual_spend_ >= 2000 THEN 'SILVER'
ELSE 'BRONZE'
END;
-- Upgrade tier if customer is loyal (5+ years)
IF (:years_active_ >= 5) THEN
tier_ := DECODE(:base_tier_,
'GOLD', 'PLATINUM',
'SILVER', 'GOLD',
'BRONZE', 'SILVER', :base_tier_);
ELSE
tier_ := :base_tier_;
END IF;
RETURN :tier_;
END;
$$;
Resultado¶
GETCUSTOMERTIER |
|---|
GOLD |
Problemas conhecidos¶
Aviso
UDFs do SnowScript não podem:
acessar tabelas de banco de dados
Usar cursores
Chamar outras UDFs
conter funções agregadas ou de janela
realizar operações DML (INSERT/UPDATE/DELETE)
retornar conjuntos de resultados
EWIs relacionados¶
SSC-EWI-0067: UDF was transformed to Snowflake procedure, calling procedures inside a query is not supported.
SSC-EWI-0068: a função definida pelo usuário foi transformada em um procedimento Snowflake.
SSC-EWI-0073: Revisão de equivalência funcional pendente.
SSC-FDM-OR0042: O tipo de data transformado em carimbo de data/hora tem um comportamento diferente.