SnowConvert AI - Oracle - PACKAGES

説明

CREATE PACKAGE ステートメントを使用して、ストアドパッケージの仕様を作成します。ストアドパッケージとは、関連するプロシージャ、関数、その他のプログラムオブジェクトをカプセル化してデータベースに格納したものです。パッケージ仕様では、これらのオブジェクトを宣言しています。続いて指定されるパッケージ本文がこれらのオブジェクトを定義します。(Oracle PL/SQL 言語リファレンス CREATE PACKAGE ステートメント)

SnowflakeにはOracleのパッケージに相当するものがないため、構造を維持するためにパッケージはスキーマに変換され、すべての要素がスキーマ内で定義されます。また、パッケージとその要素は、元のスキーマ名を保持するように名前が変更されます。

BODY

説明

PACKAGE BODY のヘッダーが削除され、各プロシージャや関数定義がスタンドアロンの関数やプロシージャに変換されます。

CREATE PACKAGE SYNTAX

CREATE [ OR REPLACE ]
[ EDITIONABLE | NONEDITIONABLE ]
PACKAGE BODY plsql_package_body_source

Copy

サンプルソースパターン

注釈

以下のクエリは、 PackagesAsSchema オプションを無効にして変換されました。

Oracle

CREATE OR REPLACE PACKAGE BODY SCHEMA1.PKG1 AS
    PROCEDURE procedure1 AS
        BEGIN
            dbms_output.put_line('hello world');
        END;
END package1;
Copy
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;
$$;
Copy

既知の問題

問題は見つかりませんでした。

定数

パッケージ定数の変換仕様

説明

PACKAGE CONSTANTS は、パッケージ宣言か PACKAGE BODY のどちらかで宣言できます。プロシージャでパッケージ定数を使用すると、定数と同じ名前と値を持つ新しい変数が宣言されるため、結果のコードは入力とほぼ同じになります。

Oracle定数宣言構文

constant CONSTANT datatype [NOT NULL] { := | DEFAULT } expression ;

Copy

サンプルソースパターン

補助コードのサンプル

Oracle
create table table1(id number);
Copy
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"}}'
;
Copy
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;
Copy
結果

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;
Copy
結果

ID

9999

注釈

なお、 PROCEDURE の定義はSnowflakeでは必要ないため、削除されます。

既知の問題

問題は見つかりませんでした。

関連 EWIs

  1. SSC-FDM-0006:数値型の列はSnowflakeでは同様の動作をしない場合があります。

DECLARATION

説明

宣言はスキーマに変換されるので、各内部要素はこのスキーマの中で宣言されます。パッケージ内に存在するすべての要素は、適切な変換を持つ VARIABLES を除いてコメントされています。

CREATE PACKAGE SYNTAX

CREATE [ OR REPLACE ]
[ EDITIONABLE | NONEDITIONABLE ]
PACKAGE plsql_package_source

Copy

サンプルソースパターン

注釈

以下のクエリは、 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;
Copy
Snowflake
CREATE SCHEMA IF NOT EXISTS SCHEMA1_PKG1
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
;
Copy

注釈

なお、 FUNCTIONPROCEDURE の定義はSnowflakeでは必要ないため、削除されます。

既知の問題

問題は見つかりませんでした。

関連 EWIs

関連 EWIs はありません。

VARIABLES

パッケージ変数の変換仕様

説明

PACKAGE VARIABLES は、パッケージ宣言か PACKAGE BODY のどちらかで宣言できます。その動作により、これらの変数は Snowflakeセッション変数 に変換されるため、各使用または割り当てはSnowflakeの等価なものに翻訳されます。

Oracle変数宣言構文

variable datatype [ [ NOT NULL] {:= | DEFAULT} expression ] ;
Copy

サンプルソースパターン

補助コードのサンプル

Oracle
create table table1(id number);
Copy
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"}}'
;
Copy

変数宣言

Oracle
CREATE OR REPLACE PACKAGE PKG1 AS
    package_variable NUMBER:= 100;
END PKG1;
Copy
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);
Copy

変数の使用

パッケージ変数の使用は、セッション変数の現在値にアクセスする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;
Copy
結果

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;
Copy
結果

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;
Copy
結果

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;
Copy
結果

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();
Copy
結果

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();
Copy
結果

ID

1000

注釈

パッケージ内の PROCEDURE 定義は、Snowflakeでは必要ないため削除されることに注意してください。

既知の問題

問題は見つかりませんでした。

関連 EWIs

  1. SSC-FDM-0006:数値型の列はSnowflakeでは同様の動作をしない場合があります。