SnowConvert AI – Oracle – CREATE FUNCTION¶
CREATE-Funktion von Oracle in Snowflake Snow Scripting
Beschreibung¶
Bemerkung
Einige Teile des Ausgabecodes wurden aus Gründen der Übersichtlichkeit weggelassen.
Eine gespeicherte Funktion (auch Benutzerfunktion oder benutzerdefinierte Funktion genannt) ist eine Reihe von PL/SQL-Anweisungen, die Sie über einen Namen aufrufen können. Gespeicherte Funktionen sind Prozeduren sehr ähnlich, mit dem Unterschied, dass eine Funktion einen Wert an die Umgebung zurückgibt, in der sie aufgerufen wurde. Benutzerfunktionen können als Teil eines SQL-Ausdrucks verwendet werden.
Eine Aufrufspezifikation deklariert eine Java-Methode oder eine Routine der dritten Generation (3GL), so dass sie von PL/SQL aufgerufen werden kann. Sie können auch die Anweisung
CALLSQL verwenden, um eine solche Methode oder Routine aufzurufen. Die Aufrufspezifikation teilt der Oracle-Datenbank mit, welche Java-Methode oder welche benannte Funktion in welcher gemeinsamen Bibliothek bei einem Aufruf aufgerufen werden soll. Sie teilt der Datenbank auch mit, welche Typkonvertierungen für die Argumente und den Rückgabewert vorgenommen werden sollen. Oracle SQL Language Reference Create Function.
Oracle-Syntax¶
Weitere Informationen zur Create-Funktion in Oracle finden Sie hier.
Syntax der CREATE-Funktion von 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 } } ;
Snowflake-Syntax¶
Snowflake erlaubt 3 verschiedene Sprachen in den benutzerdefinierten Funktionen:
SQL
JavaScript
Java
Vorerst unterstützt SnowConvert AI nur SQL und JavaScript als Zielsprachen.
Weitere Informationen zur Create-Funktion in Snowflake finden Sie hier.
SQL¶
Bemerkung
Benutzerdefinierte SQL-Funktionen unterstützen nur eine Abfrage als ihren Body. Sie können aus der Datenbank lesen, dürfen aber nicht in ihr schreiben oder sie verändern (Skalare SQL UDFs).
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¶
Bemerkung
Benutzerdefinierte JavaScript-Funktionen erlauben mehrere Anweisungen in ihren Bodys, können aber keine Abfrage der Datenbank durchführen. (Skalare JavaScript UDFs).
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>'
Beispielhafte Quellcode-Muster¶
Beispielhafte Hilfsdaten¶
Bemerkung
Dieser Code wurde zum besseren Verständnis der Beispiele ausgeführt:
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'));
Bekannte Probleme¶
Es wurden keine Probleme gefunden.
Cursor für eine Rückgabevariable¶
Bemerkung
Einige Teile des Ausgabecodes wurden aus Gründen der Übersichtlichkeit weggelassen.
Dieses Muster definiert eine Funktion in Oracle PL/SQL, die einen Cursor verwendet, um einen einzelnen Wert zu holen und ihn zurückzugeben.
Komponenten:
Funktionsdeklaration:
CREATE FUNCTION functionName(parameters) RETURN returnTypeDeklariert die Funktion mit Eingabeparametern und dem Rückgabetyp.
Variable Deklarationen:
Deklariert Variablen, einschließlich der Rückgabevariablen.
Cursordeklaration:
CURSOR cursorName IS SELECT singleColumn FROM... WHERE... [AND col1 = localVar1];Definiert einen Cursor zur Auswahl einer einzelnen Spalte aus einer Tabelle mit optionalen Filterbedingungen.
BEGIN-END-Block:
Zuordnung von Variablen.
Öffnet den Cursor.
Rufen Sie das Ergebnis in die Rückgabevariable ab.
Schließt den Cursor.
Gibt den abgefragten Wert zurück.
In diesem Fall werden die Variablen in einen allgemeinen Tabellenausdruck (CTE) umgewandelt. Sowie die Abfrage innerhalb des Cursors, zu der zusätzlich die FETCH FIRST 1 ROW ONLY-Klausel hinzugefügt wird, um die Verhaltensweise von FETCH CURSOR zu simulieren.
RETURN-Anweisung wird in die endgültige SELECT-Anweisung umgewandelt.
Abfragen¶
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
$$;
Ergebnis¶
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
$$;
Ergebnis¶
FUNC1() |
|---|
2004-05-03. |
Bekannte Probleme¶
Es wurden keine Probleme gefunden.
Zugehörige EWIS¶
SSC-FDM-OR0042: In Zeitstempel transformierter Datumstyp weist ein anderes Verhalten auf.
[SSC-EWI-0073](../../../general/technical-documentation/issues-and-troubleshooting/conversion-issues/generalEWI. md#ssc-ewi-0073): Überprüfung der Funktionsäquivalenz ausstehend.
Cursor mit IF-Anweisung¶
Bemerkung
Einige Teile des Ausgabecodes wurden aus Gründen der Übersichtlichkeit weggelassen.
Dieses Muster definiert eine Funktion, die bedingt einen Cursor verwendet, um einen Wert zu holen und zurückzugeben, der auf einer IF-Anweisung basiert.
Komponenten:
Funktionsdeklaration:
CREATE FUNCTION functionName(parameters) RETURN returnTypeDeklariert die Funktion mit Eingabeparametern und dem Rückgabetyp.
Cursordeklaration:
CURSOR cursorName IS SELECT singleColumn FROM... WHERE... [AND col1 = localVar1];Definiert einen Cursor zur Auswahl einer einzelnen Spalte aus einer Tabelle mit optionalen Filterbedingungen.
Variablendeklaration:
Deklariert Variablen, einschließlich der Rückgabevariablen.
BEGIN-END Block mit IF-Anweisung:
Zuordnung von Variablen.
Prüfen Sie, ob eine Bedingung „true“ ist.
Wenn „true“, wird der Cursor geöffnet, das Ergebnis in die Rückgabevariable geholt, der Cursor geschlossen und der abgefragte Wert zurückgegeben. (Der Cursor kann auch im Block
ELSEgeöffnet werden und muss dieselben Bedingungen erfüllen)Der
ELSE-Block ist optional. Wenn er existiert, sollte er nur eine einzige Anweisung enthalten, die eine Zuweisung oder eineRETURN-Anweisung sein kann.
Die Variablen werden in einen allgemeinen Tabellenausdruck umgewandelt (CTE). Sowie die Abfrage innerhalb des Cursors, zu der zusätzlich die FETCH FIRST 1 ROW ONLY-Klausel hinzugefügt wird, um die Verhaltensweise von FETCH CURSOR zu simulieren.
IF/ELSE Anweisung kann mit Hilfe der CASE EXPRESSION innerhalb der SELECT-Anweisung behandelt werden, so dass Bedingungen innerhalb der Abfragen möglich sind. RETURN-Anweisung wird in die endgültige SELECT-Anweisung umgewandelt.
Abfragen¶
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
$$;
Ergebnis¶
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
$$;
Ergebnis¶
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
$$;
Ergebnis¶
FUNC2(0) |
|---|
0 |
FUNC2(1) |
|---|
33 |
Bekannte Probleme¶
Es wurden keine Probleme gefunden.
Zugehörige EWIS¶
Keine zugehörigen EWIs.
Mehrere IFs-Anweisung¶
Dieses Muster definiert eine Funktion, die bedingte Anweisungen über lokale Variablen verwendet.
Komponenten:
Funktionsdeklaration:
CREATE FUNCTION functionName(parameters) RETURN returnTypeDeklariert die Funktion mit Eingabeparametern und dem Rückgabetyp.
Variablendeklaration:
Deklariert Variablen, einschließlich der Rückgabevariablen.
BEGIN-END Block mit IF-Anweisung:
Prüfen Sie, ob eine Bedingung „true“ ist.
Jeder Fall wird verwendet, um einen Wert über dieselbe Variable zuzuweisen.
Konvertierung:¶
DECLARE SECTION: Variablen mit Standardausdruck werden in einen allgemeinen Tabellenausdruck verschoben.
IF/ELSE-Anweisung kann mit Hilfe der CASE EXPRESSION innerhalb der SELECT-Anweisung behandelt werden, was Bedingungen innerhalb der Abfragen ermöglicht.
RETURN-Anweisung wird in die endgültige SELECT-Anweisung umgewandelt.
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
$$;
Bekannte Probleme¶
Es wurden keine Probleme gefunden.
Zugehörige EWIS¶
SSC-FDM-OR0042: In Zeitstempel transformierter Datumstyp weist ein anderes Verhalten auf.
[SSC-EWI-0073](../../../general/technical-documentation/issues-and-troubleshooting/conversion-issues/generalEWI. md#ssc-ewi-0073): Überprüfung der Funktionsäquivalenz ausstehend.
SSC-EWI-OR0036: Bei Problemen mit der Auflösung von Typen verhält sich die arithmetische Operation zwischen Zeichenfolge und Datum möglicherweise nicht korrekt.
UDF für Snowflake-Skript (SCALAR)¶
Übersetzungsreferenz für benutzerdefinierte Funktionen von Oracle in [Snowflake Scripting UDFs]Snowflake Scripting UDFs
Bemerkung
Einige Teile des Ausgabecodes wurden aus Gründen der Übersichtlichkeit weggelassen.
Beschreibung¶
SnowConvert unterstützt jetzt die direkte Übersetzung von benutzerdefinierten PL/SQL-Funktionen in Snowflake Scripting UDFs (SnowScript UDFs), wenn sie bestimmte Kriterien erfüllen.
Snowflake Scripting UDFs sind benutzerdefinierte Funktionen, die mit Snowflakes prozeduraler Sprachsyntax (SnowScript) innerhalb eines SQL UDF-Textkörpers geschrieben wurden. Sie unterstützen Variablen, Schleifen, bedingte Logik und die Behandlung von Ausnahmen, ohne dass ein Zugriff auf die Datenbank erforderlich ist.
Wenn Funktionen zu SnowScript UDFs werden¶
SnowConvert analysiert jede Oracle-Funktion und ermittelt automatisch das entsprechende Snowflake-Ziel. Eine Funktion wird zu einer SnowScript UDF, wenn sie nur prozedurale Logik ohne Datenzugriffsoperationen enthält.
Beispielhafte Quellcode-Muster¶
Einfache Berechnungsfunktion¶
Eine Basisfunktion, die Berechnungen durchführt, ohne Daten abzufragen.
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;
Ergebnis¶
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;
$$;
Ergebnis¶
CALCULATETAX |
|---|
150 |
Funktion mit IF/ELSIF/ELSE-Logik¶
Funktionen, die bedingte Anweisungen für die Geschäftslogik verwenden.
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;
Ergebnis¶
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;
$$;
Ergebnis¶
GETSHIPPINGCOST |
|---|
30 |
Funktion mit FOR-Schleife¶
Funktionen, die Schleifen für iterative Berechnungen verwenden.
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;
Ergebnis¶
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;
$$;
Ergebnis¶
CALCULATECOMPOUNDINTEREST |
|---|
1157.63 |
CASE- und DECODE-Logik¶
Funktionen mit CASE-Ausdrücke und DECODE für die Kategorisierung.
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;
Ergebnis¶
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;
$$;
Ergebnis¶
GETCUSTOMERTIER |
|---|
GOLD |
Bekannte Probleme¶
Warnung
SnowScript UDFs können nicht:
Auf Datenbanktabellen zugreifen
Cursor verwenden
Andere UDFs aufrufen
Aggregat- oder Fensterfunktionen enthalten
DML-Operationen (INSERT/UPDATE/DELETE) ausführen
Resultsets zurückgeben
Zugehörige EWIs¶
SSC-EWI-0067: UDF wurde in eine Snowflake-Prozedur transformiert; das Aufrufen von Prozeduren in einer Abfrage wird nicht unterstützt.
SSC-EWI-0068: Die benutzerdefinierte Funktion wurde in eine Snowflake-Prozedur umgewandelt.
[SSC-EWI-0073](../../../general/technical-documentation/issues-and-troubleshooting/conversion-issues/generalEWI. md#ssc-ewi-0073): Überprüfung der Funktionsäquivalenz ausstehend.
SSC-FDM-OR0042: In Zeitstempel transformierter Datumstyp weist ein anderes Verhalten auf.