PL/SQL vers JavaScript¶
Collections et enregistrements¶
Note
Certaines parties du code de sortie sont omises pour des raisons de clarté.
Enregistrements¶
Note
Vous pourriez également être intéressé par Déclaration d’enregistrements
Oracle
CREATE OR REPLACE PROCEDURE RECORDS_PROC AS
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
);
TYPE NAME_REC IS RECORD (
FIRST EMPLOYEES.FIRST_NAME%TYPE,
LAST EMPLOYEES.LAST_NAME%TYPE
);
TYPE CONTACT IS RECORD (
NAME NAME_REC,-- NESTED RECORD
PHONE EMPLOYEES.PHONE_NUMBER%TYPE
);
DEPT1 DEPTRECTYP;
DEPT_NAME DEPTRECTYP;
C1 CONTACT;
BEGIN
DEPT1.DEPT_NAME := 'PURCHASING';
C1.NAME.FIRST := 'FALVARADO';
C1.PHONE := '50687818481';
SELECT * INTO DEPT1 FROM FTABLE46;
INSERT INTO TABLA1 VALUES (DEPT1.DEPT_NAME);
INSERT INTO TABLA1 VALUES (DEPT_NAME.DEPT_NAME);
EXECUTE IMMEDIATE 'SELECT * FROM FTABLE46' INTO DEPT_NAME;
END;
Snowflake
Avertissement
La transformation pour « Enregistrement SELECT INTO » est en cours.
CREATE OR REPLACE PROCEDURE RECORDS_PROC ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
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;
$$;
Problèmes connus ¶
Aucun problème n’a été constaté.
Compilation conditionnelle¶
Description ¶
Fournit une compilation conditionnelle basée sur la valeur de vérité d’une condition.
Pour plus d’informations sur Oracle Conditional Compilation IF, cliquez ici.
$IF conditional_expression $THEN
statement
[ statement ]...
[ $ELSIF conditional_expression $THEN
statement
[ statement ]... ]...
[ $ELSE
statement
[ statement ]... ]
$END;
Échantillons de modèles de sources ¶
Variantes possibles de IF¶
Oracle ¶
CREATE OR REPLACE PROCEDURE PROCEDURE_DEMO ()
AS
BEGIN
SELECT 2 FROM DUAL;
$IF $$debug_flag
$THEN
SELECT 1 FROM DUAL;
$END
END PROCEDURE_DEMO;
Exécution de scripts Snowflake¶
CREATE OR REPLACE PROCEDURE PROCEDURE_DEMO ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
BEGIN
SELECT 2 FROM DUAL;
!!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'DOLLAR IF STATEMENT' NODE ***/!!!
$IF $$debug_flag
$THEN
SELECT 1 FROM DUAL;
$END
END;
$$;
Problèmes connus¶
La transformation de la compilation conditionnelle n’est pas prise en charge actuellement.
EWIs connexes¶
SSC-EWI-0073 : En attente de l’examen de l’équivalence fonctionnelle.
Instructions de contrôle¶
Note
Certaines parties du code de sortie sont omises pour des raisons de clarté.
Instruction IF, ELSIF et ELSE¶
Oracle
CREATE OR REPLACE PROCEDURE PROC1
IS
sal_raise NUMBER;
BEGIN
IF jobid = 'PU_CLERK' THEN sal_raise := .09;
ELSIF jobid = 'SH_CLERK' THEN sal_raise := .08;
ELSIF jobid = 'ST_CLERK' THEN sal_raise := .07;
ELSE sal_raise := 0;
END IF;
END;
Snowflake
CREATE OR REPLACE PROCEDURE PROC1 ()
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
// SnowConvert 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;
}
$$;
Boucle¶
Oracle
CREATE OR REPLACE PROCEDURE PROC1
IS
BEGIN
<<outer_loop>>
LOOP
i := i + 1;
j := 0;
<<inner_loop>>
LOOP
j := j + 1;
s := s + i * j; -- Sum several products
END LOOP inner_loop;
END LOOP outer_loop;
END;
Snowflake
CREATE OR REPLACE PROCEDURE PROC1 ()
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
// SnowConvert 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;
}
}
$$;
Instruction While¶
Oracle
CREATE OR REPLACE PROCEDURE PROC1
IS
I NUMBER := 1;
J NUMBER := 10;
BEGIN
WHILE I <> J LOOP
I := I+1;
END LOOP;
END;
Snowflake
CREATE OR REPLACE PROCEDURE PROC1 ()
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
// SnowConvert Helpers Code section is omitted.
let I = 1;
let J = 10;
while ( I != J ) {
I = I + 1;
}
$$;
EWIs connexes¶
SSC-EWI-0053 : L’objet peut ne pas fonctionner.
Déclarations¶
Note
Certaines parties du code de sortie sont omises pour des raisons de clarté.
Déclaration et affectation de variables¶
Oracle
CREATE OR REPLACE PROCEDURE PROC_VARIABLES
IS
localVar1 NUMBER;
localVar2 VARCHAR(100);
localVar3 VARCHAR2 := 'local variable 3';
localVar4 VARCHAR2 DEFAULT 'local variable 4';
localVar5 VARCHAR2 NOT NULL := 'local variable 5';
localVar6 VARCHAR2 NOT NULL DEFAULT 'local variable 6';
localVar7 NUMBER := NULL;
localVar8 NUMBER := '';
BEGIN
localVar1 := 123;
END;
Snowflake
CREATE OR REPLACE PROCEDURE PROC_VARIABLES ()
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
// SnowConvert Helpers Code section is omitted.
let LOCALVAR1;
let LOCALVAR2;
let LOCALVAR3 = `local variable 3`;
let LOCALVAR4 = `local variable 4`;
let LOCALVAR5 = `local variable 5`;
let LOCALVAR6 = `local variable 6`;
let LOCALVAR7 = undefined;
let LOCALVAR8 = undefined;
LOCALVAR1 = 123;
$$;
Déclaration d’une variable d’enregistrement¶
Note
Vous pourriez également être intéressé par Section de transformation des enregistrements.
Oracle
CREATE OR REPLACE PROCEDURE PROC_RECORDS
IS
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
);
TYPE NAME_REC IS RECORD (
FIRST EMPLOYEES.FIRST_NAME%TYPE,
LAST EMPLOYEES.LAST_NAME%TYPE
);
TYPE CONTACT IS RECORD (
NAME NAME_REC,-- NESTED RECORD
PHONE EMPLOYEES.PHONE_NUMBER%TYPE
);
BEGIN
null;
END;
Snowflake
CREATE OR REPLACE PROCEDURE PROC_RECORDS ()
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
// SnowConvert Helpers Code section is omitted.
class DEPTRECTYP {
DEPT_ID = 10
DEPT_NAME = `ADMINISTRATION`
MGR_ID = 200
LOC_ID = 1700
constructor() {
[...arguments].map((element,Index) => this[(Object.keys(this))[Index]] = element)
}
}
class NAME_REC {
FIRST
LAST
constructor() {
[...arguments].map((element,Index) => this[(Object.keys(this))[Index]] = element)
}
}
class CONTACT {
NAME = new NAME_REC()
PHONE
constructor() {
[...arguments].map((element,Index) => this[(Object.keys(this))[Index]] = element)
}
}
null;
$$;
Type de ligne Déclaration de variable d’enregistrement¶
Oracle
CREATE OR REPLACE PROCEDURE ROWTYPE_PROC AS
varname number := 1;
CURSOR BOOK_CURSOR IS SELECT * FROM BOOK where 1 = 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';
INSERT INTO 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;
Snowflake
CREATE OR REPLACE PROCEDURE ROWTYPE_PROC ()
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
// SnowConvert 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();
$$;
Déclaration de constantes¶
Oracle
CREATE OR REPLACE PROCEDURE PROC_CONSTANTS
IS
MY_VAR1 NUMBER;
MY_CONST_VAR1 CONSTANT INTEGER(4) := 40;
MY_CONST_VAR2 CONSTANT INTEGER(4) NOT NULL := MY_CONST_VAR1;
MY_CONST_VAR3 CONSTANT VARCHAR(20) DEFAULT 'const variable';
MY_CONST_VAR4 CONSTANT REAL NOT NULL DEFAULT 3.14159;
BEGIN
MY_VAR1 := MY_CONST_VAR1 + MY_CONST_VAR2 + 1;
END;
Snowflake
CREATE OR REPLACE PROCEDURE PROC_CONSTANTS ()
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
// SnowConvert Helpers Code section is omitted.
let MY_VAR1;
const MY_CONST_VAR1 = 40;
const MY_CONST_VAR2 = MY_CONST_VAR1;
const MY_CONST_VAR3 = `const variable`;
const MY_CONST_VAR4 = 3.14159;
MY_VAR1 = MY_CONST_VAR1 + MY_CONST_VAR2 + 1;
$$;
Déclarations et définition du curseur¶
Oracle
Note
Vous pourriez également être intéressé par Assistant de curseur
CREATE OR REPLACE PROCEDURE PROC_CURSORS
IS
CURSOR C1 RETURN Table1%ROWTYPE;
CURSOR C2 RETURN UserDefinedRecordType;
CURSOR C3 RETURN Table1%ROWTYPE IS
SELECT * FROM Table1 WHERE ID = 110;
CURSOR C4 IS
SELECT * FROM Table1 WHERE ID = 123;
CURSOR C5 (cursorParam NUMBER ) RETURN Table1%ROWTYPE IS
SELECT * FROM Table1 WHERE ID = cursorParam;
BEGIN
null;
END;
Snowflake
Note
Code des assistants SnowConvert supprimé de l’exemple. Vous pouvez les trouver ici
CREATE OR REPLACE PROCEDURE PROC_CURSORS ()
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
// SnowConvert 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;
$$;
Problèmes connus ¶
Aucun problème n’a été constaté.
EWIs connexes ¶
Pas d’EWIs connexes.
SSC-EWI-0022 : Un ou plusieurs identificateurs dans cette instruction ont été considérés comme des paramètres par défaut.
SSC-EWI-0026 : La variable peut nécessiter une conversion en date, heure ou horodatage.
Expressions et opérateurs¶
Expressions¶
Opérateur de concaténation¶
Note
Vous pourriez également être intéressé par Assistant Concat
La concaténation Oracle est réalisée dans JavaScript à l’aide d’un modèle de littéral. Elle utilise également l”Assistant Concat pour gérer correctement les concaténations avec des nullités.
Oracle
CREATE OR REPLACE PROCEDURE CONCAT_TEST
IS
NUM1 INTEGER := 123;
NUM2 INTEGER := 321;
VAR1 VARCHAR(10) := 'value';
concat_var VARCHAR(100);
sql_stmt VARCHAR(100);
BEGIN
concat_var := NUM1 || NUM2 || VAR1 || 'literal';
sql_stmt := 'INSERT INTO t1 VALUES (''' || concat_var || ''')';
EXECUTE IMMEDIATE sql_stmt;
END;
Snowflake
Note
Code des assistants SnowConvert supprimé de l’exemple. Vous pouvez les trouver ici
CREATE OR REPLACE PROCEDURE CONCAT_TEST ()
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
// SnowConvert 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);
$$;
Opérateurs logiques¶
Oracle
CREATE OR REPLACE PROCEDURE BOOLEAN_PROC (b_name VARCHAR2, b_value BOOLEAN)
IS
BOOL1 BOOLEAN := FALSE;
x NUMBER := 5;
y NUMBER := NULL;
BEGIN
IF b_value IS NULL THEN
null;
ELSIF b_value = TRUE THEN
null;
ELSIF b_value = TRUE AND b_value = BOOL1 OR b_value = BOOL1 THEN
null;
ELSIF x > y THEN
null;
ELSIF x != y AND x <> y THEN
null;
ELSE
null;
END IF;
END;
Snowflake
Note
Vous pourriez également être intéressé par Assistant IS NULL.
Note
Code des assistants SnowConvert supprimé de l’exemple. Vous pouvez les trouver ici
CREATE OR REPLACE PROCEDURE BOOLEAN_PROC (b_name STRING, b_value BOOLEAN)
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
// SnowConvert Helpers Code section is omitted.
let BOOL1 = false;
let X = 5;
let Y = undefined;
if (IS_NULL(B_VALUE)) {
null;
} else if (B_VALUE == true) {
null;
} else if (B_VALUE == true && B_VALUE == BOOL1 || B_VALUE == BOOL1) {
null;
} else if (X > Y) {
null;
} else if (X != Y && X != Y) {
null;
} else {
null;
}
$$;
Opérateur de comparaison¶
Documentation en cours.
IS [NOT] NULL¶
Note
Vous pourriez également être intéressé par Assistant IS NULL.
Oracle
CREATE OR REPLACE PROCEDURE NULL_TEST
IS
NUM1 INTEGER := 789;
BEGIN
IF NUM1 IS NOT NULL THEN
NULL;
END IF;
NUM1 := NULL;
IF NUM1 IS NULL THEN
NULL;
END IF;
END;
Snowflake
Note
Code des assistants SnowConvert supprimé de l’exemple. Vous pouvez les trouver ici
CREATE OR REPLACE PROCEDURE NULL_TEST ()
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
// SnowConvert Helpers Code section is omitted.
let NUM1 = 789;
if (!IS_NULL(NUM1)) {
null;
}
NUM1 = undefined;
if (IS_NULL(NUM1)) {
null;
}
$$;
Opérateur Like¶
Note
Vous pourriez également être intéressé par Assistant de l’opérateur Like
En cas d’opération LIKE, la fonction d’assistance sera appelée à la place.
Oracle
CREATE OR REPLACE PROCEDURE PROCEDURE_WITH_LIKE AS
BEGIN
IF 'ABC' LIKE '%A%' THEN
null;
END IF;
IF 'ABC' LIKE 'A%' THEN
null;
END IF;
IF 'ABC' NOT LIKE 'D_%' THEN
null;
END IF;
IF 'ABC' NOT LIKE 'D/%%' ESCAPE '/' THEN
null;
END IF;
END;
Snowflake
Note
Code des assistants SnowConvert supprimé de l’exemple. Vous pouvez les trouver ici
CREATE OR REPLACE PROCEDURE PROCEDURE_WITH_LIKE ()
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
// SnowConvert Helpers Code section is omitted.
if (LIKE(`ABC`,`%A%`)) {
null;
}
if (LIKE(`ABC`,`A%`)) {
null;
}
if (!LIKE(`ABC`,`D_%`)) {
null;
}
if (!LIKE(`ABC`,`D/%%`,`/`)) {
null;
}
$$;
OpérateurBetween¶
Note
Vous pouvez également être intéressé par Assistant de l’opérateur Between
Oracle
CREATE OR REPLACE PROCEDURE BETWEEN_TEST
IS
NUM1 INTEGER := 789;
US INTEGER := 1000;
BEGIN
IF 800 BETWEEN US AND NUM1 THEN
NULL;
END IF;
IF 'BA' BETWEEN 'B' AND 'CA' THEN
NULL;
END IF;
-- Assign null to the variable num1
NUM1 := NULL;
IF (0 BETWEEN NULL AND NUM1) IS NULL THEN
NULL;
END IF;
END;
Snowflake
Note
Code des assistants SnowConvert supprimé de l’exemple. Vous pouvez les trouver ici
CREATE OR REPLACE PROCEDURE BETWEEN_TEST ()
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
// SnowConvert 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;
}
$$;
Opérateur IN¶
Oracle
CREATE OR REPLACE PROCEDURE IN_PROC
IS
letter VARCHAR2(1) := 'm';
BEGIN
IF letter IN ('a', 'b', 'c') THEN
null;
ELSE
null;
END IF;
END;
Snowflake
Note
Code des assistants SnowConvert supprimé de l’exemple. Vous pouvez les trouver ici
CREATE OR REPLACE PROCEDURE IN_PROC ()
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
// SnowConvert Helpers Code section is omitted.
let LETTER = `m`;
if ([`a`,`b`,`c`].includes(LETTER)) {
null;
} else {
null;
}
$$;
Expressions booléennes¶
Oracle
CREATE OR REPLACE PROCEDURE BOOLEAN_TEST
IS
done BOOLEAN;
BEGIN
-- These WHILE loops are equivalent
done := FALSE;
WHILE done = FALSE
LOOP
done := TRUE;
END LOOP;
done := FALSE;
WHILE NOT (done = TRUE)
LOOP
done := TRUE;
END LOOP;
done := FALSE;
WHILE NOT done
LOOP
done := TRUE;
END LOOP;
END;
Snowflake
Note
Code des assistants SnowConvert supprimé de l’exemple. Vous pouvez les trouver ici
CREATE OR REPLACE PROCEDURE BOOLEAN_TEST ()
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
// SnowConvert Helpers Code section is omitted.
let DONE;
// These WHILE loops are equivalent
DONE = false;
while ( DONE == false ) {
DONE = true;
}
DONE = false;
while ( !(DONE == true) ) {
DONE = true;
}
DONE = false;
while ( !DONE ) {
DONE = true;
}
$$;
Expressions de fonction¶
Pour les expressions de fonction à l’intérieur des procédures, elles sont converties en fonction ou expression correspondante dans Snowflake. Ces appels de fonction sont transmis à un EXEC avec un CALL ou un SELECT en fonction de la valeur convertie.
Oracle
CREATE OR REPLACE PROCEDURE FUNCTIONS_TEST(DATEPARAM DATE)
IS
STRING_VALUE VARCHAR(20) := 'HELLO';
BEGIN
STRING_VALUE := TO_CHAR(123);
STRING_VALUE := TO_CHAR(DATEPARAM, 'dd-mm-yyyy', 'NLS_DATE_LANGUAGE = language');
END;
Snowflake
Note
Code des assistants SnowConvert supprimé de l’exemple. Vous pouvez les trouver ici
CREATE OR REPLACE PROCEDURE FUNCTIONS_TEST (DATEPARAM TIMESTAMP /*** SSC-FDM-OR0042 - DATE TYPE COLUMN HAS A DIFFERENT BEHAVIOR IN SNOWFLAKE. ***/)
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
// SnowConvert Helpers Code section is omitted.
let STRING_VALUE = `HELLO`;
STRING_VALUE = (EXEC(`SELECT
TO_CHAR(123)`))[0];
STRING_VALUE = (EXEC(`SELECT
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0013 - NLS PARAMETER 'NLS_DATE_LANGUAGE = language' NOT SUPPORTED ***/!!!
TO_CHAR(PUBLIC.CAST_DATE_UDF(?), 'dd-mm-yyyy')`,[DATEPARAM]))[0];
$$;
Pour plus d’informations sur les transformations de la fonction, cliquez ici.
Problèmes connus ¶
Aucun problème n’a été constaté.
EWIs connexes ¶
Pas d’EWIs connexes.
SSC-EWI-OR0013 : Le paramètre NLS n’est pas pris en charge.
SSC-FDM-OR0042 : Le type de date transformé en horodatage a un comportement différent.
Fonctions définies par l’utilisateur¶
Description générale¶
La plupart UDFs Oracle et des UDFs dans les paquets sont transformées en procédures stockées Snowflake, afin de maintenir l’équivalence fonctionnelle, étant donné que les UDFs Snowflake ont quelques limites dans l’exécution des instructions DML (Data Manipulation Language).
Puisque les fonctions sont transformées en procédures, la [référence de transformation pour PL/SQL](./pl-sql-to-snowflake Scripting.md) s’applique également ici.
Traduction¶
Note
Certaines parties du code de sortie sont omises pour des raisons de clarté.
Créer une fonction¶
Oracle
CREATE OR REPLACE FUNCTION FUN1(PAR1 VARCHAR)
RETURN VARCHAR
IS
VAR1 VARCHAR(20);
VAR2 VARCHAR(20);
BEGIN
SELECT COL1 INTO VAR1 FROM TABLE1 where col1 = 1;
VAR2 := PAR1 || VAR1;
RETURN VAR2 ;
END;
Snowflake
CREATE OR REPLACE FUNCTION FUN1 (PAR1 VARCHAR)
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "oracle", "convertedOn": "11/13/2024", "domain": "test" }}'
AS
$$
WITH declaration_variables_cte1 AS
(
SELECT
(
SELECT COL1
FROM
TABLE1
where col1 = 1) AS VAR1,
NVL(PAR1 :: STRING, '') || NVL(VAR1 :: STRING, '') AS
VAR2
)
SELECT
VAR2
FROM
declaration_variables_cte1
$$;
Fonction à l’intérieur du paquet¶
Oracle
CREATE OR REPLACE PACKAGE BODY pkg1 AS
FUNCTION f1(PAR1 VARCHAR) RETURN VARCHAR IS
VAR1 VARCHAR(20);
VAR2 VARCHAR(20);
BEGIN
SELECT COL1 INTO VAR1 FROM TABLE1 where col1 = 1;
VAR2 := PAR1 || VAR1;
RETURN VAR2 ;
END f1;
END pkg1;
Snowflake
CREATE OR REPLACE FUNCTION pkg1.f1(PAR1 VARCHAR)
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "oracle", "convertedOn": "11/13/2024", "domain": "test" }}'
AS
$$
WITH declaration_variables_cte1 AS
(
SELECT
(
SELECT COL1
FROM
TABLE1
where col1 = 1) AS VAR1,
NVL(PAR1 :: STRING, '') || NVL(VAR1 :: STRING, '') AS
VAR2
)
SELECT
VAR2
FROM
declaration_variables_cte1
$$;
Mappage des types de données de retour¶
Type Oracle PL SQL |
Équivalent Snowflake |
---|---|
NUMBER |
FLOAT |
LONG |
VARCHAR |
VARCHAR2 |
STRING |
BLOB |
BINARY |
BFILE |
BINARY |
Appel¶
À l’intérieur des requêtes¶
Les appels de fonctions qui ont été transformés en procédures à l’intérieur de requêtes sont convertis en une UDF JavaScript Snowflake vide. Cette UDF Snowflake vide est généré dans le fichier STUB_UDF. sql à l’intérieur du répertoire UDF Helpers.
Oracle
CREATE VIEW VIEW1 AS SELECT FUN1(COL2) FROM TABLE1;
CREATE VIEW VIEW2 AS SELECT PKG1.F1(COL1) FROM TABLE1;
Snowflake
CREATE OR REPLACE VIEW VIEW1
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
AS
SELECT FUN1(COL2) !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'FUN1' NODE ***/!!! FROM
TABLE1;
CREATE OR REPLACE VIEW VIEW2
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
AS
SELECT PKG1.F1(COL1) !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'PKG1.F1' NODE ***/!!! FROM
TABLE1;
Dans d’autres fonctions ou procédures stockées¶
Oracle
Les fonctions converties en procédures sont appelées à l’aide de l”Assistant EXEC Snowflake.
Oracle
CREATE OR REPLACE FUNCTION FUN1(x NUMBER) RETURN NUMBER IS
VAR1 NUMBER;
BEGIN
-- FUN2 is another UDF
VAR1 := FUN2(pkg1.f1(X, FUN2(10)));
RETURN VAR1;
END f1;
Snowflake :
CREATE OR REPLACE FUNCTION FUN1 (x 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": "11/13/2024", "domain": "test" }}'
AS
$$
WITH declaration_variables_cte1 AS
(
SELECT
FUN2(pkg1.f1(X, FUN2(10) !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'FUN2' NODE ***/!!!) !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'pkg1.f1' NODE ***/!!!) !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'FUN2' NODE ***/!!! AS
-- FUN2 is another UDF
VAR1
)
SELECT
VAR1
FROM
declaration_variables_cte1
$$;
Oracle
CREATE OR REPLACE FUNCTION FUN1(x NUMBER) RETURN NUMBER IS
VAR1 NUMBER;
BEGIN
-- FUN2 is another UDF
VAR1 := FUN2(X);
RETURN VAR1;
END f1;
Snowflake
CREATE OR REPLACE FUNCTION FUN1 (x 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": "11/13/2024", "domain": "test" }}'
AS
$$
WITH declaration_variables_cte1 AS
(
SELECT
FUN2(X) !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'FUN2' NODE ***/!!! AS
-- FUN2 is another UDF
VAR1
)
SELECT
VAR1
FROM
declaration_variables_cte1
$$;
Différents cas et limites¶
Fonctions avec DMLs¶
Ces fonctions ne peuvent pas être exécutées dans des requêtes dans Oracle, leur utilisation sera donc limitée lors de leur transformation en procédures Snowflake.
Oracle
CREATE OR REPLACE FUNCTION FUN1(x NUMBER)
RETURN NUMBER IS
VAR1 NUMBER;
BEGIN
VAR1 := VAR1 + 1;
INSERT INTO TABLE1(col1, col2) VALUES(X, VAR1);
UPDATE TABLE2 SET COL1 = VAR1 WHERE ID = X;
RETURN VAR1;
END FUN1;
Snowflake
--** SSC-FDM-0029 - USER DEFINED FUNCTION WAS TRANSFORMED TO SNOWFLAKE PROCEDURE **
CREATE OR REPLACE PROCEDURE FUN1 (x FLOAT)
RETURNS FLOAT
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
// SnowConvert 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;
$$;
Les fonctions ne comportant qu’un seul SELECT INTO¶
Ces fonctions sont transformées en fonctions Snowflake SQL en supprimant la partie INTO de la sélection.
Oracle
CREATE OR REPLACE FUNCTION FUN1(PAR1 VARCHAR)
RETURN VARCHAR
IS
VAR1 VARCHAR(20);
BEGIN
SELECT COL1 INTO VAR1 FROM TABLE1 where col1 = PAR1;
RETURN VAR1;
END;
Snowflake
CREATE OR REPLACE FUNCTION FUN1 (PAR1 VARCHAR)
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "oracle", "convertedOn": "11/13/2024", "domain": "test" }}'
AS
$$
WITH declaration_variables_cte1 AS
(
SELECT
(
SELECT COL1
FROM
TABLE1
where col1 = PAR1) AS VAR1
)
SELECT
VAR1
FROM
declaration_variables_cte1
$$;
Fonctions avec logique uniquement¶
Les UDFs qui n’utilisent pas d’instruction SQL sont convertis en UDFs JavaScript Snowflake.
Note
Lorsque les fonctions intégrées SQL sont incluses dans la logique, la fonction définie par l’utilisateur est convertie en une procédure Snowflake. La traduction des fonctions intégrées en un équivalent JavaScript est planifiée pour l’avenir.
Exemples pour les fonctions intégrées : UPPER(), TRIM(), ABS().
Oracle
CREATE OR REPLACE FUNCTION FUN1(x NUMBER)
RETURN NUMBER IS
VAR1 NUMBER;
BEGIN
IF x < 5 THEN
VAR1 := 1;
ELSE
VAR1 := 0;
END IF;
RETURN VAR1;
END FUNC01;
Snowflake
CREATE OR REPLACE FUNCTION FUN1 (x 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": "11/13/2024", "domain": "test" }}'
AS
$$
WITH declaration_variables_cte1 AS
(
SELECT
CASE
WHEN x < 5
THEN 1
ELSE 0
END AS VAR1
)
SELECT
VAR1
FROM
declaration_variables_cte1
$$;
Fonctions comportant plus d’une instruction SQL¶
Les UDFs transformées en procédures ne peuvent pas être appelées à partir d’une requête.
Oracle
CREATE OR REPLACE FUNCTION FUN1(x NUMBER)
RETURN NUMBER IS
VAR1 NUMBER;
BEGIN
SELECT COL1 INTO VAR1 FROM TABLE1 WHERE ID = X;
IF VAR1 < 5 THEN
VAR1 := 1;
ELSE
VAR1 := 0;
END IF;
UPDATE TABLE1 SET COL1 = VAR1 WHERE ID = X;
RETURN VAR1;
END FUN1;
Snowflake
--** SSC-FDM-0029 - USER DEFINED FUNCTION WAS TRANSFORMED TO SNOWFLAKE PROCEDURE **
CREATE OR REPLACE PROCEDURE FUN1 (x FLOAT)
RETURNS FLOAT
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
// SnowConvert 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;
$$;
Fonctions uniquement logiques et fonctions SQL intégrées
Note
Cette transformation sera proposée ultérieurement, conformément au plan ; actuellement toutes les fonctions sont transformées en procédures stockées.
Oracle
CREATE OR REPLACE FUNCTION FUN1(x FLOAT)
RETURN NUMBER IS
VAR1 NUMBER;
BEGIN
IF TRUNC(X) < 5 THEN
VAR1 := 1;
ELSE
VAR1 := 0;
END IF;
RETURN VAR1;
END FUNC01;
Transformation actuelle vers Snowflake
CREATE OR REPLACE FUNCTION FUN1 (x FLOAT)
RETURNS NUMBER(38, 18)
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "oracle", "convertedOn": "11/13/2024", "domain": "test" }}'
AS
$$
WITH declaration_variables_cte1 AS
(
SELECT
CASE
WHEN TRUNC(X) < 5
THEN 1
ELSE 0
END AS VAR1
)
SELECT
VAR1
FROM
declaration_variables_cte1
$$;
RETURN CASE¶
La transformation est la même que lorsque CASE est utilisé pour assigner une variable. Vous pouvez vérifier la transformation de CASE dans la section PL/SQL.
Oracle
CREATE OR REPLACE FUNCTION FUN1 (flag FLOAT)
RETURN NUMBER IS
BEGIN
return CASE flag
WHEN 1 THEN 'one'
WHEN 2 THEN 'two'
WHEN 3 THEN 'three'
WHEN 4 THEN 'four'
ELSE 'unknown' END;
END FUN1;
SnowFlake
CREATE OR REPLACE FUNCTION FUN1 (flag FLOAT)
RETURNS NUMBER(38, 18)
LANGUAGE SQL
COMMENT = '{ "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
$$;
Problèmes connus ¶
Aucun problème n’a été constaté.
EWIs connexes¶
SSC-EWI-0022 : Un ou plusieurs identificateurs dans cette instruction ont été considérés comme des paramètres par défaut.
SSC-EWI-0073 : En attente de l’examen de l’équivalence fonctionnelle.
SSC-FDM-0029 : Une fonction définie par l’utilisateur a été transformée en procédure Snowflake.
Paquets¶
Note
Certaines parties du code de sortie sont omises pour des raisons de clarté.
Déclaration des paquets¶
Cette section montre l’équivalence entre les membres d’une déclaration de paquets Oracle et les instructions Snowflake.
Options de traduction des paquets ¶
Il existe deux options pour migrer les paquets, chacune affectant directement le nommage des objets à l’intérieur du paquet. Cliquez ici pour savoir comment modifier ce mode dans l’UI, ou cliquez ici pour le modifier à l’aide de l’interface de ligne de commande.
Supposons que nous ayons le scénario suivant dans Oracle :
Un paquet nommé
MY_PACKAGE.
Une procédure à l’intérieur du paquet nommé
MY_PROCEDURE.
Option 1 (utilisation d’un nouveau schéma)¶
Avec cette option, les paquets sont transformés en nouveaux schémas. Les éléments du paquet, tels que les fonctions et les procédures, sont créés dans le nouveau schéma. Si le paquet se trouve déjà à l’intérieur d’un schéma, le nom du paquet sera joint au nom du schéma avec un trait de soulignement.
Il s’agit de l’option par défaut pour la traduction des paquets.
Résultat :
Un schéma sera créé sous le nom de
MY_PACKAGE
.Le nom qualifié de la procédure sera mis à jour dans
MY_PACKAGE.MY_PROCEDURE
.Si le paquet se trouve à l’intérieur d’un schéma, la procédure sera mise à jour et deviendra
MY_SCHEMA_MY_PACKAGE.MY_PROCEDURE
.
Option 2¶
Avec cette option, le nom des éléments du paquet sera joint au nom du paquet avec un trait de soulignement. De nouveaux schémas ne seront pas créés.
Résultat :
Le nom de la procédure sera mis à jour vers
MY_PACKAGE_MY_PROCEDURE
.Si le paquet se trouve à l’intérieur d’un schéma, la procédure sera mise à jour et deviendra
MY_SCHEMA.MY_PACKAGE_MY_PROCEDURE
.
Créer un paquet¶
L’instruction CREATE PACKAGE sera convertie en instruction CREATE SCHEMA. Tout membre se trouvant à l’intérieur du paquet sera converti à l’extérieur du paquet.
Oracle
CREATE OR REPLACE PACKAGE MY_PACKAGE AS
-- Other elements...
END MY_PACKAGE ;
Transformation avec l’option 1 (utilisation d’un nouveau schéma)¶
CREATE IF NOT EXISTS SCHEMA MY_PACKAGE
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
;
-- Other elements...
Transformation avec l’option 2¶
Avec cette option, le Schéma ne sera pas généré et seuls les éléments internes seront conservés mais avec leurs noms renommés.
-- Other elements...
Déclaration de procédures et de fonctions¶
Les déclarations de procédures et de fonctions ne sont pas nécessaires pour la transformation vers Snowflake. Les déclarations de procédures ou de fonctions existantes seront commentées.
Oracle
CREATE OR REPLACE PACKAGE MY_PACKAGE AS
PROCEDURE MY_PROCEDURE(PARAM1 VARCHAR2);
FUNCTION MY_FUNCTION(PARAM1 VARCHAR2) RETURN NUMBER ;
END MY_PACKAGE;
Transformation avec l’option 1 (utilisation d’un nouveau schéma)¶
CREATE SCHEMA IF NOT EXISTS MY_PACKAGE
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
;
Note
Notez que pour l’option 1, la définition de PROCEDURE
dans le paquet est supprimée car elle n’est pas requise par Snowflake.
Déclaration des variables¶
Note
Vous pourriez également être intéressé par assistant de variables
Les variables du paquet Oracle sont transformées en variables de session Snowflake. Un préfixe est ajouté aux valeurs pour savoir de quel type il s’agit à l’intérieur des procédures stockées. Si la valeur doit être null, un « ~ » est ajouté. Pour cette raison, les variables qui dépendent d’autres variables nécessiteront un SUBSTR et un CAST.
Types de données et mappages de codes¶
Type de données ou valeur |
Code |
---|---|
Types numériques |
# |
Types de dates |
& |
Types de chaînes |
$ |
Valeurs NULL |
~ |
La transformation des variables sera toujours la même quelle que soit l’option de transformation.
Oracle
CREATE OR REPLACE PACKAGE PACKAGE_VARIABLES AS
VAR1 integer := 333;
VAR2 INTEGER := VAR1 + 456;
VAR3 DATE := CURRENT_DATE;
VAR4 VARCHAR(20) := 'HELLO WORLD';
VAR5 INTEGER;
END;
Snowflake
CREATE SCHEMA IF NOT EXISTS PACKAGE_VARIABLES
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
;
SET "PACKAGE_VARIABLES.VAR1" = '' || (333);
SET "PACKAGE_VARIABLES.VAR2" = (SELECT
'' || (GETVARIABLE('PACKAGE_VARIABLES.VAR1') :: INTEGER + 456));
SET "PACKAGE_VARIABLES.VAR3" = (SELECT
'' || (CURRENT_DATE()));
SET "PACKAGE_VARIABLES.VAR4" = '' || ('HELLO WORLD');
SET "PACKAGE_VARIABLES.VAR5" = '~';
Déclaration des constantes¶
La déclaration des constantes sera déclarée à l’intérieur de la procédure ou des fonctions qui les utilisent. Les déclarations de constantes de paquets existantes seront commentées et un avertissement sera ajouté.
Oracle
CREATE OR REPLACE PACKAGE PACKAGE_CONSTANTS
IS
const_name CONSTANT VARCHAR(10) := 'Snow';
PROCEDURE PROCEDURE1;
END PACKAGE_CONSTANTS;
CREATE OR REPLACE PACKAGE BODY PACKAGE_CONSTANTS
IS
PROCEDURE MY_PROCEDURE IS
BEGIN
INSERT INTO DBUSER ("USER_NAME")
VALUES (const_name);
END;
END PACKAGE_CONSTANTS;
Transformation avec l’option 1
CREATE SCHEMA IF NOT EXISTS PACKAGE_CONSTANTS
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
;
CREATE OR REPLACE PROCEDURE PACKAGE_CONSTANTS.MY_PROCEDURE ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
DECLARE
CONST_NAME VARCHAR(10) := 'Snow';
BEGIN
INSERT INTO DBUSER("USER_NAME")
VALUES (:CONST_NAME);
END;
$$;
Note
Notez que la définition de PROCEDURE
dans le paquet est supprimée car elle n’est pas exigée par Snowflake.
Autres membres du paquet¶
La transformation des autres membres du paquet, tels que les curseurs, les exceptions et les types définis par l’utilisateur, est encore en cours.
Oracle
CREATE OR REPLACE PACKAGE MY_PACKAGE_EX AS
an_exception EXCEPTION;
END MY_PACKAGE_EX;
Transformation avec l’option 1¶
CREATE SCHEMA IF NOT EXISTS MY_PACKAGE_EX
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
;
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0049 - PACKAGE EXCEPTIONS in stateful package MY_PACKAGE_EX are not supported yet ***/!!!
an_exception EXCEPTION;
Transformation avec l’option 2¶
/*** MSC-ERROR - MSCEWI3049 - PACKAGE EXCEPTIONS in stateful package MY_PACKAGE_EX are not supported yet ***/
/*an_exception EXCEPTION;*/;
Définition du corps du paquet¶
Cette section montre l’équivalence entre les membres de la définition du corps du paquet Oracle et les instructions Snowflake.
Créer le corps du paquet¶
Les éléments à l’intérieur d’un corps de paquet vont être extraits du paquet. Le corps du paquet disparaissant, l’instruction Create Package Body est supprimée dans le code converti.
Définition des procédures¶
Les procédures stockées à l’intérieur des paquets utilisent les mêmes transformations que celles définies dans la référence de traduction PL/SQL.
Oracle
CREATE OR REPLACE PACKAGE BODY PACKAGE_PROCEDURE
IS
PROCEDURE MY_PROCEDURE (MY_PARAM VARCHAR) IS
BEGIN
null;
END;
END PACKAGE_PROCEDURE;
Transformation avec l’option 1¶
CREATE OR REPLACE PROCEDURE PACKAGE_PROCEDURE.MY_PROCEDURE (MY_PARAM STRING)
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
// SnowConvert Helpers Code section is omitted.
null;
$$;
Transformation avec l’option 2¶
CREATE OR REPLACE PROCEDURE PACKAGE_PROCEDURE_MY_PROCEDURE (MY_PARAM STRING)
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
// REGION SnowConvert Helpers Code
null;
$$;
Définition des fonctions¶
Les fonctions contenues dans les corps des paquets sont converties en procédures stockées Snowflake.
Oracle
CREATE OR REPLACE PACKAGE BODY PACKAGE_FUNCTION
IS
FUNCTION MY_FUNCTION (MY_PARAM VARCHAR) RETURN NUMBER
AS
BEGIN
null;
END;
END PACKAGE_FUNCTION;
Transformation avec l’option 1¶
$1
RETURNS FLOAT
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
AS
$$
// SnowConvert Helpers Code section is omitted.
null;
$$;
Transformation avec l’option 2¶
Note
Code des assistants SnowConvert supprimé de l’exemple. Vous pouvez les trouver ici
CREATE OR REPLACE FUNCTION PACKAGE_FUNCTION_MY_FUNCTION (MY_PARAM STRING)
RETURNS NUMBER
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
AS
$$
// REGION SnowConvert Helpers Code
null;
$$;
Autres membres du corps du paquet¶
Veuillez vous référer à la section « autres membres du paquet » dans Déclaration des paquets
Utilisation des membres du paquet¶
Appel de procédures à l’intérieur des paquets¶
Si la procédure se trouve à l’intérieur d’un paquet et que le paquet se trouve à l’intérieur d’un schéma, l’appel sera renommé.
Oracle
CREATE OR REPLACE PROCEDURE PROCEDURE02(param1 NUMBER, param2 VARCHAR)
IS
BEGIN
SCHEMA1.PACKAGE1.PROCEDURE01(param1, param2);
END;
CALL SCHEMA1.PACKAGE1.PROCEDURE01(param1, param2);
Transformation avec l’option 1¶
Note
Code des assistants SnowConvert supprimé de l’exemple. Vous pouvez les trouver ici
CREATE OR REPLACE PROCEDURE PROCEDURE02 (param1 FLOAT, param2 STRING)
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
// SnowConvert Helpers Code section is omitted.
EXEC(`CALL
SCHEMA1.PACKAGE1.PROCEDURE01(?, ?)`,[PARAM1,PARAM2]);
$$;
CALL SCHEMA1.PACKAGE1.PROCEDURE01(param1, param2);
Transformation avec l’option 2¶
Note
Code des assistants SnowConvert supprimé de l’exemple. Vous pouvez les trouver ici
Avec cette option, l’appel des procédures sera renommé en fonction du renommage de la déclaration de la procédure. Le nom du schéma sera séparé du nom de la procédure par un point.
Snowflake
CREATE OR REPLACE PROCEDURE PUBLIC.PROCEDURE02 (param1 FLOAT, param2 STRING)
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
// REGION SnowConvert Helpers Code
EXEC(`CALL SCHEMA1.PACKAGE1_PROCEDURE01(?, ?)`,[PARAM1,PARAM2]);
$$;
CALL SCHEMA1.PACKAGE1_PROCEDURE01(param1, param2);
Variables des paquets à l’intérieur des procédures¶
Note
Les variables des paquets sont transformées en variables de session. Ces variables sont utilisables par le biais de « Assistant des variables de paquets ».
Note
Cet échantillon utilise des variables déclarées dans les paquets de la section Déclaration des variables.
Oracle
CREATE OR REPLACE PACKAGE BODY PACKAGE_VARIABLES AS
PROCEDURE P1 AS
BEGIN
VAR1 := VAR1 + 888;
INSERT INTO TABLE1 values (VAR1);
INSERT INTO TABLE2 values (VAR4);
END;
END;
Snowflake
CREATE OR REPLACE PROCEDURE PACKAGE_VARIABLES.P1 ()
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
// SnowConvert 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)`);
$$;
Problèmes connus¶
Aucun problème n’a été constaté.
EWIs connexes¶
SSC-EWI-0053 : L’objet peut ne pas fonctionner.
SSC-EWI-OR0049 : Les constantes de paquet dans les paquets avec état ne sont pas encore prises en charge.
Procédures¶
Note
Certaines parties du code de sortie sont omises pour des raisons de clarté.
Exemple 1 : Conversion des procédures de base
Oracle
CREATE OR REPLACE PROCEDURE PROC1
IS
BEGIN
null;
END;
Snowflake
CREATE OR REPLACE PROCEDURE PROC1 ()
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
// SnowConvert Helpers Code section is omitted.
null;
$$;
Exemple 2 : Conversion des procédures avec des instructions de base : Déclaration, affectation, déclaration de curseur, curseur FOR, Open, LOOP, CLOSE, IF,
Oracle
CREATE OR REPLACE PROCEDURE PROC1
(
param1 NUMBER
)
IS
localVar1 NUMBER;
countRows NUMBER;
tempSql VARCHAR(100);
tempResult NUMBER;
CURSOR MyCursor
IS
SELECT COL1 FROM Table1;
BEGIN
localVar1 := param1;
countRows := 0;
tempSql := 'SELECT COUNT(*) FROM Table1 WHERE COL1 =' || localVar1;
FOR myCursorItem IN MyCursor
LOOP
localVar1 := myCursorItem.Col1;
countRows := countRows + 1;
END LOOP;
INSERT INTO Table2 VALUES(countRows, 'ForCursor: Total Row count is: ' || countRows);
countRows := 0;
OPEN MyCursor;
LOOP
FETCH MyCursor INTO tempResult;
EXIT WHEN MyCursor%NOTFOUND;
countRows := countRows + 1;
END LOOP;
CLOSE MyCursor;
INSERT INTO Table2 VALUES(countRows, 'LOOP: Total Row count is: ' || countRows);
EXECUTE IMMEDIATE tempSql INTO tempResult;
IF tempResult > 0 THEN
INSERT INTO Table2 (COL1, COL2) VALUES(tempResult, 'Hi, found value:' || localVar1 || ' in Table1 -- There are ' || tempResult || ' rows');
COMMIT;
END IF;
END PROC1;
Snowflake
CREATE OR REPLACE PROCEDURE PROC1
(param1 FLOAT
)
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
// REGION SnowConvert Helpers Code
var formatDate = (arg) => (new Date(arg - (arg.getTimezoneOffset() * 60000))).toISOString().slice(0,-1);
var fixBind = function (arg) {
arg = arg instanceof Date ? formatDate(arg) : IS_NULL(arg) ? null : arg;
return arg;
};
var SQL = {
FOUND : false,
NOTFOUND : false,
ROWCOUNT : 0,
ISOPEN : false
};
var _RS, _ROWS, SQLERRM = "normal, successful completion", SQLCODE = 0;
var getObj = (_rs) => Object.assign(new Object(),_rs);
var getRow = (_rs) => (values = Object.values(_rs)) && (values = values.splice(-1 * _rs.getColumnCount())) && values;
var fetch = (_RS,_ROWS,fmode) => _RS.getRowCount() && _ROWS.next() && (fmode ? getObj : getRow)(_ROWS) || (fmode ? new Object() : []);
var EXEC = function (stmt,binds,opts) {
try {
binds = !(arguments[1] instanceof Array) && ((opts = arguments[1]) && []) || (binds || []);
opts = opts || new Object();
binds = binds ? binds.map(fixBind) : binds;
_RS = snowflake.createStatement({
sqlText : stmt,
binds : binds
});
_ROWS = _RS.execute();
if (opts.sql !== 0) {
var isSelect = stmt.toUpperCase().trimStart().startsWith("SELECT");
var affectedRows = isSelect ? _RS.getRowCount() : _RS.getNumRowsAffected();
SQL.FOUND = affectedRows != 0;
SQL.NOTFOUND = affectedRows == 0;
SQL.ROWCOUNT = affectedRows;
}
if (opts.row === 2) {
return _ROWS;
}
var INTO = function (opts) {
if (opts.vars == 1 && _RS.getColumnCount() == 1 && _ROWS.next()) {
return _ROWS.getColumnValue(1);
}
if (opts.rec instanceof Object && _ROWS.next()) {
var recordKeys = Object.keys(opts.rec);
Object.assign(opts.rec,Object.fromEntries(new Map(getRow(_ROWS).map((element,Index) => [recordKeys[Index],element]))))
return opts.rec;
}
return fetch(_RS,_ROWS,opts.row);
};
var BULK_INTO_COLLECTION = function (into) {
for(let i = 0;i < _RS.getRowCount();i++) {
FETCH_INTO_COLLECTIONS(into,fetch(_RS,_ROWS,opts.row));
}
return into;
};
if (_ROWS.getRowCount() > 0) {
return _ROWS.getRowCount() == 1 ? INTO(opts) : BULK_INTO_COLLECTION(opts);
}
} catch(error) {
RAISE(error.code,error.name,error.message)
}
};
var RAISE = function (code,name,message) {
message === undefined && ([name,message] = [message,name])
var error = new Error(message);
error.name = name
SQLERRM = `${(SQLCODE = (error.code = code))}: ${message}`
throw error;
};
var FETCH_INTO_COLLECTIONS = function (collections,fetchValues) {
for(let i = 0;i < collections.length;i++) {
collections[i].push(fetchValues[i]);
}
};
var IS_NULL = (arg) => !(arg || arg === 0);
var CURSOR = function (stmt,binds,isRefCursor,isOut) {
var statementObj, result_set, total_rows, ISOPEN = false, result_set_table = '', self = this, row_count, found;
this.CURRENT = new Object;
this.INTO = function () {
return self.res;
};
this.OPEN = function (openParameters) {
if (ISOPEN && !isRefCursor) RAISE(-6511,"CURSOR_ALREADY_OPEN","cursor already open");
var finalStmt = openParameters && openParameters.query || stmt;
var parameters = openParameters && openParameters.binds || [];
var finalBinds = binds instanceof Function ? binds(...parameters) : binds;
finalBinds = finalBinds || parameters;
try {
if (isOut) {
if (!temptable_prefix) {
temptable_prefix = `${procname}_TEMP_${(EXEC(`select current_session() || '_' || to_varchar(current_timestamp, 'yyyymmddhh24missss')`,{
sql : 0
}))[0]}_`;
}
if (!result_set_table) {
result_set_table = temptable_prefix + outCursorResultNumber++;
EXEC(`CREATE OR REPLACE TEMPORARY TABLE ${result_set_table} AS ${finalStmt}`,{
sql : 0
});
}
finalStmt = "SELECT * FROM " + result_set_table
}
[result_set,statementObj,total_rows] = [EXEC(finalStmt,finalBinds,{
sql : 0,
row : 2
}),_RS,_RS.getColumnCount()]
ISOPEN = true;
row_count = 0;
} catch(error) {
RAISE(error.code,"error",error.message);
}
return this;
};
this.NEXT = function () {
if (total_rows && result_set.next()) {
this.CURRENT = new Object;
for(let i = 1;i <= statementObj.getColumnCount();i++) {
(this.CURRENT)[statementObj.getColumnName(i)] = result_set.getColumnValue(i);
}
return true;
} else return false;
};
this.FETCH = function (record) {
var recordKeys = record ? Object.keys(record) : undefined;
self.res = [];
if (!ISOPEN) RAISE(-1001,"INVALID_CURSOR","invalid cursor");
if (recordKeys && recordKeys.length != statementObj.getColumnCount()) RAISE(-6504,"ROWTYPE_MISMATCH","Return types of Result Set variables or query do not match");
self.res = fetch(statementObj,result_set);
if (self.res && self.res.length > 0) {
found = true;
row_count++;
if (recordKeys) {
for(let i = 0;i < self.res.length;i++) {
record[recordKeys[i]] = (self.res)[i];
}
return false;
}
return true;
} else found = false;
return false;
};
this.CLOSE = function () {
if (!ISOPEN) RAISE(-1001,"INVALID_CURSOR","invalid cursor");
found = row_count = result_set_table = total_rows = result_set = statementObj = undefined;
ISOPEN = false;
};
this.FETCH_BULK_COLLECT_INTO = function (variables,limit) {
if (variables.length != statementObj.getColumnCount()) RAISE(-6504,"ROWTYPE_MISMATCH","Return types of Result Set variables or query do not match");
if (limit) {
for(let i = 0;i < limit && this.FETCH();i++)FETCH_INTO_COLLECTIONS(variables,self.res);
} else {
while ( this.FETCH() )
FETCH_INTO_COLLECTIONS(variables,self.res);
}
};
this.FOUND = () => ISOPEN ? typeof(found) == "boolean" ? found : null : RAISE(-1001,"INVALID_CURSOR","invalid cursor");
this.NOTFOUND = () => ISOPEN ? typeof(found) == "boolean" ? !found : null : RAISE(-1001,"INVALID_CURSOR","invalid cursor");
this.ROWCOUNT = () => ISOPEN ? row_count : RAISE(-1001,"INVALID_CURSOR","invalid cursor");
this.ISOPEN = () => ISOPEN;
this.SAVE_STATE = function () {
return {
tempTable : result_set_table,
position : row_count
};
};
this.RESTORE_STATE = function (tempTable,position) {
result_set_table = tempTable
if (result_set_table) {
isOut = true
this.OPEN();
for(let i = 0;i < position;i++)this.FETCH();
}
};
this.ROWTYPE = () => ROWTYPE(stmt,binds());
};
var outCursorResultNumber = 0;
var concatValue = (arg) => IS_NULL(arg) ? "" : arg;
// END REGION
let LOCALVAR1;
let COUNTROWS;
let TEMPSQL;
let TEMPRESULT;
let MYCURSOR = new CURSOR(`SELECT COL1 FROM
Table1`,() => []);
LOCALVAR1 = PARAM1;
COUNTROWS = 0;
TEMPSQL = `SELECT COUNT(*) FROM
Table1
WHERE COL1 =${concatValue(LOCALVAR1)}`;
MYCURSOR.OPEN();
while ( MYCURSOR.NEXT() ) {
let MYCURSORITEM = MYCURSOR.CURRENT;
LOCALVAR1 = MYCURSORITEM.COL1;
COUNTROWS = COUNTROWS + 1;
}
MYCURSOR.CLOSE();
EXEC(`INSERT INTO Table2
VALUES(?, 'ForCursor: Total Row count is: ' || NVL(? :: STRING, ''))`,[COUNTROWS,COUNTROWS]);
COUNTROWS = 0;
MYCURSOR.OPEN();
while ( true ) {
MYCURSOR.FETCH(TEMPRESULT) && ([TEMPRESULT] = MYCURSOR.INTO());
if (MYCURSOR.NOTFOUND()) {
break;
}
COUNTROWS = COUNTROWS + 1;
}
MYCURSOR.CLOSE();
EXEC(`INSERT INTO Table2
VALUES(?, 'LOOP: Total Row count is: ' || NVL(? :: STRING, ''))`,[COUNTROWS,COUNTROWS]);
[TEMPRESULT] = EXEC(TEMPSQL);
if (TEMPRESULT > 0) {
// ** SSC-EWI-0022 - ONE OR MORE IDENTIFIERS IN THIS STATEMENT WERE CONSIDERED PARAMETERS BY DEFAULT. REFERENCED TABLE NOT FOUND. **
EXEC(`INSERT INTO Table2(COL1, COL2) VALUES(?, 'Hi, found value:' || NVL(? :: STRING, '') || ' in Table1 -- There are ' || NVL(? :: STRING, '') || ' rows')`,[TEMPRESULT,LOCALVAR1,TEMPRESULT]);
EXEC(`--** SSC-FDM-OR0012 - COMMIT REQUIRES THE APPROPRIATE SETUP TO WORK AS INTENDED **
COMMIT;`);
}
$$;
Appel de procédures à l’intérieur d’une autre procédure¶
Oracle
CREATE OR REPLACE PROCEDURE PROCEDURE01(param1 NUMBER, param2 VARCHAR)
IS
BEGIN
INSERT INTO TABLE1 VALUES(param1, param2);
END;
CREATE OR REPLACE PROCEDURE PROCEDURE02(param1 NUMBER, param2 VARCHAR)
IS
BEGIN
PROCEDURE01(param1, param2);
END;
Snowflake
CREATE OR REPLACE PROCEDURE PROCEDURE01 (param1 FLOAT, param2 STRING)
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
// SnowConvert Helpers Code section is omitted.
EXEC(`INSERT INTO TABLE1
VALUES(?, ?)`,[PARAM1,PARAM2]);
$$;
CREATE OR REPLACE PROCEDURE PROCEDURE02 (param1 FLOAT, param2 STRING)
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
// SnowConvert Helpers Code section is omitted.
EXEC(`CALL
PROCEDURE01(?, ?)`,[PARAM1,PARAM2]);
$$;
Problèmes connus ¶
Aucun problème n’a été constaté.
EWIs connexes ¶
SSC-EWI-0022 : Un ou plusieurs identificateurs dans cette instruction ont été considérés comme des paramètres par défaut.
SSC-FDM-OR0012 : Les instructions COMMIT et ROLLBACK nécessitent une configuration adéquate pour fonctionner comme prévu.
Éléments de langue SQL¶
Note
Certaines parties du code de sortie sont omises pour des raisons de clarté.
Curseur FOR LOOP¶
Note
Vous pourriez également être intéressé par Assistant de curseur et Déclaration de curseur.
Oracle
CREATE OR REPLACE PROCEDURE PROC1
IS
MyVariable1 NUMBER;
MyOtherVariable2 NUMBER := 1;
CURSOR C1 IS
SELECT * FROM Table1 WHERE ID = 123;
CURSOR C2 (paramCursor1 NUMBER) IS
SELECT COL1 AS C_1 FROM TABLE1 WHERE ID = paramCursor1;
BEGIN
FOR myCursorRecord IN C1
LOOP
MyVariable1 := myCursorRecord.Col1;
END LOOP;
FOR myCursorRecord IN (SELECT * FROM Table1 WHERE ID = MyVariable1)
LOOP
MyVariable1 := myCursorRecord.Col1;
END LOOP;
<<Block1>>
FOR myCursorRecord IN C2 (MyOtherVariable2)
LOOP
MyVariable1 := myCursorRecord.Col1;
END LOOP Block1;
END;
Snowflake
Note
Code des assistants SnowConvert supprimé de l’exemple. Vous pouvez les trouver ici
CREATE OR REPLACE PROCEDURE PROC1 ()
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
// SnowConvert 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 MYCURSORRECORD = C2.CURRENT;
MYVARIABLE1 = MYCURSORRECORD.COL1;
}
C2.CLOSE();
$$;
Instruction OPEN, FETCH et CLOSE¶
Note
Vous pourriez également être intéressé par Assistant de curseur et Déclaration de curseur.
Oracle
CREATE OR REPLACE PROCEDURE PROC2
IS
col1Value table1.COL1%TYPE;
col2Value table1.COL2%TYPE;
entireRow table1%ROWTYPE;
TYPE MyRowType IS RECORD ( COLUMN1 NUMBER, COLUMN2 NUMBER);
entireRow_1 MyRowType;
CURSOR C1 IS SELECT * FROM table1;
C2 SYS_REFCURSOR;
TYPE COLLECTION_TYPE IS TABLE OF TABLE1.COL1%TYPE;
MY_COLLECTION MY_COLLECTION_TYPE := MY_COLLECTION_TYPE();
SOME_SELECT VARCHAR(200);
BEGIN
OPEN C1;
FETCH C1 INTO col1Value, col2Value;
CLOSE C1;
OPEN C1;
FETCH C1 INTO entireRow;
CLOSE C1;
OPEN C1;
FETCH C1 INTO entireRow_1;
CLOSE C1;
OPEN C2 FOR 'SELECT COL1 FROM TABLE1 WHERE COL1 <> :v' USING 123;
FETCH C2 BULK COLLECT INTO MY_COLLECTION LIMIT 2;
CLOSE C2;
OPEN C2 FOR SELECT * FROM TABLE1 WHERE COL1 = NUM1;
CLOSE C2;
END;
Snowflake
Note
Code des assistants SnowConvert supprimé de l’exemple. Vous pouvez les trouver ici
CREATE OR REPLACE PROCEDURE PROC2 ()
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "oracle", "convertedOn": "12/16/2024", "domain": "test" }}'
EXECUTE AS CALLER
AS
$$
// SnowConvert Helpers Code section is omitted.
let COL1VALUE;
let COL2VALUE;
let ENTIREROW = ROWTYPE(`table1`);
class MYROWTYPE {
COLUMN1
COLUMN2
constructor() {
[...arguments].map((element,Index) => this[(Object.keys(this))[Index]] = element)
}
}
let ENTIREROW_1 = new MYROWTYPE();
let C1 = new CURSOR(`SELECT * FROM
table1`,() => []);
let C2 = new CURSOR(undefined,undefined,true);
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0072 - PROCEDURAL MEMBER TYPE DEFINITION NOT SUPPORTED. ***/!!!
/* TYPE COLLECTION_TYPE IS TABLE OF TABLE1.COL1%TYPE */
;
let MY_COLLECTION = new MY_COLLECTION_TYPE();
let SOME_SELECT;
C1.OPEN();
C1.FETCH(COL1VALUE,COL2VALUE) && ([COL1VALUE,COL2VALUE] = C1.INTO());
C1.CLOSE();
C1.OPEN();
C1.FETCH(ENTIREROW) && ([ENTIREROW] = C1.INTO());
C1.CLOSE();
C1.OPEN();
C1.FETCH(ENTIREROW_1) && ([ENTIREROW_1] = C1.INTO());
C1.CLOSE();
C2.OPEN({
query : `SELECT COL1 FROM
TABLE1
WHERE COL1 <> ?`,
binds : [123]
});
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0104 - UNUSABLE VARIABLE, ITS TYPE WAS NOT TRANSFORMED ***/!!!
/* FETCH C2 BULK COLLECT INTO MY_COLLECTION LIMIT 2 */
;
C2.CLOSE();
C2.OPEN({
query : `SELECT * FROM
TABLE1
WHERE COL1 = NUM1`
});
C2.CLOSE();
$$;
Avertissement
La transformation pour les lignes suivantes correspond à des types personnalisés qui sont en cours d’élaboration :
entireRow table1%ROWTYPE; // ROW TYPES
TYPE COLLECTION_TYPE IS TABLE OF TABLE1.COL1%TYPE; // COLLECTIONS
Actuellement, l’instruction suivante est émise mais la classe n’est pas encore créée. Un avertissement sera appliqué à l’avenir à toutes les utilisations de types personnalisés non pris en charge.
let MY_COLLECTION = new MY_COLLECTION_TYPE();
Curseur implicite SQL¶
Oracle
CREATE OR REPLACE PROCEDURE SP_IMPLICIT_CURSOR_SAMPLE AUTHID DEFINER IS
VAR_AUX NUMBER(3);
STMT_STAT1 NUMBER(3):= 0;
STMT_STAT2 NUMBER(3):= 0;
STMT_STAT3 NUMBER(3):= 0;
BEGIN
EXECUTE IMMEDIATE 'CREATE TABLE FTABLE35(COL1 NUMBER(3))';
IF SQL%FOUND THEN
STMT_STAT1 := 1;
END IF;
IF SQL%NOTFOUND THEN
STMT_STAT2 := 1;
END IF;
IF SQL%ISOPEN THEN
STMT_STAT3 := 1;
END IF;
EXECUTE IMMEDIATE 'INSERT INTO FTABLE33 VALUES(:D1,:D2,:D3,:D4)' USING SQL%ROWCOUNT, STMT_STAT1, STMT_STAT2, STMT_STAT3;
END;
Snowflake
Note
Code des assistants SnowConvert supprimé de l’exemple. Vous pouvez les trouver ici
CREATE OR REPLACE PROCEDURE SP_IMPLICIT_CURSOR_SAMPLE ()
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "oracle", "convertedOn": "12/16/2024", "domain": "test" }}'
EXECUTE AS CALLER
AS
$$
!!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'PlInvokerRightsClause' NODE ***/!!!
//AUTHID DEFINER
null
// SnowConvert Helpers Code section is omitted.
let VAR_AUX;
let STMT_STAT1 = 0;
let STMT_STAT2 = 0;
let STMT_STAT3 = 0;
EXEC(`CREATE OR REPLACE TABLE FTABLE35 (COL1 NUMBER(3)
)`);
if (SQL.FOUND) {
STMT_STAT1 = 1;
}
if (SQL.NOTFOUND) {
STMT_STAT2 = 1;
}
if (SQL.ISOPEN) {
STMT_STAT3 = 1;
}
EXEC(`INSERT INTO FTABLE33
VALUES(?, ?, ?, ?)`,[SQL.ROWCOUNT /*** SSC-FDM-OR0009 - SQL IMPLICIT CURSOR VALUES MAY DIFFER ***/,STMT_STAT1,STMT_STAT2,STMT_STAT3]);
$$;
EXIT¶
Avertissement
La transformation des étiquettes est un travail en cours.
Oracle
CREATE OR REPLACE PROCEDURE 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;
END LOOP loop_c;
EXIT loop_b WHEN (j > 3);
END LOOP loop_b;
EXIT loop_a WHEN (i > 3);
END LOOP loop_a;
END;
Snowflake
Note
Code des assistants SnowConvert supprimé de l’exemple. Vous pouvez les trouver ici
CREATE OR REPLACE PROCEDURE PROCEDURE1 ()
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "oracle", "convertedOn": "12/16/2024", "domain": "test" }}'
EXECUTE AS CALLER
AS
$$
// SnowConvert Helpers Code section is omitted.
let I = 0;
let J = 0;
let K = 0;
while ( true ) {
I = I + 1;
while ( true ) {
J = J + 1;
while ( true ) {
K = K + J + I;
break;
}
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0075 - LABELS IN STATEMENTS ARE NOT SUPPORTED. ***/!!!
/*
EXIT loop_b WHEN (j > 3) */
;
}
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0075 - LABELS IN STATEMENTS ARE NOT SUPPORTED. ***/!!!
/*
EXIT loop_a WHEN (i > 3) */
;
}
$$;
Execute Immediate¶
Note
Vous pourriez également être intéressé par Assistant EXEC
Oracle
CREATE OR REPLACE PROCEDURE 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 IS TABLE OF NUMBER;
sals NumList;
BEGIN
EXECUTE IMMEDIATE 'CREATE TABLE dept (id NUMBER, name varchar(14), location varchar2(13))';
sql_stmt := 'INSERT INTO dept VALUES (:1, :2, :3)';
EXECUTE IMMEDIATE sql_stmt USING dept_id, dept_name, location;
sql_stmt := 'SELECT * FROM dept WHERE id = :idd';
EXECUTE IMMEDIATE sql_stmt INTO dept_rec USING dept_id;
sql_stmt := 'UPDATE dept SET id = 200 WHERE id = :1 RETURNING name INTO :2';
EXECUTE IMMEDIATE sql_stmt USING dept_id RETURNING INTO dept_id_upd;
sql_stmt := 'delete from dept where id = :1 RETURNING name INTO :2';
EXECUTE IMMEDIATE sql_stmt USING dept_id RETURNING INTO dept_id_upd;
EXECUTE IMMEDIATE 'INSERT INTO dept VALUES (12, ''NAME1'', ''TEXAS'')';
EXECUTE IMMEDIATE 'INSERT INTO DEPT VALUES(13, ''' || dept_name || ''', ''LA'')';
EXECUTE IMMEDIATE 'DELETE FROM dept WHERE id = :num' USING dept_id2;
EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_DATE_FORMAT = ''DD-MM-YYYY''';
EXECUTE IMMEDIATE 'SELECT id FROM dept' BULK COLLECT INTO sals;
END;
Snowflake
Note
Code des assistants SnowConvert supprimé de l’exemple. Vous pouvez les trouver ici
CREATE OR REPLACE PROCEDURE sp_sample5 ()
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "oracle", "convertedOn": "12/16/2024", "domain": "test" }}'
EXECUTE AS CALLER
AS
$$
// SnowConvert 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 */
;
$$;
Avertissement
La clause « RETURNING INTO » nécessitant une analyse particulière de l’instruction exécutée, sa traduction est planifiée pour l’avenir.
Avertissement
La transformation pour la ligne suivante correspond aux types de collection, ce qui est en cours :
TYPE NumList IS TABLE OF NUMBER;
Actuellement, l’instruction suivante est émise mais la classe n’est pas encore créée. Un avertissement sera appliqué à l’avenir à toutes les utilisations de types personnalisés non pris en charge.
let SALS = new NUMLIST();
EXECUTE IMMEDIATE
ci-dessous, lié à la variable BULK COLLECT
dans la variable sals
, est également en cours d’élaboration.
EXECUTE IMMEDIATE 'SELECT id FROM dept' BULK COLLECT INTO sals;
Erreurs et gestion des exceptions¶
Note
Vous pourriez également être intéressé par Assistant Raise
Utilisation de l’assistant Raise¶
Oracle
CREATE OR REPLACE PROCEDURE HANDLERS_WITH_OTHERS_COMMENTS AUTHID DEFINER IS
deadlock_detected EXCEPTION;
deadlock_dex EXCEPTION;
PRAGMA EXCEPTION_INIT(deadlock_detected, -60);
PRAGMA EXCEPTION_INIT(deadlock_dex, -63);
BEGIN
IF true THEN
RAISE NO_DATA_FOUND;
END IF;
IF TRUE THEN
RAISE_APPLICATION_ERROR(-20010, SQLERRM);
END IF;
IF TRUE THEN
RAISE_APPLICATION_ERROR(-20000, SQLERRM, PARM);
END IF;
IF TRUE THEN
RAISE_APPLICATION_ERROR(-20000, SQLERRM, TRUE);
END IF;
IF TRUE THEN
RAISE_APPLICATION_ERROR(-20000, SQLERRM, FALSE);
END IF;
IF TRUE THEN
RAISE_APPLICATION_ERROR(-20000, 'CUSTOM ERROR MESSAGE', TRUE);
END IF;
IF TRUE THEN
RAISE_APPLICATION_ERROR(-20010, 'SECOND CUSTOM ERROR MESSAGE', TRUE);
END IF;
IF TRUE THEN
RAISE_APPLICATION_ERROR(-20010, 'OTHER CUSTOM ERROR MESSAGE', FALSE);
END IF;
EXCEPTION
WHEN EXC_NAME THEN
--Handle Exc_name found exception
null;
WHEN NO_DATA_FOUND THEN
--Handle No data found exception
null;
WHEN OTHERS THEN
--Handler for others exception
null;
END;
Snowflake
Note
Code des assistants SnowConvert supprimé de l’exemple. Vous pouvez les trouver ici
CREATE OR REPLACE PROCEDURE HANDLERS_WITH_OTHERS_COMMENTS ()
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "oracle", "convertedOn": "12/16/2024", "domain": "test" }}'
EXECUTE AS CALLER
AS
$$
!!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'PlInvokerRightsClause' NODE ***/!!!
//AUTHID DEFINER
null
// SnowConvert 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;
}
}
}
$$;
Lorsqu’il n’y a pas de gestionnaire OTHERS, SnowConvert utilise le cas « par défaut » dans le commutateur qui lance l’objet d’erreur d’origine.
Commit¶
Note
Vous pourriez également être intéressé par Assistant EXEC
Oracle
CREATE OR REPLACE PROCEDURE PROC1 (param1 NUMBER, param2 NUMBER)
IS
BEGIN
INSERT INTO TABLE1 VALUES(param1, param2);
COMMIT;
END;
Snowflake
Note
Code des assistants SnowConvert supprimé de l’exemple. Vous pouvez les trouver ici
CREATE OR REPLACE PROCEDURE PROC1 (param1 FLOAT, param2 FLOAT)
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
// SnowConvert 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;`);
$$;
CASE¶
Oracle
CREATE OR REPLACE EDITIONABLE PROCEDURE PROCEDURE2 ()
IS
localVar1 NUMBER;
localVar2 VARCHAR(100);
BEGIN
CASE (localVar1)
WHEN 1 THEN
localVar2 := 'one';
WHEN 2 THEN
localVar := 'two';
WHEN 3 THEN
lovalVar := 'three';
ELSE
localVar := 'error';
END CASE;
CASE
WHEN localVar = 1 THEN
localVar2 := 'one';
WHEN localVar = 2 THEN
localVar := 'two';
WHEN localVar = 3 THEN
lovalVar := 'three';
ELSE
localVar := 'error';
END CASE;
END;
Snowflake
Note
Code des assistants SnowConvert supprimé de l’exemple. Vous pouvez les trouver ici
--** SSC-FDM-OR0007 - SNOWFLAKE DOESN'T SUPPORT VERSIONING OF OBJECTS. DEVELOPERS SHOULD CONSIDER ALTERNATE APPROACHES FOR CODE VERSIONING. **
CREATE OR REPLACE PROCEDURE PROCEDURE2 ()
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
// SnowConvert 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`;
}
$$;
CASE dans une affectation de variable¶
Oracle
CREATE OR REPLACE EDITIONABLE PROCEDURE PROCEDURE2 ()
IS
localVar1 NUMBER;
BEGIN
var1 := CASE flag
WHEN 1 THEN 'one'
WHEN 2 THEN 'two'
WHEN 3 THEN 'three'
WHEN 4 THEN 'four'
ELSE 'unknown' END;
END;
Snowflake
Note
Code des assistants SnowConvert supprimé de l’exemple. Vous pouvez les trouver ici
--** SSC-FDM-OR0007 - SNOWFLAKE DOESN'T SUPPORT VERSIONING OF OBJECTS. DEVELOPERS SHOULD CONSIDER ALTERNATE APPROACHES FOR CODE VERSIONING. **
CREATE OR REPLACE PROCEDURE PROCEDURE2 ()
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
// SnowConvert 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`)));
$$;
Appel à des programmes C ou Java externes¶
Oracle
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)';
Snowflake
----** 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)'
;
Problèmes connus¶
Aucun problème n’a été constaté.
EWIs connexes¶
SSC-EWI-0022 : Un ou plusieurs identificateurs dans une instruction spécifique sont considérés comme des paramètres par défaut.
SSC-EWI-0053 : L’objet peut ne pas fonctionner.
SSC-EWI-0073 : En attente de l’examen de l’équivalence fonctionnelle.
SSC-EWI-OR0052 : La déclaration d’exception est gérée par la fonction raise.
SSC-EWI-OR0072 : Membre de procédure non pris en charge.
SSC-EWI-OR0075 : La clause Current of n’est pas pris en charge dans Snowflake.
SSC-EWI-OR0104 : Variable de collection inutilisable.
SSC-FDM-OR0007 : Snowflake ne prend pas en charge le versionnage des objets. Les développeurs devraient envisager d’autres approches pour le versionnage du code.
SSC-FDM-OR0009 : SQL IMPLICIT CURSOR VALUES MAY DIFFER.
SSC-FDM-OR0011 : L’argument booléen a été supprimé car l’option « add to stack » n’est pas prise en charge.
SSC-FDM-OR0012: Les instructions COMMIT et ROLLBACK exigent une configuration adéquate pour fonctionner comme prévu.
Instructions DDL - DML¶
Note
Certaines parties du code de sortie sont omises pour des raisons de clarté.
Note
Toutes les instructions utilisent l’Assistant EXEC
SELECT¶
Oracle
CREATE OR REPLACE PROCEDURE PROC1 (param1 VARCHAR)
IS
VAR1 NUMBER := 789;
BEGIN
SELECT * FROM TABLE01;
SELECT DISTINCT COL1 FROM TABLE01;
SELECT * FROM TABLE01 WHERE COL1 = VAR1;
SELECT * FROM TABLE01 WHERE COL1 = PARAM1;
SELECT * FROM TABLE01 WHERE COL1 = PARAM1 AND COL2 = VAR1;
END;
Snowflake
Note
Code des assistants SnowConvert supprimé de l’exemple. Vous pouvez les trouver ici
CREATE OR REPLACE PROCEDURE PROC1 (param1 STRING)
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
// SnowConvert 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]);
$$;
SELECT INTO¶
Oracle
CREATE OR REPLACE PROCEDURE PROC1 (param1 VARCHAR, param2 VARCHAR)
IS
VAR1 NUMBER;
VAR2 NUMBER;
BEGIN
SELECT 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
Snowflake
Note
Code des assistants SnowConvert supprimé de l’exemple. Vous pouvez les trouver ici
CREATE OR REPLACE PROCEDURE PROC1 (param1 STRING, param2 STRING)
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
// SnowConvert 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]);
$$;
INSERT et INSERT INTOSELECT¶
Oracle
CREATE OR REPLACE PROCEDURE PROC1 (param1 VARCHAR)
IS
var1 NUMBER := 789;
BEGIN
INSERT INTO TABLE01 VALUES('name', 123);
INSERT INTO TABLE01 VALUES(param1, 456);
INSERT INTO TABLE01 VALUES(param1, var1);
INSERT INTO TABLE01 (col1, col2)
SELECT col1, col2 FROM TABLE02 tb2
WHERE tb2.col1 = 'myName';
END;
Snowflake
Note
Code des assistants SnowConvert supprimé de l’exemple. Vous pouvez les trouver ici
CREATE OR REPLACE PROCEDURE PROC1 (param1 STRING)
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
// SnowConvert Helpers Code section is omitted.
let VAR1 = 789;
EXEC(`INSERT INTO TABLE01
VALUES('name', 123)`);
EXEC(`INSERT INTO TABLE01
VALUES(?, 456)`,[PARAM1]);
EXEC(`INSERT INTO TABLE01
VALUES(?, ?)`,[PARAM1,VAR1]);
EXEC(`INSERT INTO TABLE01(col1, col2)
SELECT col1, col2 FROM
TABLE02 tb2
WHERE tb2.col1 = 'myName'`);
$$;
DELETE¶
Oracle
CREATE OR REPLACE PROCEDURE PROC1 (PARAM1 VARCHAR)
IS
VAR1 NUMBER := 0;
BEGIN
DELETE FROM TABLE1 WHERE COL2 = 1;
DELETE FROM TABLE1 WHERE COL2 = VAR1;
DELETE FROM TABLE1 WHERE COL1 = PARAM1;
END;
Snowflake
Note
Code des assistants SnowConvert supprimé de l’exemple. Vous pouvez les trouver ici
CREATE OR REPLACE PROCEDURE PROC1 (PARAM1 STRING)
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
// SnowConvert 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]);
$$;
UPDATE¶
Oracle
CREATE OR REPLACE PROCEDURE PROC1(PARAM1 VARCHAR)
IS
VAR1 NUMBER := 3;
BEGIN
UPDATE TABLE1 SET COL2 = 1 where COL2 = 0;
UPDATE TABLE1 SET COL1 = VAR1 where COL1 = 0;
UPDATE TABLE1 SET COL1 = 'name' where COL1 = PARAM11;
UPDATE TABLE1 SET COL2 = VAR1 where COL1 = PARAM1;
END;
Snowflake
Note
Code des assistants SnowConvert supprimé de l’exemple. Vous pouvez les trouver ici
CREATE OR REPLACE PROCEDURE PROC1 (PARAM1 STRING)
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
// SnowConvert 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]);
$$;
MERGE¶
Oracle
CREATE OR REPLACE PROCEDURE PROC1
IS
BEGIN
MERGE INTO TABLE01 t01
USING TABLE02 t02
ON (t01.col2 = t02.col2)
WHEN MATCHED THEN
UPDATE SET t01.col1 = t02.col2;
END;
Snowflake
Note
Code des assistants SnowConvert supprimé de l’exemple. Vous pouvez les trouver ici
CREATE OR REPLACE PROCEDURE PROC1 ()
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
// SnowConvert 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`);
$$;
Problèmes connus ¶
Aucun problème n’a été constaté.
EWIs connexes ¶
Pas d’EWIs connexes.
SSC-EWI-0022 : Un ou plusieurs identificateurs dans une instruction spécifique sont considérés comme des paramètres par défaut.
Synonymes¶
Note
Pour plus d’informations, consultez la référence de traduction Synonyme.
Les synonymes utilisés dans les blocs PL/SQL sont remplacés par l’objet référencé et le schéma est ajouté si nécessaire.
Schéma implicite ajouté¶
Lorsque la procédure ou la fonction se trouve à l’intérieur d’un schéma et que le synonyme se trouve à l’intérieur de ce schéma, mais qu’il est utilisé sans le schéma, le code converti ajoutera le schéma.
Oracle¶
CREATE TABLE schema_one.TABLE_TEST1(
COL1 INTEGER,
COL2 DATE DEFAULT SYSDATE
);
CREATE OR REPLACE SYNONYM schema_one.MY_SYNONYM1 FOR schema_one.TABLE_TEST1;
create or replace procedure schema_one.procedure1 as
returnval integer;
begin
select col1 into returnval from my_synonym1;
end;
Snowflake¶
CREATE OR REPLACE TABLE schema_one.TABLE_TEST1 (
COL1 INTEGER,
COL2 TIMESTAMP /*** SSC-FDM-OR0042 - DATE TYPE COLUMN HAS A DIFFERENT BEHAVIOR IN SNOWFLAKE. ***/ DEFAULT CURRENT_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
;
CREATE OR REPLACE PROCEDURE schema_one.procedure1 ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
DECLARE
returnval integer;
BEGIN
select col1 into
:returnval
from
schema_one.TABLE_TEST1;
END;
$$;
Schéma de l’objet référencé ajouté¶
Lorsque le synonyme fait référence à un objet qui se trouve dans un schéma spécifique, le nom du schéma sera ajouté à l’objet référencé.
Oracle¶
CREATE OR REPLACE SYNONYM MY_SYNONYM2 FOR schema_one.TABLE_TEST1;
create or replace procedure procedure2 as
returnval integer;
begin
select col1 into returnval from my_synonym2;
end;
Snowflake¶
----** 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
;
CREATE OR REPLACE PROCEDURE procedure2 ()
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
// SnowConvert Helpers Code section is omitted.
let RETURNVAL;
[RETURNVAL] = EXEC(`SELECT
col1
from
schema_one.TABLE_TEST1`);
$$;
EWIs connexes¶
SSC-FDM-OR0005 : Les synonymes ne sont pas pris en charge dans Snowflake mais les références à ce synonyme ont été modifiées par le nom de l’objet original.
SSC-FDM-OR0042 : Le type de date transformé en horodatage a un comportement différent.
Déclencheurs¶
Les déclencheurs ne sont pas pris en charge par Snowflake, ils ne seront donc pas migrés automatiquement.
Pour l’instant, Snowflake ne fournit pas de mécanisme direct pour les déclencheurs, mais certaines fonctions de Snowflake peuvent être utilisées pour obtenir des résultats similaires.
Nous vous recommandons de procéder à une analyse de vos déclencheurs et de les classer par objectif :
Déclencheurs d’audit : L’objectif de ces déclencheurs est de capturer des informations et d’enregistrer les modifications apportées à certaines tables dans d’autres tables.
Déclencheurs d’initialisation : L’objectif de ces déclencheurs est d’ajouter des valeurs par défaut aux nouveaux enregistrements. Ils se situent généralement avant ou après les déclencheurs d’insertion
Déclencheurs de barrière de règle métier : ces déclencheurs s’appliquent généralement à BEFORE/AFTER DELETE ou UPDATE. Ces déclencheurs sont destinés à créer une barrière pour éviter l’entrée ou la suppression de données qui enfreindraient certaines règles de gestion.
Déclencheurs Instead of : utilisés par exemple pour permettre des insertions dans les vues ne sont pas pris en charge. La recommandation sera de transformer cette logique en une procédure stockée et d’introduire des appels chaque fois qu’ils ont été utilisés pour des opérations d’insertion/suppression/mise à jour.
Déclencheurs de base de données : ne pouvant être répliqués, il est également recommandé d’encapsuler cette logique dans une procédure stockée. Mais cette logique devra être invoquée manuellement.
Déclencheurs génériques After : pour certains déclencheurs After, les flux et les tâches peuvent être exploités, voir la section ci-dessous.
Déclencheur d’audit
CREATE OR REPLACE TRIGGER SCHEMA.TRIGGER_NAME
BEFORE UPDATE OR INSERT ON SCHEMA.TRIGGER_NAME FOR EACH ROW
BEGIN
:NEW.LAST_UPDATE := SYSDATE;
END;
Déclencheurs Before UPDATE pour les cas d’audit comme celui-ci ne peuvent pas être traités directement. Pour le cas INSERT, vous pouvez utiliser la valeur par défaut expliquée pour le déclencheur d’initialisation. Toutefois, dans le cas de la mise à jour, la seule option consiste à utiliser une tâche, comme cela est expliqué plus loin pour les déclencheurs AFTER. Cependant, l’adresse LAST_UPDATE ne sera pas exacte, il y aura un décalage car la modification enregistrée se fera au moment de l’exécution de la tâche (par exemple, si les tâches s’exécutent toutes les 5 minutes, LAST_UPDATE sera enregistrée 5 minutes plus tard)_.
Pour les cas UPDATE, il n’est pas possible d’essayer de capturer CURRENT_USER.
D’autres cas de déclencheurs AUDIT se présentent lorsqu’ils enregistrent les modifications d’une table dans une table de mise à jour. La technique du déclencheur AFTER décrite plus loin peut être utilisée, mais là encore, les informations USER ne peuvent pas être suivies et les informations TIME ne seront pas exactes.
Déclencheur d’initialisation
CREATE OR REPLACE TRIGGER SCHEMA.TRIGGER_NAME
BEFORE INSERT ON SCHEMA.TABLE1 FOR EACH ROW
BEGIN
SELECT SCHEMA.TABLE.NEXTVAL INTO :NEW.COLUMN_SEQ FROM DUAL;
SELECT USER INTO :NEW.UPDATED_BY FROM DUAL;
SELECT SYSTIMESTAMP INTO :NEW.UPDATED_TM FROM DUAL;
END
Pour ces déclencheurs, vous pouvez utiliser les valeurs par défaut des colonnes de Snowflake, par exemple pour les valeurs de séquence.
Vous pouvez également utiliser CURRENT_
_ USER
() et CURRENT_TIMESTAMP
au lieu de USER
ou SYS_TIMESTAMP
_
Cela ne s’applique qu’aux cas BEFORE INSERT ou AFTER INSERT.
Barrière de règle métier
CREATE OR REPLACE EDITIONABLE TRIGGER SCHEMA.TRIGGER_NAME
BEFORE DELETE ON SCHEMA.TABLE FOR EACH ROW
BEGIN
IF (:OLD.termination_date is NULL OR
:OLD.termination_date >= TRUNC(SYSDATE)+1 ) THEN
RAISE_APPLICATION_ERROR(-30001,'An employee must be terminated before deleteing the row');
END IF;
Dans ces cas, vous devrez mettre en ligne les actions de déclencheur après/avant l’exécution de DELETE ou UPDATE.
Une tâche n’est pas recommandée ici car les tâches sont exécutées sur une planification, et la ligne sera alors déjà modifiée.
Cette section présente une solution de contournement connue pour la mise en œuvre partielle des déclencheurs AFTER.
GENERIC AFTER TRIGGER
Exemple 1 : Conversion de base du déclencheur
Oracle
CREATE TRIGGER example_trigger
AFTER INSERT ON table1
SELECT * FROM DUAL;
Snowflake
Note
Code des assistants SnowConvert supprimé de l’exemple. Vous pouvez les trouver ici
----** 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
Explication approfondie du code Snowflake¶
Flux¶
Ces derniers se chargent de stocker les modifications apportées à la table. Veuillez noter :
Ils stockent le décalage entre l’état actuel de la table et le dernier décalage stocké par le flux lui-même. Veuillez en tenir compte pour la facturation.
Notez qu’ils ne stockent pas les informations des mises à jour, mais les stockent plutôt comme une insertion.
De la même manière, ils ne peuvent pas être configurés pour suivre uniquement les suppressions ou uniquement les mises à jour, et doivent donc être filtrés dans la procédure et la tâche elle-même (voir ci-dessous).
Procédures¶
Celles-ci se chargent d’exécuter la ou les instructions du déclencheur SQL. Veuillez noter :
Il est nécessaire de purger le flux, d’où la création d’un nouveau flux à la fin de la procédure.
Toutes les actions qui doivent être filtrées (comme les déclencheurs AFTER-INSERTs uniquement) devront être filtrées dans la procédure stockée elle-même.
Tâches¶
Elles se chargent de vérifier régulièrement les changements de flux et d’exécuter en conséquence la ou les instructions du déclencheur SQL. Veuillez noter :
Les tâches fonctionnent selon une planification, une action ne les déclenche pas. Cela signifie qu’il y aura des contrôles planifiés par déclencheur sans qu’aucune modification des données ne soit effectuée dans la table.
Les tâches ne peuvent pas être configurées pour s’exécuter plus d’une fois toutes les soixante (60) secondes, car la durée minimale est d’une (1) minute.
Une fois que le flux a détecté des changements, il y aura, dans le pire des cas, un délai de soixante (60) secondes entre la détection du changement et l’exécution du déclencheur.
Bien que l’ajout de WHEN évite l’exécution de la tâche, Snowflake ajoute toujours des frais à chaque fois qu’il est évalué ; et ces frais seront ajoutés à la facture lorsque le déclencheur s’exécutera réellement.
La tâche a besoin d’un entrepôt pour être exécutée et devra être définie manuellement par le client.
Problèmes connus ¶
Aucun problème n’a été constaté.
EWIs connexes ¶
Pas d’EWIs connexes.
Attribut TYPE¶
Description¶
Ce chapitre concerne la transformation de l”attribut TYPE lorsqu’il fait référence à une colonne, une variable, un enregistrement, une collection ou un curseur. La transformation consiste à obtenir le type de données de l’élément de référence et à remplacer l’attribut TYPE de l’élément de référence par le type de données obtenu.
Modèles d’échantillons de sources¶
Attribut TYPE pour les colonnes¶
Dans ce cas, l’élément référencé est une colonne d’une table créée précédemment.
Oracle¶
CREATE TABLE table1(
col1 NUMBER
);
CREATE OR REPLACE PROCEDURE procedure1
IS
var1 table1.col1%TYPE;
BEGIN
NULL;
END;
Snowflake¶
CREATE OR REPLACE TABLE 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"}}'
;
CREATE OR REPLACE PROCEDURE procedure1 ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
DECLARE
var1 NUMBER(38, 18);
BEGIN
NULL;
END;
$$;
Note
Vous trouverez de plus amples informations sur le type de données NUMBER dans la section Type de données numériques.
Attribut TYPE pour les variables¶
Dans ce cas, l’élément référencé est une variable déclarée précédemment.
Oracle¶
CREATE OR REPLACE PROCEDURE procedure1
IS
var0 FLOAT;
var1 var0%TYPE;
var2 var1%TYPE;
var3 var2%TYPE;
BEGIN
NULL;
END;
Snowflake¶
CREATE OR REPLACE PROCEDURE procedure1 ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
DECLARE
var0 FLOAT;
var1 FLOAT;
var2 FLOAT;
var3 FLOAT;
BEGIN
NULL;
END;
$$;
Note
Vous trouverez de plus amples informations sur le type de données FLOAT dans la section Type de données FLOAT
Attribut TYPE pour les enregistrements¶
Dans ce cas, l’élément référencé est un enregistrement déclaré précédemment.
Oracle¶
CREATE OR REPLACE PROCEDURE procedure1
IS
TYPE record_typ_def IS RECORD(field1 NUMBER);
record_var record_typ_def;
var1 record_var%TYPE;
var2 record_var.field1%TYPE;
BEGIN
NULL;
END;
Snowflake¶
CREATE OR REPLACE PROCEDURE procedure1 ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
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;
$$;
Dans l’exemple précédent, la variable qui fait référence à la variable d’enregistrement est remplacée par OBJECT
, comme la variable d’enregistrement, et la variable qui fait référence au champ d’enregistrement est remplacée par le type de données du champ d’enregistrement (NUMBER (38, 18)
).
Ces changements ne fonctionnent pas pour les enregistrements intégrés.
Note
Vous trouverez de plus amples informations sur les enregistrements dans la section Collection et enregistrements.
Attribut TYPE pour les collections¶
Dans ce cas, l’élément référencé est une variable de collection, mais comme les collections ne sont pas prises en charge, l’attribut TYPE de l’élément de référence est remplacé par le type de données VARIANT.
Oracle¶
CREATE OR REPLACE PROCEDURE procedure1
IS
TYPE collection_type IS TABLE OF NUMBER;
collection_var collection_type;
var1 collection_var%TYPE;
BEGIN
NULL;
END;
Snowflake¶
CREATE OR REPLACE PROCEDURE procedure1 ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
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;
$$;
Attribut TYPE pour les curseurs¶
Dans ce cas, l’élément référencé est une variable curseur, mais comme les curseurs REF ne sont pas pris en charge, l’attribut de l’élément de référence TYPE est remplacé par le type de données VARIANT.
Oracle¶
CREATE TABLE table1 (col1 NUMBER);
CREATE OR REPLACE PROCEDURE procedure1
IS
TYPE cursor_type IS REF CURSOR RETURN table1%ROWTYPE;
cursor_var cursor_type;
var1 cursor_var%TYPE;
BEGIN
NULL;
END;
Snowflake¶
CREATE OR REPLACE TABLE 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"}}'
;
CREATE OR REPLACE PROCEDURE procedure1 ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
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
Dans les cas où le type de données de l’élément référencé ne peut être obtenu, l’attribut TYPE de l’élément de référence est remplacé par VARIANT
.
Problèmes connus¶
1. Cursors and collections declarations are not supported.¶
Les déclarations de variables de collection et de curseur n’étant pas encore prises en charge, l’attribut de l’élément de référence TYPE est remplacé par VARIANT et un avertissement est ajouté dans ces cas.
2. Original data type could not be obtained.¶
Lorsque le type de données de l’élément référencé n’a pas pu être obtenu, l’attribut TYPE de l’élément de référence est remplacé par VARIANT et un avertissement est ajouté.
connexesEWIS¶
SSC-EWI-0036 : Type de données converti en un autre type de données.
SSC-EWI-0056 : Type de création non pris en charge.
SSC-EWI-0058 : La fonctionnalité n’est pas prise en charge actuellement par Snowflake Scripting.
SSC-EWI-0062 : L’utilisation du type personnalisé a été modifiée en variante.
SSC-EWI-OR0129 : L’instruction ci-dessous utilise des curseurs imbriqués.
SSC-FDM-0006 : La colonne de type nombre peut ne pas se comporter de la même manière dans Snowflake.