Transformation for “SELECT INTO Record” is in progress.
CREATEORREPLACEPROCEDURE RECORDS_PROC ()RETURNSVARCHARLANGUAGESQLCOMMENT='{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'EXECUTEASCALLERAS$$
DECLARE
!!!RESOLVE EWI!!! /*** SSC-EWI-0056 - CUSTOM TYPES ARE NOT SUPPORTED IN SNOWFLAKE BUT REFERENCES TO THIS CUSTOM TYPE WERE CHANGED TO OBJECT ***/!!!
TYPE DEPTRECTYP IS RECORD (
DEPT_ID NUMBER(4) NOT NULL := 10,
DEPT_NAME VARCHAR2(30) NOT NULL := 'ADMINISTRATION',
MGR_ID NUMBER(6) := 200,
LOC_ID NUMBER(4) := 1700
);
!!!RESOLVE EWI!!! /*** SSC-EWI-0056 - CUSTOM TYPES ARE NOT SUPPORTED IN SNOWFLAKE BUT REFERENCES TO THIS CUSTOM TYPE WERE CHANGED TO OBJECT ***/!!!
TYPE NAME_REC IS RECORD (
FIRST EMPLOYEES.FIRST_NAME%TYPE,
LAST EMPLOYEES.LAST_NAME%TYPE
);
!!!RESOLVE EWI!!! /*** SSC-EWI-0056 - CUSTOM TYPES ARE NOT SUPPORTED IN SNOWFLAKE BUT REFERENCES TO THIS CUSTOM TYPE WERE CHANGED TO OBJECT ***/!!!
TYPE CONTACT IS RECORD (
NAME NAME_REC,-- NESTED RECORD
PHONE EMPLOYEES.PHONE_NUMBER%TYPE
);
DEPT1 OBJECT !!!RESOLVE EWI!!! /*** SSC-EWI-0036 - DEPTRECTYP DATA TYPE CONVERTED TO OBJECT ***/!!! := OBJECT_CONSTRUCT();
DEPT_NAME OBJECT !!!RESOLVE EWI!!! /*** SSC-EWI-0036 - DEPTRECTYP DATA TYPE CONVERTED TO OBJECT ***/!!! := OBJECT_CONSTRUCT();
C1 OBJECT !!!RESOLVE EWI!!! /*** SSC-EWI-0036 - CONTACT DATA TYPE CONVERTED TO OBJECT ***/!!! := OBJECT_CONSTRUCT();
BEGIN
DEPT1 := OBJECT_INSERT(DEPT1, 'DEPT_NAME', 'PURCHASING', true);
C1 := OBJECT_INSERT(C1, 'FIRST', 'FALVARADO', true);
C1 := OBJECT_INSERT(C1, 'PHONE', '50687818481', true);
SELECT
OBJECT_CONSTRUCT( *) INTO
:DEPT1
FROM
FTABLE46;
INSERT INTO TABLA1
SELECT
:DEPT1.DEPT_NAME:DEPT_ID,
:DEPT1.DEPT_NAME:DEPT_NAME,
:DEPT1.DEPT_NAME:MGR_ID,
:DEPT1.DEPT_NAME:LOC_ID;
INSERT INTO TABLA1
SELECT
:DEPT_NAME.DEPT_NAME:DEPT_ID,
:DEPT_NAME.DEPT_NAME:DEPT_NAME,
:DEPT_NAME.DEPT_NAME:MGR_ID,
:DEPT_NAME.DEPT_NAME:LOC_ID;
!!!RESOLVE EWI!!! /*** SSC-EWI-0030 - THE STATEMENT BELOW HAS USAGES OF DYNAMIC SQL. ***/!!!
EXECUTE IMMEDIATE 'SELECT * FROM
FTABLE46'
!!!RESOLVE EWI!!! /*** SSC-EWI-0058 - FUNCTIONALITY FOR 'EXECUTE IMMEDIATE RETURNING CLAUSE' IS NOT CURRENTLY SUPPORTED BY SNOWFLAKE SCRIPTING ***/!!!
INTO DEPT_NAME;
END;
$$;
CREATEORREPLACEPROCEDURE PROC1 ()RETURNSSTRINGLANGUAGEJAVASCRIPTCOMMENT='{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'EXECUTEASCALLERAS$$
// SnowConvert AI Helpers Code section is omitted.
let SAL_RAISE;
if (
!!!RESOLVE EWI!!! /*** SSC-EWI-0053 - OBJECT jobid MAY NOT WORK PROPERLY, ITS DATATYPE WAS NOT RECOGNIZED ***/!!!
JOBID == `PU_CLERK`) {
SAL_RAISE = 0.09;
} else if (
!!!RESOLVE EWI!!! /*** SSC-EWI-0053 - OBJECT jobid MAY NOT WORK PROPERLY, ITS DATATYPE WAS NOT RECOGNIZED ***/!!!
JOBID == `SH_CLERK`) {
SAL_RAISE = 0.08;
} else if (
!!!RESOLVE EWI!!! /*** SSC-EWI-0053 - OBJECT jobid MAY NOT WORK PROPERLY, ITS DATATYPE WAS NOT RECOGNIZED ***/!!!
JOBID == `ST_CLERK`) {
SAL_RAISE = 0.07;
} else {
SAL_RAISE = 0;
}
$$;
CREATEORREPLACEPROCEDURE PROC1
ISBEGINLOOP
i := i +1;
j :=0;LOOP
j := j +1;
s := s + i * j;-- Sum several productsENDLOOP inner_loop;ENDLOOP outer_loop;END;
CREATEORREPLACEPROCEDURE PROC1 ()RETURNSSTRINGLANGUAGEJAVASCRIPTCOMMENT='{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'EXECUTEASCALLERAS$$
// SnowConvert AI Helpers Code section is omitted.
while ( true ) {
I =
!!!RESOLVE EWI!!! /*** SSC-EWI-0053 - OBJECT i MAY NOT WORK PROPERLY, ITS DATATYPE WAS NOT RECOGNIZED ***/!!!
I + 1;
J = 0;
while ( true ) {
J =
!!!RESOLVE EWI!!! /*** SSC-EWI-0053 - OBJECT j MAY NOT WORK PROPERLY, ITS DATATYPE WAS NOT RECOGNIZED ***/!!!
J + 1;
S =
!!!RESOLVE EWI!!! /*** SSC-EWI-0053 - OBJECT s MAY NOT WORK PROPERLY, ITS DATATYPE WAS NOT RECOGNIZED ***/!!!
S +
!!!RESOLVE EWI!!! /*** SSC-EWI-0053 - OBJECT i MAY NOT WORK PROPERLY, ITS DATATYPE WAS NOT RECOGNIZED ***/!!!
I *
!!!RESOLVE EWI!!! /*** SSC-EWI-0053 - OBJECT j MAY NOT WORK PROPERLY, ITS DATATYPE WAS NOT RECOGNIZED ***/!!!
J;
}
}
$$;
CREATEORREPLACEPROCEDURE PROC1 ()RETURNSSTRINGLANGUAGEJAVASCRIPTCOMMENT='{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'EXECUTEASCALLERAS$$
// SnowConvert AI Helpers Code section is omitted.
let I = 1;
let J = 10;
while ( I != J ) {
I = I + 1;
}
$$;
CREATEORREPLACEPROCEDURE PROC_RECORDS
ISTYPE DEPTRECTYP IS RECORD (
DEPT_ID NUMBER(4)NOTNULL:=10,
DEPT_NAME VARCHAR2(30)NOTNULL:='ADMINISTRATION',
MGR_ID NUMBER(6):=200,
LOC_ID NUMBER(4):=1700);TYPE NAME_REC IS RECORD (FIRST EMPLOYEES.FIRST_NAME%TYPE,LAST EMPLOYEES.LAST_NAME%TYPE);TYPECONTACTIS RECORD (NAME NAME_REC,-- NESTED RECORD
PHONE EMPLOYEES.PHONE_NUMBER%TYPE);BEGINnull;END;
CREATEORREPLACEPROCEDURE ROWTYPE_PROC AS
varname number:=1;CURSOR BOOK_CURSOR ISSELECT*FROM BOOK where1= varname;
BOOK_REC BOOK%ROWTYPE;
BOOK_CUR_REC BOOK_CURSOR%ROWTYPE;BEGIN
BOOK_REC.ID :=10;
BOOK_REC.TITLE:='A STUDY IN SCARLET';
BOOK_REC.AUTHOR :='SIR ARTHUR CONAN DOYLE';INSERTINTO BOOK VALUES(BOOK_REC.ID, BOOK_REC.TITLE, BOOK_REC.AUTHOR);OPEN BOOK_CURSOR;FETCH BOOK_CURSOR INTO BOOK_CUR_REC;CLOSE BOOK_CURSOR;END;
CREATEORREPLACEPROCEDURE ROWTYPE_PROC ()RETURNSSTRINGLANGUAGEJAVASCRIPTCOMMENT='{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'EXECUTEASCALLERAS$$
// SnowConvert AI Helpers Code section is omitted.
let VARNAME = 1;
let BOOK_CURSOR = new CURSOR(`SELECT * FROM
BOOK
where 1 = ?`,() => [VARNAME]);
let BOOK_REC = ROWTYPE(`BOOK`);
let BOOK_CUR_REC = BOOK_CURSOR.ROWTYPE();
BOOK_REC.ID = 10;
BOOK_REC.TITLE = `A STUDY IN SCARLET`;
BOOK_REC.AUTHOR = `SIR ARTHUR CONAN DOYLE`;
EXEC(`INSERT INTO BOOK
VALUES(
!!!RESOLVE EWI!!! /*** SSC-EWI-0026 - THE VARIABLE BOOK_REC.ID MAY REQUIRE A CAST TO DATE, TIME OR TIMESTAMP ***/!!!
?,
!!!RESOLVE EWI!!! /*** SSC-EWI-0026 - THE VARIABLE BOOK_REC.TITLE MAY REQUIRE A CAST TO DATE, TIME OR TIMESTAMP ***/!!!
?,
!!!RESOLVE EWI!!! /*** SSC-EWI-0026 - THE VARIABLE BOOK_REC.AUTHOR MAY REQUIRE A CAST TO DATE, TIME OR TIMESTAMP ***/!!!
?)`,[BOOK_REC.ID,BOOK_REC.TITLE,BOOK_REC.AUTHOR]);
BOOK_CURSOR.OPEN();
BOOK_CURSOR.FETCH(BOOK_CUR_REC) && ([BOOK_CUR_REC] = BOOK_CURSOR.INTO());
BOOK_CURSOR.CLOSE();
$$;
SnowConvert AI helpers Code removed from the example. You can find them here.
CREATEORREPLACEPROCEDURE PROC_CURSORS ()RETURNSSTRINGLANGUAGEJAVASCRIPTCOMMENT='{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'EXECUTEASCALLERAS$$
// SnowConvert AI Helpers Code section is omitted.
let C1 = new CURSOR();
let C2 = new CURSOR();
let C3 = new CURSOR(`SELECT * FROM
Table1
WHERE ID = 110`,() => []);
let C4 = new CURSOR(`SELECT * FROM
Table1
WHERE ID = 123`,() => []);
// ** SSC-EWI-0022 - ONE OR MORE IDENTIFIERS IN THIS STATEMENT WERE CONSIDERED PARAMETERS BY DEFAULT. REFERENCED TABLE NOT FOUND. **
let C5 = new CURSOR(`SELECT * FROM
Table1
WHERE ID = ?`,(CURSORPARAM) => [CURSORPARAM]);
null;
$$;
SnowConvert AI helpers Code removed from the example. You can find them here.
CREATEORREPLACEPROCEDURE CONCAT_TEST ()RETURNSSTRINGLANGUAGEJAVASCRIPTCOMMENT='{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'EXECUTEASCALLERAS$$
// SnowConvert AI Helpers Code section is omitted.
let NUM1 = 123;
let NUM2 = 321;
let VAR1 = `value`;
let CONCAT_VAR;
let SQL_STMT;
CONCAT_VAR = `${concatValue(NUM1)}${concatValue(NUM2)}${concatValue(VAR1)}literal`;
SQL_STMT = `INSERT INTO t1
VALUES ('${concatValue(CONCAT_VAR)}')`;
EXEC(SQL_STMT);
$$;
CREATEORREPLACEPROCEDURE BOOLEAN_PROC (b_name VARCHAR2, b_value BOOLEAN)IS
BOOL1 BOOLEAN:=FALSE;
x NUMBER:=5;
y NUMBER:=NULL;BEGINIF b_value ISNULLTHENnull;
ELSIF b_value =TRUETHENnull;
ELSIF b_value =TRUEAND b_value = BOOL1 OR b_value = BOOL1 THENnull;
ELSIF x > y THENnull;
ELSIF x != y AND x <> y THENnull;ELSEnull;ENDIF;END;
CREATEORREPLACEPROCEDURE BETWEEN_TEST
IS
NUM1 INTEGER:=789;
US INTEGER:=1000;BEGINIF800BETWEEN US AND NUM1 THENNULL;ENDIF;IF'BA'BETWEEN'B'AND'CA'THENNULL;ENDIF;-- Assign null to the variable num1
NUM1 :=NULL;IF(0BETWEENNULLAND NUM1)ISNULLTHENNULL;ENDIF;END;
SnowConvert AI helpers Code removed from the example. You can find them here.
CREATEORREPLACEPROCEDURE BETWEEN_TEST ()RETURNSSTRINGLANGUAGEJAVASCRIPTCOMMENT='{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'EXECUTEASCALLERAS$$
// SnowConvert AI Helpers Code section is omitted.
let NUM1 = 789;
let US = 1000;
if (BetweenFunc(800,US,NUM1)) {
null;
}
if (BetweenFunc(`BA`,`B`,`CA`)) {
null;
}
// Assign null to the variable num1
NUM1 = undefined;
if (IS_NULL(BetweenFunc(0,undefined,NUM1))) {
null;
}
$$;
For Function Expressions inside procedures, they are being converted to the corresponding function or expression in Snowflake. These function calls are passed to an EXEC with a CALL or a SELECT depending on the converted value.
Most Oracle UDFs and UDFs inside packages, are being transformed to Snowflake Stored Procedures, to maintain functional equivalence, due to Snowflake UDFs having some limitations executing DML (Data Manipulation Language) statements.
Calls of functions that were transformed to procedures inside queries are converted into an empty Snowflake JavaScript UDF. This Snowflake UDF is generated in the STUB_UDF.sql file inside the UDF Helpers directory.
!!!RESOLVE EWI!!!/*** SSC-EWI-0068 - USER DEFINED FUNCTION WAS TRANSFORMED TO SNOWFLAKE PROCEDURE ***/!!!CREATEORREPLACEPROCEDURE FUN1 (x FLOAT)RETURNSFLOATLANGUAGEJAVASCRIPTCOMMENT='{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "oracle", "convertedOn": "07/14/2025", "domain": "no-domain-provided" }}'EXECUTEASCALLERAS$$
// SnowConvert AI Helpers Code section is omitted.
let VAR1;
VAR1 = VAR1 + 1;
// ** SSC-EWI-0022 - ONE OR MORE IDENTIFIERS IN THIS STATEMENT WERE CONSIDERED PARAMETERS BY DEFAULT. REFERENCED TABLE NOT FOUND. **
EXEC(`INSERT INTO TABLE1(col1, col2) VALUES(?, ?)`,[X,VAR1]);
// ** SSC-EWI-0022 - ONE OR MORE IDENTIFIERS IN THIS STATEMENT WERE CONSIDERED PARAMETERS BY DEFAULT. REFERENCED TABLE NOT FOUND. **
EXEC(`UPDATE TABLE2
SET COL1 = ?
WHERE ID = ?`,[VAR1,X]);
return VAR1;
$$;
UDFs that do not use any SQL statement are converted into Snowflake JavaScript UDFs.
Note
When SQL built-in functions are included in the logic the user defined function is converted to a Snowflake procedure. Translation for built in functions to a JavaScript equivalent is planned to be delivered in the future.
Examples for built-in functions: UPPER(), TRIM(), ABS().
CREATEORREPLACEFUNCTION FUN1(x NUMBER)RETURNNUMBERIS
VAR1 NUMBER;BEGINSELECT COL1 INTO VAR1 FROM TABLE1 WHERE ID = X;IF VAR1 <5THEN
VAR1 :=1;ELSE
VAR1 :=0;ENDIF;UPDATE TABLE1 SET COL1 = VAR1 WHERE ID = X;RETURN VAR1;END FUN1;
!!!RESOLVE EWI!!!/*** SSC-EWI-0068 - USER DEFINED FUNCTION WAS TRANSFORMED TO SNOWFLAKE PROCEDURE ***/!!!CREATEORREPLACEPROCEDURE FUN1 (x FLOAT)RETURNSFLOATLANGUAGEJAVASCRIPTCOMMENT='{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "oracle", "convertedOn": "07/14/2025", "domain": "no-domain-provided" }}'EXECUTEASCALLERAS$$
// SnowConvert AI Helpers Code section is omitted.
let VAR1;
// ** SSC-EWI-0022 - ONE OR MORE IDENTIFIERS IN THIS STATEMENT WERE CONSIDERED PARAMETERS BY DEFAULT. REFERENCED TABLE NOT FOUND. **
[VAR1] = EXEC(`SELECT
COL1
FROM
TABLE1
WHERE ID = ?`,[X]);
if (VAR1 < 5) {
VAR1 = 1;
} else {
VAR1 = 0;
}
// ** SSC-EWI-0022 - ONE OR MORE IDENTIFIERS IN THIS STATEMENT WERE CONSIDERED PARAMETERS BY DEFAULT. REFERENCED TABLE NOT FOUND. **
EXEC(`UPDATE TABLE1
SET COL1 = ?
WHERE ID = ?`,[VAR1,X]);
return VAR1;
$$;
Functions with only logic and built-in SQL functions¶
Note
This transformation is planned to be delivered in the future, currently all functions are being transformed to stored procedures.
CREATEORREPLACEFUNCTION FUN1 (flag FLOAT)RETURNSNUMBER(38,18)LANGUAGESQLCOMMENT='{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "oracle", "convertedOn": "11/13/2024", "domain": "test" }}'AS$$
SELECT
CASE flag
WHEN 1 THEN 'one'
WHEN 2 THEN 'two'
WHEN 3 THEN 'three'
WHEN 4 THEN 'four'
ELSE 'unknown' END
$$;
There are two options to migrate packages, each option will affect directly the naming of the objects inside the package. Check here how you can change this mode in the UI.
Let’s suppose that we have the next scenario in Oracle:
A package named MY_PACKAGE.
A procedure inside the package named MY_PROCEDURE.
With this option, packages are transformed into new schemas. Package elements like functions and procedures are created inside the new schema. If the package is already inside a schema, the name of the package will be joined with the name of the schema with an underscore.
This is the default option for translating packages.
Result:
A schema will be created with the name MY_PACKAGE.
Qualified name of the procedure will be updated to MY_PACKAGE.MY_PROCEDURE.
If the package is inside a schema then the procedure will be updated to MY_SCHEMA_MY_PACKAGE.MY_PROCEDURE.
Procedure and function declarations are not necessary for the transformation to Snowflake. Existing procedure or function declarations will be commented out.
Oracle package variables are transformed into Snowflake Session Variables. A prefix is added to the values to know what type it is inside stored procedures. If the value should be null, a “~” is added. Because of this, variables that depend on other variables will require a SUBSTR and a CAST.
Constants declaration will be declared inside the procedure or functions that use them. Existing package constants declaration will be commented out and a warning will be added.
Elements inside a Package Body are going to be extracted from the package. The package body will disappear so the Create Package Body statement is removed in the converted code.
SnowConvert AI helpers Code removed from the example. You can find them here.
With this option, the call of the procedures will be renamed accordingly to the rename of the procedure declaration. The schema name will be separated from the procedure name with a dot.
CREATEORREPLACEPROCEDURE PACKAGE_VARIABLES.P1 ()RETURNSSTRINGLANGUAGEJAVASCRIPTCOMMENT='{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'EXECUTEASCALLERAS$$
// SnowConvert AI Helpers Code section is omitted.
VAR1 =
!!!RESOLVE EWI!!! /*** SSC-EWI-0053 - OBJECT VAR1 MAY NOT WORK PROPERLY, ITS DATATYPE WAS NOT RECOGNIZED ***/!!!
VAR1 + 888;
EXEC(`INSERT INTO TABLE1
values (VAR1)`);
EXEC(`INSERT INTO TABLE2
values (VAR4)`);
$$;
CREATEORREPLACEPROCEDURE PROC1
IS
MyVariable1 NUMBER;
MyOtherVariable2 NUMBER:=1;CURSOR C1 ISSELECT*FROM Table1 WHERE ID =123;CURSOR C2 (paramCursor1 NUMBER)ISSELECT COL1 AS C_1 FROM TABLE1 WHERE ID = paramCursor1;BEGINFOR myCursorRecord IN C1
LOOP
MyVariable1 := myCursorRecord.Col1;ENDLOOP;FOR myCursorRecord IN(SELECT*FROM Table1 WHERE ID = MyVariable1)LOOP
MyVariable1 := myCursorRecord.Col1;ENDLOOP;<<Block1>>FOR myCursorRecord IN C2 (MyOtherVariable2)LOOP
MyVariable1 := myCursorRecord.Col1;ENDLOOP Block1;END;
SnowConvert AI helpers Code removed from the example. You can find them here.
CREATEORREPLACEPROCEDURE PROC1 ()RETURNSSTRINGLANGUAGEJAVASCRIPTCOMMENT='{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'EXECUTEASCALLERAS$$
// SnowConvert AI Helpers Code section is omitted.
let MYVARIABLE1;
let MYOTHERVARIABLE2 = 1;
let C1 = new CURSOR(`SELECT * FROM
Table1
WHERE ID = 123`,() => []);
// ** SSC-EWI-0022 - ONE OR MORE IDENTIFIERS IN THIS STATEMENT WERE CONSIDERED PARAMETERS BY DEFAULT. REFERENCED TABLE NOT FOUND. **
let C2 = new CURSOR(`SELECT COL1 AS C_1 FROM
TABLE1
WHERE ID = ?`,(PARAMCURSOR1) => [PARAMCURSOR1]);
C1.OPEN();
while ( C1.NEXT() ) {
let MYCURSORRECORD = C1.CURRENT;
MYVARIABLE1 = MYCURSORRECORD.COL1;
}
C1.CLOSE();
// ** SSC-EWI-0022 - ONE OR MORE IDENTIFIERS IN THIS STATEMENT WERE CONSIDERED PARAMETERS BY DEFAULT. REFERENCED TABLE NOT FOUND. **
for(var MYCURSORRECORD_CURSOR = new CURSOR(`(SELECT * FROM
Table1
WHERE ID = ?
)`,[MYVARIABLE1]).OPEN();MYCURSORRECORD_CURSOR.NEXT();) {
let MYCURSORRECORD = MYCURSORRECORD_CURSOR.CURRENT;
MYVARIABLE1 = MYCURSORRECORD.COL1;
}
MYCURSORRECORD_CURSOR.CLOSE();
C2.OPEN({
binds : [MYOTHERVARIABLE2]
});
while ( C2.NEXT() ) {
let BLOCK1 = C2.CURRENT;
MYVARIABLE1 = MYCURSORRECORD.COL1;
}
C2.CLOSE();
$$;
Currently the next statement is being emitted but the class is not being created yet. A warning will be applied in the future to all the uses of the unsupported custom types.
CREATEORREPLACEPROCEDURE PROCEDURE1
IS
i NUMBER:=0;
j NUMBER:=0;
k NUMBER:=0;BEGIN<<loop_a>>LOOP
i := i +1;<<loop_b>>LOOP
j := j +1;<<loop_c>>LOOP
k := k + j + i;EXIT;ENDLOOP loop_c;EXIT loop_b WHEN(j >3);ENDLOOP loop_b;EXIT loop_a WHEN(i >3);ENDLOOP loop_a;END;
CREATEORREPLACEPROCEDURE sp_sample5 AS
sql_stmt VARCHAR2(200);
plsql_block VARCHAR2(500);
emp_id NUMBER(4):=7566;
dept_id NUMBER(2):=20;
dept_id2 NUMBER(2):=12;
dept_id_upd VARCHAR(14);
dept_name VARCHAR2(14):='PERSONNEL';location VARCHAR2(13):='DALLAS';
dept_rec deptt%ROWTYPE;TYPE NumList ISTABLEOFNUMBER;
sals NumList;BEGINEXECUTEIMMEDIATE'CREATE TABLE dept (id NUMBER, name varchar(14), location varchar2(13))';
sql_stmt :='INSERT INTO dept VALUES (:1, :2, :3)';EXECUTEIMMEDIATE sql_stmt USING dept_id, dept_name,location;
sql_stmt :='SELECT * FROM dept WHERE id = :idd';EXECUTEIMMEDIATE sql_stmt INTO dept_rec USING dept_id;
sql_stmt :='UPDATE dept SET id = 200 WHERE id = :1 RETURNING name INTO :2';EXECUTEIMMEDIATE sql_stmt USING dept_id RETURNING INTO dept_id_upd;
sql_stmt :='delete from dept where id = :1 RETURNING name INTO :2';EXECUTEIMMEDIATE sql_stmt USING dept_id RETURNING INTO dept_id_upd;EXECUTEIMMEDIATE'INSERT INTO dept VALUES (12, ''NAME1'', ''TEXAS'')';EXECUTEIMMEDIATE'INSERT INTO DEPT VALUES(13, '''|| dept_name ||''', ''LA'')';EXECUTEIMMEDIATE'DELETE FROM dept WHERE id = :num'USING dept_id2;EXECUTEIMMEDIATE'ALTER SESSION SET NLS_DATE_FORMAT = ''DD-MM-YYYY''';EXECUTEIMMEDIATE'SELECT id FROM dept' BULK COLLECT INTO sals;END;
SnowConvert AI helpers Code removed from the example. You can find them here.
CREATEORREPLACEPROCEDURE sp_sample5 ()RETURNSSTRINGLANGUAGEJAVASCRIPTCOMMENT='{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "oracle", "convertedOn": "12/16/2024", "domain": "test" }}'EXECUTEASCALLERAS$$
// SnowConvert AI Helpers Code section is omitted.
let SQL_STMT;
let PLSQL_BLOCK;
let EMP_ID = 7566;
let DEPT_ID = 20;
let DEPT_ID2 = 12;
let DEPT_ID_UPD;
let DEPT_NAME = `PERSONNEL`;
let LOCATION = `DALLAS`;
let DEPT_REC = ROWTYPE(`deptt`);
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0072 - PROCEDURAL MEMBER TYPE DEFINITION NOT SUPPORTED. ***/!!!
/* TYPE NumList IS TABLE OF NUMBER */
;
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0104 - UNUSABLE VARIABLE, ITS TYPE WAS NOT TRANSFORMED ***/!!!
/* sals NumList */
;
EXEC(`CREATE OR REPLACE TABLE dept (id NUMBER(38, 18),
name varchar(14),
location VARCHAR(13))`);
SQL_STMT = `INSERT INTO dept
VALUES (?, ?, ?)`;
EXEC(SQL_STMT,[DEPT_ID,DEPT_NAME,LOCATION]);
SQL_STMT = `SELECT * FROM
dept
WHERE id = ?`;
EXEC(SQL_STMT,[DEPT_ID],{
rec : dept_rec
});
SQL_STMT = `UPDATE dept
SET id = 200 WHERE id = ?
RETURNING name INTO :2`;
!!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'THIS EXECUTE IMMEDIATE CASE' NODE ***/!!!
/* EXECUTE IMMEDIATE sql_stmt USING dept_id RETURNING INTO dept_id_upd */
;
SQL_STMT = `delete FROM
dept
where id = ?
RETURNING name INTO :2`;
!!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'THIS EXECUTE IMMEDIATE CASE' NODE ***/!!!
/* EXECUTE IMMEDIATE sql_stmt USING dept_id RETURNING INTO dept_id_upd */
;
EXEC(`INSERT INTO dept
VALUES (12, 'NAME1', 'TEXAS')`);
EXEC(`INSERT INTO DEPT
VALUES(13, '${concatValue(DEPT_NAME)}', 'LA')`);
EXEC(`DELETE FROM
dept
WHERE id = ?`,[DEPT_ID2]);
EXEC(`ALTER SESSION SET DATE_INPUT_FORMAT = 'DD-MM-YYYY' DATE_OUTPUT_FORMAT = 'DD-MM-YYYY'`);
!!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'THIS EXECUTE IMMEDIATE CASE' NODE ***/!!!
/* EXECUTE IMMEDIATE 'SELECT id FROM dept' BULK COLLECT INTO sals */
;
$$;
Warning
Since the “RETURNING INTO” clause requires special analysis of the statement executed, its translation is planned to be delivered in the future.
Warning
Transformation for the following line corresponds to collection types, which is work in progress:
TYPE NumList ISTABLEOFNUMBER;
Currently the next statement is being emitted but the class is not being created yet. A warning will be applied in the future to all the uses of the unsupported custom types.
letSALS = newNUMLIST();
Also the following EXECUTE IMMEDIATE related with the BULK COLLECT into the sals variable, is also work in progress.
EXECUTEIMMEDIATE'SELECT id FROM dept' BULK COLLECT INTO sals;
SnowConvert AI helpers Code removed from the example. You can find them here.
CREATEORREPLACEPROCEDURE HANDLERS_WITH_OTHERS_COMMENTS ()RETURNSSTRINGLANGUAGEJAVASCRIPTCOMMENT='{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "oracle", "convertedOn": "12/16/2024", "domain": "test" }}'EXECUTEASCALLERAS$$
!!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'PlInvokerRightsClause' NODE ***/!!!
//AUTHID DEFINER
null
// SnowConvert AI Helpers Code section is omitted.
try {
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0052 - EXCEPTION DECLARATION IS HANDLED BY RAISE FUNCTION ***/!!!
/* deadlock_detected EXCEPTION */
;
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0052 - EXCEPTION DECLARATION IS HANDLED BY RAISE FUNCTION ***/!!!
/* deadlock_dex EXCEPTION */
;
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0051 - PRAGMA EXCEPTION_INIT IS NOT SUPPORTED ***/!!!
/* PRAGMA EXCEPTION_INIT(deadlock_detected, -60) */
;
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0051 - PRAGMA EXCEPTION_INIT IS NOT SUPPORTED ***/!!!
/* PRAGMA EXCEPTION_INIT(deadlock_dex, -63) */
;
if (true) {
RAISE(100,`NO_DATA_FOUND`,`Single row SELECT returned no rows or your program referenced a deleted element in a nested table or an uninitialized element in an associative array (index-by table).`);
}
if (true) {
RAISE(-20010,SQLERRM);
}
if (true) {
// ** SSC-FDM-OR0011 - ADD TO STACK OF ERRORS IS NOT SUPPORTED, BOOLEAN ARGUMENT PARM WAS REMOVED. **
RAISE(-20000,SQLERRM);
}
if (true) {
// ** SSC-FDM-OR0011 - ADD TO STACK OF ERRORS IS NOT SUPPORTED, BOOLEAN ARGUMENT TRUE WAS REMOVED. **
RAISE(-20000,SQLERRM);
}
if (true) {
RAISE(-20000,SQLERRM);
}
if (true) {
// ** SSC-FDM-OR0011 - ADD TO STACK OF ERRORS IS NOT SUPPORTED, BOOLEAN ARGUMENT TRUE WAS REMOVED. **
RAISE(-20000,`CUSTOM ERROR MESSAGE`);
}
if (true) {
// ** SSC-FDM-OR0011 - ADD TO STACK OF ERRORS IS NOT SUPPORTED, BOOLEAN ARGUMENT TRUE WAS REMOVED. **
RAISE(-20010,`SECOND CUSTOM ERROR MESSAGE`);
}
if (true) {
RAISE(-20010,`OTHER CUSTOM ERROR MESSAGE`);
}
} catch(error) {
switch(error.name) {
case `EXC_NAME`: {
//Handle Exc_name found exception
null;
break;
}
case `NO_DATA_FOUND`: {
//Handle No data found exception
null;
break;
}
default: {
//Handler for others exception
null;
break;
}
}
}
$$;
When there is not OTHERS handler, SnowConvert AI uses the “default” case in the switch that throws the original Error Object.
SnowConvert AI helpers Code removed from the example. You can find them here.
CREATEORREPLACEPROCEDURE PROC1 (param1 FLOAT, param2 FLOAT)RETURNSSTRINGLANGUAGEJAVASCRIPTCOMMENT='{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'EXECUTEASCALLERAS$$
// SnowConvert AI Helpers Code section is omitted.
EXEC(`INSERT INTO TABLE1
VALUES(?, ?)`,[PARAM1,PARAM2]);
EXEC(`--** SSC-FDM-OR0012 - COMMIT REQUIRES THE APPROPRIATE SETUP TO WORK AS INTENDED **
COMMIT;`);
$$;
SnowConvert AI helpers Code removed from the example. You can find them here.
--** SSC-FDM-OR0007 - SNOWFLAKE DOESN'T SUPPORT VERSIONING OF OBJECTS. DEVELOPERS SHOULD CONSIDER ALTERNATE APPROACHES FOR CODE VERSIONING. **CREATEORREPLACEPROCEDURE PROCEDURE2 ()RETURNSSTRINGLANGUAGEJAVASCRIPTCOMMENT='{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'EXECUTEASCALLERAS$$
// SnowConvert AI Helpers Code section is omitted.
let LOCALVAR1;
let LOCALVAR2;
switch(LOCALVAR1) {
case 1:LOCALVAR2 = `one`;
break;
case 2:LOCALVAR = `two`;
break;
case 3:LOVALVAR = `three`;
break;
default:LOCALVAR = `error`;
break;
}
if (
!!!RESOLVE EWI!!! /*** SSC-EWI-0053 - OBJECT localVar MAY NOT WORK PROPERLY, ITS DATATYPE WAS NOT RECOGNIZED ***/!!!
LOCALVAR == 1) {
LOCALVAR2 = `one`;
} else if (
!!!RESOLVE EWI!!! /*** SSC-EWI-0053 - OBJECT localVar MAY NOT WORK PROPERLY, ITS DATATYPE WAS NOT RECOGNIZED ***/!!!
LOCALVAR == 2) {
LOCALVAR = `two`;
} else if (
!!!RESOLVE EWI!!! /*** SSC-EWI-0053 - OBJECT localVar MAY NOT WORK PROPERLY, ITS DATATYPE WAS NOT RECOGNIZED ***/!!!
LOCALVAR == 3) {
LOVALVAR = `three`;
} else {
LOCALVAR = `error`;
}
$$;
SnowConvert AI helpers Code removed from the example. You can find them here.
--** SSC-FDM-OR0007 - SNOWFLAKE DOESN'T SUPPORT VERSIONING OF OBJECTS. DEVELOPERS SHOULD CONSIDER ALTERNATE APPROACHES FOR CODE VERSIONING. **CREATEORREPLACEPROCEDURE PROCEDURE2 ()RETURNSSTRINGLANGUAGEJAVASCRIPTCOMMENT='{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'EXECUTEASCALLERAS$$
// SnowConvert AI Helpers Code section is omitted.
let LOCALVAR1;
VAR1 =
!!!RESOLVE EWI!!! /*** SSC-EWI-0053 - OBJECT flag MAY NOT WORK PROPERLY, ITS DATATYPE WAS NOT RECOGNIZED ***/!!!
FLAG == 1 && `one` || (
!!!RESOLVE EWI!!! /*** SSC-EWI-0053 - OBJECT flag MAY NOT WORK PROPERLY, ITS DATATYPE WAS NOT RECOGNIZED ***/!!!
FLAG == 2 && `two` || (
!!!RESOLVE EWI!!! /*** SSC-EWI-0053 - OBJECT flag MAY NOT WORK PROPERLY, ITS DATATYPE WAS NOT RECOGNIZED ***/!!!
FLAG == 3 && `three` || (
!!!RESOLVE EWI!!! /*** SSC-EWI-0053 - OBJECT flag MAY NOT WORK PROPERLY, ITS DATATYPE WAS NOT RECOGNIZED ***/!!!
FLAG == 4 && `four` || `unknown`)));
$$;
----** SSC-OOS - OUT OF SCOPE CODE UNIT. CREATE PROCEDURE IS OUT OF TRANSLATION SCOPE. **--CREATE OR REPLACE EDITIONABLE PROCEDURE "OWB_REP_OWNER"."WB_RT_DP_CREATE_FKPARTITION" (prfID IN NUMBER,datatype IN VARCHAR2) AUTHID CURRENT_USER AS LANGUAGE JAVA NAME 'oracle.wh.service.impl.dataProfile.analysis.storedprocs.ForeignKey.createFKPartition(int,java.lang.String)';
SnowConvert AI helpers Code removed from the example. You can find them here.
CREATEORREPLACEPROCEDURE PROC1 (param1 STRING)RETURNSSTRINGLANGUAGEJAVASCRIPTCOMMENT='{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'EXECUTEASCALLERAS$$
// SnowConvert AI Helpers Code section is omitted.
let VAR1 = 789;
EXEC(`SELECT * FROM
TABLE01`);
EXEC(`SELECT DISTINCT COL1 FROM
TABLE01`);
// ** SSC-EWI-0022 - ONE OR MORE IDENTIFIERS IN THIS STATEMENT WERE CONSIDERED PARAMETERS BY DEFAULT. REFERENCED TABLE NOT FOUND. **
EXEC(`SELECT * FROM
TABLE01
WHERE COL1 = ?`,[VAR1]);
// ** SSC-EWI-0022 - ONE OR MORE IDENTIFIERS IN THIS STATEMENT WERE CONSIDERED PARAMETERS BY DEFAULT. REFERENCED TABLE NOT FOUND. **
EXEC(`SELECT * FROM
TABLE01
WHERE COL1 = ?`,[PARAM1]);
// ** SSC-EWI-0022 - ONE OR MORE IDENTIFIERS IN THIS STATEMENT WERE CONSIDERED PARAMETERS BY DEFAULT. REFERENCED TABLE NOT FOUND. **
EXEC(`SELECT * FROM
TABLE01
WHERE COL1 = ?
AND COL2 = ?`,[PARAM1,VAR1]);
$$;
CREATEORREPLACEPROCEDURE PROC1 (param1 VARCHAR, param2 VARCHAR)IS
VAR1 NUMBER;
VAR2 NUMBER;BEGINSELECT COL1 INTO VAR1 FROM TABLE01;SELECT COL1 INTO VAR1 FROM TABLE01 WHERE COL2 = PARAM1;SELECT COL1 INTO VAR1, VAR2 FROM TABLE01;SELECT COL1 INTO VAR1, VAR2 FROM TABLE01
WHERE COL2 = param1 AND COL3 = param1;END
SnowConvert AI helpers Code removed from the example. You can find them here.
CREATEORREPLACEPROCEDURE PROC1 (param1 STRING, param2 STRING)RETURNSSTRINGLANGUAGEJAVASCRIPTCOMMENT='{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'EXECUTEASCALLERAS$$
// SnowConvert AI Helpers Code section is omitted.
let VAR1;
let VAR2;
[VAR1] = EXEC(`SELECT
COL1
FROM
TABLE01`);
// ** SSC-EWI-0022 - ONE OR MORE IDENTIFIERS IN THIS STATEMENT WERE CONSIDERED PARAMETERS BY DEFAULT. REFERENCED TABLE NOT FOUND. **
[VAR1] = EXEC(`SELECT
COL1
FROM
TABLE01
WHERE COL2 = ?`,[PARAM1]);
[VAR1,VAR2] = EXEC(`SELECT
COL1
FROM
TABLE01`);
// ** SSC-EWI-0022 - ONE OR MORE IDENTIFIERS IN THIS STATEMENT WERE CONSIDERED PARAMETERS BY DEFAULT. REFERENCED TABLE NOT FOUND. **
[VAR1,VAR2] = EXEC(`SELECT
COL1
FROM
TABLE01
WHERE COL2 = ?
AND COL3 = ?`,[PARAM1,PARAM1]);
$$;
SnowConvert AI helpers Code removed from the example. You can find them here.
CREATEORREPLACEPROCEDURE PROC1 (PARAM1 STRING)RETURNSSTRINGLANGUAGEJAVASCRIPTCOMMENT='{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'EXECUTEASCALLERAS$$
// SnowConvert AI Helpers Code section is omitted.
let VAR1 = 0;
EXEC(`DELETE FROM
TABLE1
WHERE COL2 = 1`);
// ** SSC-EWI-0022 - ONE OR MORE IDENTIFIERS IN THIS STATEMENT WERE CONSIDERED PARAMETERS BY DEFAULT. REFERENCED TABLE NOT FOUND. **
EXEC(`DELETE FROM
TABLE1
WHERE COL2 = ?`,[VAR1]);
// ** SSC-EWI-0022 - ONE OR MORE IDENTIFIERS IN THIS STATEMENT WERE CONSIDERED PARAMETERS BY DEFAULT. REFERENCED TABLE NOT FOUND. **
EXEC(`DELETE FROM
TABLE1
WHERE COL1 = ?`,[PARAM1]);
$$;
SnowConvert AI helpers Code removed from the example. You can find them here.
CREATEORREPLACEPROCEDURE PROC1 (PARAM1 STRING)RETURNSSTRINGLANGUAGEJAVASCRIPTCOMMENT='{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'EXECUTEASCALLERAS$$
// SnowConvert AI Helpers Code section is omitted.
let VAR1 = 3;
EXEC(`UPDATE TABLE1
SET COL2 = 1 where COL2 = 0`);
// ** SSC-EWI-0022 - ONE OR MORE IDENTIFIERS IN THIS STATEMENT WERE CONSIDERED PARAMETERS BY DEFAULT. REFERENCED TABLE NOT FOUND. **
EXEC(`UPDATE TABLE1
SET COL1 = ?
where COL1 = 0`,[VAR1]);
EXEC(`UPDATE TABLE1
SET COL1 = 'name' where COL1 = PARAM11`);
// ** SSC-EWI-0022 - ONE OR MORE IDENTIFIERS IN THIS STATEMENT WERE CONSIDERED PARAMETERS BY DEFAULT. REFERENCED TABLE NOT FOUND. **
EXEC(`UPDATE TABLE1
SET COL2 = ?
where COL1 = ?`,[VAR1,PARAM1]);
$$;
SnowConvert AI helpers Code removed from the example. You can find them here.
CREATEORREPLACEPROCEDURE PROC1 ()RETURNSSTRINGLANGUAGEJAVASCRIPTCOMMENT='{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'EXECUTEASCALLERAS$$
// SnowConvert AI Helpers Code section is omitted.
EXEC(`MERGE INTO TABLE01 t01
USING TABLE02 t02
ON (t01.col2 = t02.col2)
WHEN MATCHED THEN
UPDATE SET t01.col1 = t02.col2`);
$$;
When the procedure or function is inside a schema and the synonym is inside that schema, but it is being used without the schema, the converted code will add the schema.
CREATETABLE schema_one.TABLE_TEST1(
COL1 INTEGER,
COL2 DATEDEFAULTSYSDATE);CREATEORREPLACE SYNONYM schema_one.MY_SYNONYM1 FOR schema_one.TABLE_TEST1;createorreplaceprocedure schema_one.procedure1 as
returnval integer;beginselect col1 into returnval from my_synonym1;end;
CREATEORREPLACETABLE schema_one.TABLE_TEST1 (
COL1 INTEGER,
COL2 TIMESTAMP/*** SSC-FDM-OR0042 - DATE TYPE COLUMN HAS A DIFFERENT BEHAVIOR IN SNOWFLAKE. ***/DEFAULTCURRENT_TIMESTAMP())COMMENT='{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}';-- --** SSC-FDM-OR0005 - SYNONYMS NOT SUPPORTED IN SNOWFLAKE BUT REFERENCES TO THIS SYNONYM WERE CHANGED BY THE ORIGINAL OBJECT NAME. **-- CREATE OR REPLACE SYNONYM schema_one.MY_SYNONYM1 FOR schema_one.TABLE_TEST1;CREATEORREPLACEPROCEDURE schema_one.procedure1 ()RETURNSVARCHARLANGUAGESQLCOMMENT='{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'EXECUTEASCALLERAS$$
DECLARE
returnval integer;
BEGIN
select col1 into
:returnval
from
schema_one.TABLE_TEST1;
END;
$$;
CREATEORREPLACE SYNONYM MY_SYNONYM2 FOR schema_one.TABLE_TEST1;createorreplaceprocedure procedure2 as
returnval integer;beginselect col1 into returnval from my_synonym2;end;
----** SSC-FDM-OR0005 - SYNONYMS NOT SUPPORTED IN SNOWFLAKE BUT REFERENCES TO THIS SYNONYM WERE CHANGED BY THE ORIGINAL OBJECT NAME. **--CREATE OR REPLACE SYNONYM MY_SYNONYM2 FOR schema_one.TABLE_TEST1;CREATEORREPLACEPROCEDURE procedure2 ()RETURNSSTRINGLANGUAGEJAVASCRIPTCOMMENT='{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'EXECUTEASCALLERAS$$
// SnowConvert AI Helpers Code section is omitted.
let RETURNVAL;
[RETURNVAL] = EXEC(`SELECT
col1
from
schema_one.TABLE_TEST1`);
$$;
Triggers are not supported by Snowflake, and then they will not be migrated automatically.
Snowflake at this moment does not provide a direct mechanism for triggers, but some Snowflake features can be used to achieve similar results.
We recommend that you perform an analysis of your triggers, and classify them by purpose:
Audit Triggers: the intention of these triggers is to capture information and record the changes done on some tables into other tables.
Initialization Triggers: the intention of these triggers is to add some default values to the new records. They are usually before or after insert triggers
Business Rule Barrier Triggers: these usually apply for BEFORE/AFTER DELETE or UPDATE. These triggers are meant to create a barrier to avoid data entry or deletion that will break some business rules.
Instead of Triggers: used for example to allow inserts on views are not supported. The recommendation will be to turn that logic into a stored procedure and introduce calls whenever they were used for insert/delete/update operations.
Database Triggers: cannot be replicated, it is also recommended to encapsulate this logic into a stored procedure. But this logic will need to be manually invoked.
Generic After Triggers: for some after triggers, streams, and tasks can be leveraged see section below.
CREATEORREPLACETRIGGERSCHEMA.TRIGGER_NAME
BEFOREUPDATEORINSERTONSCHEMA.TRIGGER_NAME FOR EACH ROWBEGIN:NEW.LAST_UPDATE :=SYSDATE;END;
Before UPDATE triggers for audit cases like this cannot be handled directly. For the INSERT case you can use the default value case explained for the initialization trigger. However for the update case the only option will be to use a task as it is explained later for AFTER triggers. However the LAST_UPDATE will not be accurate, there will be an offset because the recorded modification will be at the time of task execution (for example if the tasks executes each 5min then the LAST_UPDATE will be recorded 5min later).
For UPDATE cases trying to capture the CURRENT_USER is not possible.
Other cases of AUDIT triggers are when they register changes of a table into an update table. Using the AFTER trigger technique describe later can be used but again USER information cannot be tracked and TIME information will not be accurate.
CREATEORREPLACETRIGGERSCHEMA.TRIGGER_NAME
BEFOREINSERTONSCHEMA.TABLE1 FOR EACH ROWBEGINSELECTSCHEMA.TABLE.NEXTVALINTO:NEW.COLUMN_SEQ FROMDUAL;SELECTUSERINTO:NEW.UPDATED_BY FROMDUAL;SELECTSYSTIMESTAMPINTO:NEW.UPDATED_TM FROMDUAL;END
CREATEORREPLACE EDITIONABLE TRIGGERSCHEMA.TRIGGER_NAME
BEFOREDELETEONSCHEMA.TABLEFOR EACH ROWBEGINIF(:OLD.termination_date isNULLOR:OLD.termination_date >=TRUNC(SYSDATE)+1)THEN
RAISE_APPLICATION_ERROR(-30001,'An employee must be terminated before deleteing the row');ENDIF;
For these cases you will need to in-line the trigger actions after/before the DELETE or UPDATE is performed.
A task is not recommended here because tasks are run on an schedule, and then the row will already be modified.
Warning
This section shows a known workaround for partially implementing AFTER Triggers.
SnowConvert AI helpers Code removed from the example. You can find them here.
----** SSC-OOS - OUT OF SCOPE CODE UNIT. CREATE TRIGGER IS OUT OF TRANSLATION SCOPE. **--CREATE TRIGGER example_trigger--AFTER INSERT ON table1--SELECT * FROM DUAL
These take care of storing the changes made to the table. Please note:
These will store the delta between the current table state, and the last offset stored by the stream itself. Please take this into account for billing purposes.
Notice that these do not store the information of updates, but rather store them as an insertion.
In the same manner, they cannot be configured to track only deletions or only updates, and thus they should have to be filtered in the procedure and the task itself (see below).
These take care of regularly verifying for stream changes and accordingly execute the trigger’s SQL statement(s). Please note:
The Tasks work on a schedule, an action does not trigger them. This means that there will be trigger scheduled checks with no data changes performed in the table.
Tasks cannot be configured to run more than once every sixty (60) seconds, as the minimum time is one (1) minute.
Once the stream has detected changes there will be, in the worst-case scenario, sixty (60) seconds of delay between the change detection and the trigger execution.
While adding the WHEN avoids Task execution, snowflake still adds Charge every time it is evaluated; and said Charge will be added to the bill when the trigger actually executes.
The Task needs a Warehouse to be executed in and will need to be manually set by the client.
CREATEORREPLACETABLE table1 (
col1 NUMBER(38,18)/*** SSC-FDM-0006 - NUMBER TYPE COLUMN MAY NOT BEHAVE SIMILARLY IN SNOWFLAKE. ***/)COMMENT='{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}';CREATEORREPLACEPROCEDURE procedure1 ()RETURNSVARCHARLANGUAGESQLCOMMENT='{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'EXECUTEASCALLERAS$$
DECLARE
var1 NUMBER(38, 18);
BEGIN
NULL;
END;
$$;
CREATEORREPLACEPROCEDURE procedure1 ()RETURNSVARCHARLANGUAGESQLCOMMENT='{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'EXECUTEASCALLERAS$$
DECLARE
!!!RESOLVE EWI!!! /*** SSC-EWI-0056 - CUSTOM TYPES ARE NOT SUPPORTED IN SNOWFLAKE BUT REFERENCES TO THIS CUSTOM TYPE WERE CHANGED TO OBJECT ***/!!!
TYPE record_typ_def IS RECORD(field1 NUMBER);
record_var OBJECT !!!RESOLVE EWI!!! /*** SSC-EWI-0036 - record_typ_def DATA TYPE CONVERTED TO OBJECT ***/!!! := OBJECT_CONSTRUCT();
var1 OBJECT := OBJECT_CONSTRUCT();
var2 NUMBER(38, 18);
BEGIN
NULL;
END;
$$;
In the example before, the variable which is referencing the record variable is changed to OBJECT as same as the record variable, and the variable which is referencing the record field is changed to the record field data type (NUMBER (38, 18)).
In this case, the referenced item is a collection variable, but since collections are not supported, the referencing item TYPE attribute is changed to VARIANT data type.
CREATEORREPLACEPROCEDURE procedure1 ()RETURNSVARCHARLANGUAGESQLCOMMENT='{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'EXECUTEASCALLERAS$$
DECLARE
--!!!RESOLVE EWI!!! /*** SSC-EWI-0058 - FUNCTIONALITY FOR 'PL COLLECTION TYPE DEFINITION' IS NOT CURRENTLY SUPPORTED BY SNOWFLAKE SCRIPTING ***/!!!
--TYPE collection_type IS TABLE OF NUMBER;
collection_var VARIANT !!!RESOLVE EWI!!! /*** SSC-EWI-0062 - CUSTOM TYPE 'collection_type' USAGE CHANGED TO VARIANT ***/!!!;
var1 VARIANT !!!RESOLVE EWI!!! /*** SSC-EWI-OR0129 - TYPE ATTRIBUTE 'collection_var%TYPE' COULD NOT BE RESOLVED, SO IT WAS TRANSFORMED TO VARIANT ***/!!!;
BEGIN
NULL;
END;
$$;
In this case, the referenced item is a cursor variable, but since REF cursors are not supported, the referencing item TYPE attribute is changed to VARIANT data type.
CREATEORREPLACETABLE table1 (col1 NUMBER(38,18)/*** SSC-FDM-0006 - NUMBER TYPE COLUMN MAY NOT BEHAVE SIMILARLY IN SNOWFLAKE. ***/)COMMENT='{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}';CREATEORREPLACEPROCEDURE procedure1 ()RETURNSVARCHARLANGUAGESQLCOMMENT='{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'EXECUTEASCALLERAS$$
DECLARE
--!!!RESOLVE EWI!!! /*** SSC-EWI-0058 - FUNCTIONALITY FOR 'PL REF CURSOR TYPE DEFINITION' IS NOT CURRENTLY SUPPORTED BY SNOWFLAKE SCRIPTING ***/!!!
--TYPE cursor_type IS REF CURSOR RETURN table1%ROWTYPE;
cursor_var_res RESULTSET;
var1_res RESULTSET;
BEGIN
NULL;
END;
$$;
Note
For those cases when the data type of the referenced item cannot be obtained, the referencing item TYPE attribute is changed to VARIANT.
1. Cursors and collections declarations are not supported.¶
Collection and cursor variable declarations are not supported yet so the referencing item TYPE attribute is changed to VARIANT and a warning is added in these cases.