SnowConvert AI - Oracle - PACKAGES¶
説明¶
CREATEPACKAGEステートメントを使用して、ストアドパッケージの仕様を作成します。ストアドパッケージとは、関連するプロシージャ、関数、その他のプログラムオブジェクトをカプセル化してデータベースに格納したものです。パッケージ仕様では、これらのオブジェクトを宣言しています。続いて指定されるパッケージ本文がこれらのオブジェクトを定義します。(Oracle PL/SQL 言語リファレンス CREATE PACKAGE ステートメント)
SnowflakeにはOracleのパッケージに相当するものがないため、構造を維持するためにパッケージはスキーマに変換され、すべての要素がスキーマ内で定義されます。また、パッケージとその要素は、元のスキーマ名を保持するように名前が変更されます。
BODY¶
説明¶
PACKAGE BODY のヘッダーが削除され、各プロシージャや関数定義がスタンドアロンの関数やプロシージャに変換されます。
CREATE PACKAGE SYNTAX¶
CREATE [ OR REPLACE ]
[ EDITIONABLE | NONEDITIONABLE ]
PACKAGE BODY plsql_package_body_source
サンプルソースパターン¶
注釈
以下のクエリは、 PackagesAsSchema オプションを無効にして変換されました。
Oracle¶
CREATE OR REPLACE PACKAGE BODY SCHEMA1.PKG1 AS
PROCEDURE procedure1 AS
BEGIN
dbms_output.put_line('hello world');
END;
END package1;
Snowflake¶
Snowflake¶
CREATE OR REPLACE PROCEDURE SCHEMA1_PKG1.procedure1 ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
BEGIN
--** SSC-FDM-OR0035 - CHECK UDF IMPLEMENTATION FOR DBMS_OUTPUT.PUT_LINE_UDF. **
CALL DBMS_OUTPUT.PUT_LINE_UDF('hello world');
END;
$$;
既知の問題¶
問題は見つかりませんでした。
定数¶
パッケージ定数の変換仕様
説明¶
PACKAGE CONSTANTS は、パッケージ宣言か PACKAGE BODY のどちらかで宣言できます。プロシージャでパッケージ定数を使用すると、定数と同じ名前と値を持つ新しい変数が宣言されるため、結果のコードは入力とほぼ同じになります。
Oracle定数宣言構文¶
constant CONSTANT datatype [NOT NULL] { := | DEFAULT } expression ;
サンプルソースパターン¶
補助コードのサンプル¶
Oracle¶
create table table1(id number);
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"}}'
;
Oracle¶
CREATE OR REPLACE PACKAGE PKG1 AS
PROCEDURE procedure1;
package_constant CONSTANT NUMBER:= 9999;
END PKG1;
CREATE OR REPLACE PACKAGE BODY PKG1 AS
PROCEDURE procedure1 AS
BEGIN
INSERT INTO TABLE1(ID) VALUES(package_constant);
END;
END PKG1;
CALL PKG1.procedure1();
SELECT * FROM TABLE1;
結果¶
ID |
|---|
9999 |
Snowflake¶
CREATE SCHEMA IF NOT EXISTS PKG1
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
;
CREATE OR REPLACE PROCEDURE PKG1.procedure1 ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
DECLARE
PACKAGE_CONSTANT NUMBER := 9999;
BEGIN
INSERT INTO TABLE1(ID) VALUES(:PACKAGE_CONSTANT);
END;
$$;
CALL PKG1.procedure1();
SELECT * FROM
TABLE1;
結果¶
ID |
|---|
9999 |
注釈
なお、 PROCEDURE の定義はSnowflakeでは必要ないため、削除されます。
既知の問題¶
問題は見つかりませんでした。
関連 EWIs¶
SSC-FDM-0006:数値型の列はSnowflakeでは同様の動作をしない場合があります。
DECLARATION¶
説明¶
宣言はスキーマに変換されるので、各内部要素はこのスキーマの中で宣言されます。パッケージ内に存在するすべての要素は、適切な変換を持つ VARIABLES を除いてコメントされています。
CREATE PACKAGE SYNTAX¶
CREATE [ OR REPLACE ]
[ EDITIONABLE | NONEDITIONABLE ]
PACKAGE plsql_package_source
サンプルソースパターン¶
注釈
以下のクエリは、 PackagesAsSchema オプションを無効にして変換されました。
Oracle¶
CREATE OR REPLACE PACKAGE SCHEMA1.PKG1 AS
-- Function Declaration
FUNCTION function_declaration(param1 VARCHAR) RETURN INTEGER;
-- Procedure Declaration
PROCEDURE procedure_declaration(param1 VARCHAR2, param2 VARCHAR2);
END PKG1;
Snowflake¶
CREATE SCHEMA IF NOT EXISTS SCHEMA1_PKG1
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
;
注釈
なお、 FUNCTION と PROCEDURE の定義はSnowflakeでは必要ないため、削除されます。
既知の問題¶
問題は見つかりませんでした。
関連 EWIs¶
関連 EWIs はありません。
VARIABLES¶
パッケージ変数の変換仕様
説明¶
PACKAGE VARIABLES は、パッケージ宣言か PACKAGE BODY のどちらかで宣言できます。その動作により、これらの変数は Snowflakeセッション変数 に変換されるため、各使用または割り当てはSnowflakeの等価なものに翻訳されます。
Oracle変数宣言構文¶
variable datatype [ [ NOT NULL] {:= | DEFAULT} expression ] ;
サンプルソースパターン¶
補助コードのサンプル¶
Oracle¶
create table table1(id number);
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"}}'
;
変数宣言¶
Oracle¶
CREATE OR REPLACE PACKAGE PKG1 AS
package_variable NUMBER:= 100;
END PKG1;
Snowflakeスクリプト¶
CREATE SCHEMA IF NOT EXISTS PKG1
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
;
SET "PKG1.PACKAGE_VARIABLE" = '' || (100);
変数の使用¶
パッケージ変数の使用は、セッション変数の現在値にアクセスするSnowflake GETVARIABLE 関数に変換されます。これらの変数が使用される操作において機能的等価性を維持するために、元の変数のデータ型に明示的なキャストが追加されます。
Oracle¶
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¶
CREATE SCHEMA IF NOT EXISTS PKG1
COMMENT = '{"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 VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
BEGIN
INSERT INTO TABLE1(ID) VALUES(GETVARIABLE('PKG1.PACKAGE_VARIABLE') :: NUMBER);
END;
$$;
CALL SCHEMA1.PKG1.procedure1();
SELECT * FROM
TABLE1;
結果¶
ID |
|---|
100 |
注釈
パッケージ内の PROCEDURE 定義は、Snowflakeでは必要ないため削除されることに注意してください。
変数レギュラー割り当て¶
パッケージ変数が := 演算子を使って割り当てられている場合、割り当てはUPDATE_PACKAGE_VARIABLE_STATEというSnowConvert AI UDFに置き換えられます。これは、Snowflake SETVARIABLE 関数の抽象化です。
Oracle
Oracle¶
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¶
CREATE SCHEMA IF NOT EXISTS PKG1
COMMENT = '{"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 VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
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 |
注釈
パッケージ内の PROCEDURE 定義は、Snowflakeでは必要ないため削除されることに注意してください。
出力引数としての変数割り当て¶
パッケージ変数が出力引数として使用される場合、プロシージャ内部で新しい変数が宣言され、この変数がプロシージャの出力引数値をキャッチし、前述のUPDATE_PACKAGE_VARIABLE_STATEを使用してパッケージ変数を参照するセッション変数を更新するために使用されます。
Oracle¶
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¶
CREATE SCHEMA IF NOT EXISTS PKG1
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "oracle", "convertedOn": "07/16/2025", "domain": "no-domain-provided" }}'
;
SET "PKG1.PACKAGE_VARIABLE" = '' || (100);
--** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "TABLE1" **
CREATE OR REPLACE PROCEDURE PKG1.procedure1 ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "oracle", "convertedOn": "07/16/2025", "domain": "no-domain-provided" }}'
EXECUTE AS CALLER
AS
$$
DECLARE
PKG1_PACKAGE_VARIABLE VARIANT;
BEGIN
CALL PKG1.
procedure2(:PKG1_PACKAGE_VARIABLE);
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 OUT NUMBER(38, 18))
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "oracle", "convertedOn": "07/16/2025", "domain": "no-domain-provided" }}'
EXECUTE AS CALLER
AS
$$
BEGIN
out_param := 1000;
END;
$$;
CALL PKG1.procedure1();
結果¶
ID |
|---|
1000 |
注釈
パッケージ内の PROCEDURE 定義は、Snowflakeでは必要ないため削除されることに注意してください。
既知の問題¶
問題は見つかりませんでした。
関連 EWIs¶
SSC-FDM-0006:数値型の列はSnowflakeでは同様の動作をしない場合があります。