PACKAGE VARIABLES can be declared either in the package declaration or in the PACKAGE BODY. Due to its behavior, these variables are converted into Snowflake session variables so each usage or assignment is translated to its equivalent in Snowflake.
CREATE OR REPLACE TABLE table1 (id 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"}}';
Variable declaration
Oracle
IN -> Oracle_02.sql
CREATE OR REPLACE PACKAGE PKG1 AS package_variable NUMBER:=100;END PKG1;
Snowflake Scripting
OUT -> Oracle_02.sql
CREATE SCHEMA IF NOT EXISTS PKG1COMMENT ='{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}';SET "PKG1.PACKAGE_VARIABLE"=''|| (100);
Variable Usage
Package variable usages are transformed into the Snowflake GETVARIABLE function which accesses the current value of a session variable. An explicit cast is added to the original variable data type in order to maintain the functional equivalence in the operations where these variables are used.
Oracle
IN -> Oracle_03.sql
CREATE OR REPLACE PACKAGE PKG1 AS PROCEDURE procedure1; package_variable NUMBER:=100;END PKG1;CREATE OR REPLACE PACKAGE BODY PKG1 AS PROCEDURE procedure1 AS BEGIN INSERT INTO TABLE1(ID) VALUES(package_variable); END;END PKG1;CALL SCHEMA1.PKG1.procedure1();SELECT * FROM TABLE1;
|ID |
|---|
|100|
Snowflake
OUT -> Oracle_03.sql
CREATE SCHEMA IF NOT EXISTS PKG1COMMENT ='{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}';SET "PKG1.PACKAGE_VARIABLE"=''|| (100);CREATE OR REPLACE PROCEDURE PKG1.procedure1 ()RETURNS VARCHARLANGUAGE SQLCOMMENT ='{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'EXECUTE AS CALLERAS$$ BEGIN INSERT INTO TABLE1(ID) VALUES(GETVARIABLE('PKG1.PACKAGE_VARIABLE') :: NUMBER); END;$$;CALL SCHEMA1.PKG1.procedure1();SELECT * FROM TABLE1;
|ID |
|---|
|100|
Note that the PROCEDURE definition in the package is removed since it is not required by Snowflake.
Variable regular assignment
When a package variable is assigned using the := operator, the assignation is replaced by a SnowConvert UDF called UPDATE_PACKAGE_VARIABLE_STATE which is an abstraction of the Snowflake SETVARIABLE function.
Oracle
IN -> Oracle_04.sql
CREATE OR REPLACE PACKAGE PKG1 AS PROCEDURE procedure1; package_variable NUMBER:=100;END PKG1;CREATE OR REPLACE PACKAGE BODY PKG1 AS PROCEDURE procedure1 AS BEGIN package_variable := package_variable +100; INSERT INTO TABLE1(ID) VALUES(package_variable); END;END PKG1;CALL PKG1.procedure1();SELECT * FROM TABLE1;
|ID |
|---|
|200|
Snowflake
OUT -> Oracle_04.sql
CREATE SCHEMA IF NOT EXISTS PKG1COMMENT ='{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}';SET "PKG1.PACKAGE_VARIABLE"=''|| (100);CREATE OR REPLACE PROCEDURE PKG1.procedure1 ()RETURNS VARCHARLANGUAGE SQLCOMMENT ='{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'EXECUTE AS CALLERAS$$ BEGIN CALL UPDATE_PACKAGE_VARIABLE_STATE_UDF('PKG1.PACKAGE_VARIABLE', TO_VARCHAR(GETVARIABLE('PKG1.PACKAGE_VARIABLE') :: NUMBER +100)); INSERT INTO TABLE1(ID) VALUES(GETVARIABLE('PKG1.PACKAGE_VARIABLE') :: NUMBER); END;$$;CALL PKG1.procedure1();SELECT * FROM TABLE1;
|ID |
|---|
|200|
Note that the PROCEDURE definition in the package is removed since it is not required by Snowflake.
Variable assignment as an output argument
When a package variable is used as an output argument a new variable is declared inside the procedure, this variable will catch the output argument value of the procedure, and then the variable will be used to update the session variable which refers to the package variable using the UPDATE_PACKAGE_VARIABLE_STATE mentioned above. For more information check de output parameters transformation.
Oracle
IN -> Oracle_05.sql
CREATE OR REPLACE PACKAGE PKG1 AS PROCEDURE procedure1; PROCEDURE procedure2(out_param OUT NUMBER); package_variable NUMBER:=100;END PKG1;CREATE OR REPLACE PACKAGE BODY PKG1 AS PROCEDURE procedure1 AS BEGIN procedure2(package_variable); INSERT INTO TABLE1(ID) VALUES(package_variable); END; PROCEDURE procedure2 (out_param OUT NUMBER) AS BEGIN out_param :=1000; END;END PKG1;CALL PKG1.procedure1();
|ID |
|----|
|1000|
Snowflake
OUT -> Oracle_05.sql
CREATE SCHEMA IF NOT EXISTS PKG1COMMENT ='{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}';SET "PKG1.PACKAGE_VARIABLE"=''|| (100);CREATE OR REPLACE PROCEDURE PKG1.procedure1 ()RETURNS VARCHARLANGUAGE SQLCOMMENT ='{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'EXECUTE AS CALLERAS$$ DECLARE PKG1_PACKAGE_VARIABLE VARIANT; call_results VARIANT; BEGIN call_results := ( CALL PKG1. procedure2(:PKG1_PACKAGE_VARIABLE) ); PKG1_PACKAGE_VARIABLE := :call_results; CALL UPDATE_PACKAGE_VARIABLE_STATE_UDF('PKG1.PACKAGE_VARIABLE', TO_VARCHAR(:PKG1_PACKAGE_VARIABLE)); INSERT INTO TABLE1(ID) VALUES(GETVARIABLE('PKG1.PACKAGE_VARIABLE') :: NUMBER); END;$$;CREATE OR REPLACE PROCEDURE PKG1.procedure2 (out_param NUMBER(38, 18))RETURNS VARIANTLANGUAGE SQLCOMMENT ='{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'EXECUTE AS CALLERAS$$ BEGIN out_param :=1000; RETURN null; END;$$;CALL PKG1.procedure1();
|ID |
|----|
|1000|
Note that the PROCEDURE definition in the package is removed since it is not required by Snowflake.
Known Issues
No issues were found.
Related EWIs
SSC-FDM-0006: Number type column may not behave similarly in Snowflake.