SnowConvert AI - Oracle -PL/SQLからSnowflakeスクリプトへ¶
ASSIGNMENT STATEMENT¶
説明¶
割り当てステートメントは、データ項目の値を有効な値に設定します。( Oracle PL/SQL言語リファレンスASSIGNMENTステートメント )
注釈
わかりやすくするため、出力コードの一部を省略しています。
Oracle割り当て構文¶
Snowflakeスクリプト割り当て構文¶
注釈
変数が以前に宣言されている場合、LET キーワードは割り当てステートメントでは必要ありません。詳細は Snowflake Assignmentドキュメント を参照してください。
サンプルソースパターン¶
1.スカラー変数¶
Oracle¶
結果¶
COL1 |
COL2 |
COL3 |
COL4 |
|---|---|---|---|
1 |
4.2 |
Hello World |
1 |
Snowflakeスクリプト¶
結果¶
COL1 |
COL2 |
COL3 |
COL4 |
|---|---|---|---|
1.000000000000000000 |
4.000000000000000000 |
Hello World |
1 |
警告
いくつかのデータ型の変換を更新する必要があり、異なる結果を引き起こす可能性があります。例えば、NUMBER から NUMBER は値を丸め、小数点は失われます。この問題については、すでに作業項目があります。
2.アウトパラメーター割り当て¶
出力パラメーターがどのように変換されるかについての詳しい情報は、以下の記事 出力パラメーターをご覧ください。
3.サポートされていない割り当て¶
Oracle¶
Snowflakeスクリプト¶
既知の問題¶
1.いくつかのサポートされていない割り当てステートメント¶
現在、カーソル、コレクション、記録、ユーザー定義タイプ変数の変換はSnow Scriptingではサポートされていません。そのため、これらの変数を使用する割り当てステートメントにはコメントが付けられ、サポートされていないとマークされています。これらの変数をSnowflakeの 半構造化データ型 に変更することで、シナリオによっては回避策として役立つ可能性があります。
CALL¶
説明¶
Oracleの呼び出しステートメントには2つのタイプがあります。
1-CALL ステートメント:¶
SQL 内からルーチン(スタンドアロンのプロシージャや関数、またはタイプやパッケージ内で定義されたプロシージャや関数)を実行するには、
CALLステートメントを使用します。(Oracle SQL 言語リファレンス CALL)
2-呼び出し仕様:¶
呼び出し仕様は、JavaメソッドまたはC言語サブプログラムを宣言し、PL/SQL から呼び出せるようにします。(Oracle SQL 言語リファレンス呼び出し仕様)
The CALL Specification is not supported in Snowflake Scripting since this is part of the development libraries for C and JAVA, not a SQL statement, therefore this statement is not transformed.
既知の問題¶
問題は見つかりませんでした。
関連 EWIs¶
関連 EWIs はありません。
CASE¶
CASEステートメントの変換リファレンス
説明¶
CASEステートメントは、一連の条件から選択し、対応するステートメントを実行します。Oracle CASE に関する詳細情報については、 こちら をご覧ください。
注釈
わかりやすくするため、出力コードの一部を省略しています。
単純なケース¶
Oracle CASE構文¶
SnowflakeスクリプトCASE構文¶
検索されたケース¶
Oracle CASE構文¶
SnowflakeスクリプトCASE構文¶
サンプルソースパターン¶
Sample auxiliary table¶
Oracle¶
Snowflake¶
単純なケース¶
Oracle¶
結果¶
COL |
|---|
悪い |
No such grade |
Excellent |
Snowflakeスクリプト¶
結果¶
COL |
|---|
悪い |
No such grade |
Excellent |
検索されたケース¶
Oracle¶
結果¶
COL |
|---|
悪い |
No such grade |
Excellent |
Snowflakeスクリプト¶
結果¶
COL |
|---|
悪い |
No such grade |
Excellent |
既知の問題¶
1.Snowflake Scripting CASE 構文ではラベルはサポートされていません¶
ラベルは位置によってコメントアウトされたり削除されたりします。
関連 EWIs¶
SSC-EWI-0094 :ラベル宣言はサポートされていません。
SSC-FDM-0007 :依存関係が欠落している要素。
COMPOUND STATEMENTS¶
このセクションは、複合ステートメントの変換仕様です。
警告
このセクションは進行中であり、情報は将来変更される可能性があります。
注釈
わかりやすくするため、出力コードの一部を省略しています。
概要¶
PL/SQL ソースプログラムの基本単位はブロックで、関連する宣言やステートメントをグループ化します。
PL/SQL ブロックはキーワード DECLARE、BEGIN、EXCEPTION、END で定義されます。これらのキーワードは、ブロックを宣言部分、実行部分、例外処理部分に分割します。必要なのは実行部分だけです。(PL/SQL匿名ブロック)
Oracleの BEGIN...END ブロックには以下のような特徴があります。
ネストされます。
変数の DECLARE ステートメントを含みます。
複数の SQL または PL/SQL ステートメントをグループ化します。
Oracle構文¶
Snowflake構文¶
注釈
Snowflakeでは、BEGIN/END ブロックを匿名ブロック内の最上位の構造にすることができます(Snowflakeドキュメント)。
サンプルソースパターン¶
1.IF-ELSE ブロック¶
詳しくは、IFステートメントに関する以下のドキュメントを参照してください。 SnowConvert AI IFステートメント変換 および Snowflake IFステートメントドキュメント
Oracle¶
結果¶
Snowflake¶
警告
プロシージャやユーザー定義関数(UDF)を呼び出す場合、call_results 変数として等価性をサポートするコードを生成する必要があります。この場合、情報を印刷するために使用されます。
こちら で使用されているユーザー定義関数(UDF)を精査します。
結果¶
2.CASE ステートメント¶
詳細については、以下のドキュメントを参照してください。 SnowConvert AI CASEステートメントドキュメント および Snowflake CASEドキュメント
Oracle¶
結果¶
Snowflake¶
警告
プロシージャやユーザー定義関数(UDF)を呼び出す場合、call_results 変数として等価性をサポートするコードを生成する必要があります。この場合、情報を印刷するために使用されます。
こちら で使用されているユーザー定義関数(UDF)を精査します。
結果¶
3.LOOP ステートメント¶
詳細は以下のドキュメントを参照してください。 SnowConvert AI FOR LOOP と Snowflake LOOPドキュメント と FORドキュメント をご参照ください。
Oracle¶
結果¶
Snowflake¶
最初のタブ¶
結果¶
4.プロシージャ呼び出しと OUTPUT パラメーター¶
Oracleの匿名ブロックには、プロシージャへの呼び出しがあるかもしれません。さらに、以下のドキュメントが役に立つかもしれません。 SnowConvert AIプロシージャドキュメント
以下の例では、OUTパラメーターを使用しています。現在の変換に関する情報は、こちらをご覧ください。 SnowConvert AI OUTPUTパラメーター
Oracle¶
結果¶
Snowflake¶
結果¶
5.セッションを変更¶
詳細については、以下のドキュメントを参照してください。 Alter sessionドキュメント
Oracleでは、 BEGIN...END のブロックは、 EXECUTE IMMEDIATE ステートメントを使用して、 alter session ステートメントを実行する必要があることに注意してください。
Oracle¶
結果¶
Snowflake¶
結果¶
6.カーソル¶
次の例は、 BEGIN...END ブロックの中にある cursor の使い方を示しています。詳しくは以下のドキュメントをご覧ください。 cursorドキュメント
Oracle¶
結果¶
Snowflake¶
警告
プロシージャやユーザー定義関数(UDF)を呼び出す場合、call_results 変数として等価性をサポートするコードを生成する必要があります。この場合、情報を印刷するために使用されます。
こちら で使用されているユーザー定義関数(UDF)を精査します。
結果¶
7.Selectステートメント¶
詳細については、以下のドキュメントを参照してください。 Selectドキュメント
Oracle¶
結果¶
Snowflake¶
警告
プロシージャやユーザー定義関数(UDF)を呼び出す場合、call_results 変数として等価性をサポートするコードを生成する必要があります。この場合、情報を印刷するために使用されます。
こちら で使用されているユーザー定義関数(UDF)を精査します。
結果¶
8.Joinステートメント¶
詳細は以下のドキュメントを参照してください。 Joinsドキュメント
Oracle¶
結果¶
Snowflake¶
警告
プロシージャやユーザー定義関数(UDF)を呼び出す場合、call_results 変数として等価性をサポートするコードを生成する必要があります。この場合、情報を印刷するために使用されます。
こちら で使用されているユーザー定義関数(UDF)を精査します。
9.例外処理¶
Oracle¶
結果¶
Snowflake¶
警告
Snowflakeの ZERO_DIVIDE 例外はサポートされていません。
結果¶
既知の問題¶
Oracleでサポートされていない GOTO ステートメント。
GOTO ステートメントを使用する例外も影響を受ける可能性があります。
カーソル機能は、現在の翻訳の制限に従って適応される場合があります。
関連 EWIs¶
SSC-EWI-0027 :次のステートメントは、無効なクエリを持つ変数/リテラルを使用しているため、実行されません。
SSC-EWI-OR0036 :型解決の問題で、文字列と日付の間の算術演算が正しく動作しないことがあります。
SSC-FDM-OR0035 :DBMS_OUTPUT.PUTLINE UDF実装を確認します。
SSC-FDM-0006 :数値型の列はSnowflakeでは同様の動作をしない場合があります。
SSC-PRF-0004 :このステートメントには、cursor for loopが使用されています。
SSC-EWI-0030 :以下のステートメントには、動的SQLを使用しています
CONTINUE¶
Oracle CONTINUEステートメントをSnowflakeスクリプトに変換するための変換リファレンス
説明¶
CONTINUEステートメントは、条件付きまたは無条件でループの現在の反復を終了し、現在のループまたは外側のラベル付きループの次の反復に制御を移します。( Oracle PL/SQL言語リファレンスCONTINUEステートメント )
注釈
わかりやすくするため、出力コードの一部を省略しています。
Oracle CONTINUE構文¶
SnowflakeスクリプトCONTINUE構文¶
サンプルソースパターン¶
1.単純な継続¶
コードは CONTINUE を使って INSERT ステートメントをスキップします。
注意
このケースは機能的に等価です。
Oracle¶
結果¶
ITERATOR |
|---|
Snowflakeスクリプト¶
結果¶
ITERATOR |
|---|
2.条件付きで継続¶
コードは CONTINUE を使って偶数の挿入をスキップします。
注釈
このケースは機能的に等価ではありませんが、条件を IF ステートメントに変えることができます。
Oracle¶
結果¶
ITERATOR |
|---|
1 |
3 |
5 |
7 |
9 |
11 |
13 |
15 |
17 |
19 |
21 |
Snowflakeスクリプト¶
結果¶
ITERATOR |
|---|
1 |
3 |
5 |
7 |
9 |
11 |
13 |
15 |
17 |
19 |
21 |
3.ラベルと条件付きで継続¶
コードは19行目をスキップし、 CONTINUE は常にラベルを使って外側のループにジャンプするため、内側のループは1回しか実行されません。
注意
このケースは、機能的には前のサンプルと同じプロセスを適用するのと同じです。
注釈
ラベルはコメントアウトされることに注意してください。
Oracle¶
結果¶
ITERATOR |
|---|
I1 |
K1 |
K2 |
K3 |
K4 |
K5 |
I2 |
I3 |
I4 |
I5 |
I6 |
I7 |
I8 |
I9 |
I10 |
I11 |
Snowflakeスクリプト¶
結果¶
ITERATOR |
|---|
I1 |
K1 |
K2 |
K3 |
K4 |
K5 |
I2 |
I3 |
I4 |
I5 |
I6 |
I7 |
I8 |
I9 |
I10 |
I11 |
既知の問題¶
問題は見つかりませんでした。
関連 EWIs¶
SSC-EWI-0094 :ラベル宣言はサポートされていません。
DECLARE¶
Oracle DECLAREステートメントをSnowflakeスクリプトに変換するための変換リファレンス
注釈
わかりやすくするため、出力コードの一部を省略しています。
説明¶
Oracle DECLARE ステートメントは、 PL/SQL ブロックステートメントのオプション部分です。変数、定数、プロシージャの宣言と定義、関数の宣言と定義、例外、カーソル、タイプ、その他多くのステートメントを作成することができます。Oracle DECLARE に関する詳細情報については、 こちら をご覧ください。
Oracle DECLARE構文¶
SnowflakeスクリプトDECLARE構文¶
サンプルソースパターン¶
変数宣言¶
Oracle変数宣言構文¶
Snowflakeスクリプト変数宣言構文¶
Oracle¶
Snowflakeスクリプト¶
定数宣言¶
警告
定数はSnowflake Scriptingではサポートされていませんが、動作をシミュレートするために変数に変換しています。
Oracle定数宣言構文¶
Snowflakeスクリプト変数宣言構文¶
Oracle¶
Snowflakeスクリプト¶
カーソル宣言¶
Oracleカーソル宣言構文¶
Snowflakeスクリプトカーソル宣言構文¶
危険
Oracle _ カーソル宣言 _ は必須ではありませんので、出力コードではコメントアウトされているかもしれません。_ カーソル定義 _ が代わりに使用され、Snowflake Scripting _ カーソル宣言 _ に変換されます。カーソル定義の詳細については CURSOR セクションを参照してください。
例外宣言¶
例外宣言の後に例外の初期化が続くことがありますが、今回の変換ではその両方を受け取り、Snowflake Scriptingの例外宣言にマージします。元の PRAGMA EXCEPTION_INIT はコメントアウトされます。
Oracle例外宣言構文¶
Snowflakeスクリプト例外宣言構文¶
Oracle¶
Snowflakeスクリプト¶
サポートされていないケース¶
次のOracle宣言ステートメントは、Snowflake Scripting宣言ブロックではサポートされていません。
カーソル変数の宣言。
コレクション変数の宣言。
記録変数の宣言。
タイプ定義(すべてのバリアント)。
関数の宣言と定義。
プロシージャの宣言と定義。
既知の問題¶
1.NOT NULL 制約を含む変数宣言はSnow Scriptingではサポートされていません。¶
Snow Scriptingで、 NOT NULL 制約を持つ変数の作成でエラーが発生しました。
2.カーソル宣言は、Snowflake Scriptingには相当するものがありません。¶
Oracleのカーソル宣言は役に立たないので、出力コードではコメントアウトされているかもしれません。カーソル定義が代わりに使用され、Snowflake Scriptingのカーソル宣言に変換されます。
3.例外コードがSnowflake Scriptingの制限を超えています。¶
Oracle例外コードは、Snowflake Scriptingコード制限を超えると削除されます。例外コードは-20000と-20999の間の整数でなければなりません。
3.サポートされていないケース。¶
Oracleの宣言ステートメントの中には、Snowflake Scriptingの宣言ブロックでサポートされていないものがあるため、コメントアウトされ、警告が追加される場合があります。
関連 EWIs¶
SSC-EWI-OR0051 :PRAGMA EXCEPTION_INITはサポートされていません。
SSC-EWI-OR0099 :例外コードがSnowflakeスクリプトの制限を超えています。
SSC-FDM-0016 :定数はSnowflakeスクリプトではサポートされていません。変数に変換されました。
SSC-FDM-OR0025 :Not Null制約はSnowflakeプロシージャではサポートされていません。
DEFAULT PARAMETERS¶
この記事は、現在のデフォルトパラメーターの変換と、その機能がどのようにエミュレートされているかについて説明しています。
注釈
わかりやすくするため、出力コードの一部を省略しています。
説明¶
デフォルトパラメーター とは、プロシージャや関数の呼び出しで引数が渡されなかった場合に値を持つパラメーターのことです。Snowflakeはデフォルトパラメーターをサポートしていないため、SnowConvert AIでは、プロシージャまたは関数呼び出しにデフォルト値が挿入されます。
宣言では、パラメーターの DEFAULT VALUE 句が削除されます。:= 記号と DEFAULT 句の両方の構文がサポートされています。
サンプルソースパターン¶
Sample auxiliaryy code¶
Oracle¶
Snowflake¶
デフォルトパラメーター宣言¶
Oracle¶
Snowflakeスクリプト¶
デフォルトパラメーターを持つプロシージャの呼び出し¶
Oracle¶
Snowflakeスクリプト¶
機能が正しくエミュレートされていることを確認するために、次のクエリは、前述のテーブルからプロシージャと SELECT を実行します。
Oracle¶
結果¶
COL1 |
COL2 |
|---|---|
10 |
15 |
10 |
1 |
10 |
15 |
10 |
2 |
1 |
2 |
Snowflakeスクリプト¶
結果¶
COL1 |
COL2 |
|---|---|
10 |
15 |
10 |
1 |
10 |
15 |
10 |
2 |
1 |
2 |
名前付き引数とデフォルトパラメーターを持つプロシージャの呼び出し¶
Oracle¶
Snowflakeスクリプト¶
機能が正しくエミュレートされていることを確認するために、次のクエリは、前述のテーブルからプロシージャと SELECT を実行します。
Oracle¶
結果¶
COL1 |
COL2 |
COL3 |
|---|---|---|
10 |
20 |
30 |
10 |
20 |
30 |
20 |
30 |
10 |
100 |
30 |
10 |
100 |
10 |
30 |
100 |
10 |
1000 |
Snowflakeスクリプト¶
結果¶
COL1 |
COL2 |
COL3 |
|---|---|---|
10 |
20 |
30 |
10 |
20 |
30 |
20 |
30 |
10 |
100 |
30 |
10 |
100 |
10 |
30 |
100 |
10 |
1000 |
既知の問題¶
1.問題が見つかりません
関連 EWIs¶
関連 EWIs はありません。
EXECUTE IMMEDIATE¶
Oracle EXECUTE IMMEDIATEステートメントをSnowflakeスクリプトに変換するための変換リファレンス
説明¶
EXECUTEIMMEDIATEステートメントは、1回の操作で動的な SQL ステートメントを構築し、実行します。ネイティブの動的 SQL は、
EXECUTEIMMEDIATEステートメントを使用して、ほとんどの動的 SQL ステートメントを処理します。(Oracle PL/SQL 言語リファレンス EXECUTE IMMEDIATE ステートメント)
Oracle EXECUTE IMMEDIATE構文¶
Snowflake Scriptingは、いくつかの機能的な違いはあるものの、このステートメントをサポートしています。Snowflakeのカウンターパートの詳細情報については、 Snowflakeの EXECUTE IMMEDIATE ドキュメント をご覧ください。
SnowスクリプトEXECUTE IMMEDIATE構文¶
サンプルソースパターン¶
次のサンプルでは、テーブルを作成し、Execute Immediateを使用してテーブルのドロップを試みます。
ハードコードされた文字列の使用¶
Oracle¶
Snowflakeスクリプト¶
文字列の変数への格納¶
Oracle¶
Snowflakeスクリプト¶
動的ステートメントでのパラメーターの連結¶
Oracle¶
Snowflakeスクリプト¶
USING 句の変換¶
Oracle¶
結果¶
COL1 |
|---|
1 |
Snowflakeスクリプト¶
注釈
Snowflake Scriptingの USING 句のパラメーターには括弧が必要です。
結果¶
COL1 |
|---|
1 |
既知の問題¶
1.Immediate Executionの結果を変数に格納することはできません。¶
SnowScripting は INTO も BULK COLLECT INTO 句もサポートしていません。このため、結果は別の手段で渡す必要があります。
2.数値プレースホルダー¶
プレースホルダーの数値名は現在、SnowConvert AIによって認識されませんが、この問題を修正するための作業項目があります。
3.引数式はSnowflake Scriptingではサポートされていません¶
Oracleでは、Using句の引数として式を使用することができますが、Snowflake Scriptingではサポートされていないため、コメントアウトされています。
4.動的 SQL 実行クエリが誤って実行不可とマークされることがあります。¶
シナリオによっては、実行が安全か安全でないかに関係なく、実行ステートメントがコメントされる可能性があるため、これを考慮してください。
Oracle¶
Snowflakeスクリプト¶
注釈
Snowflake Scriptingの USING 句のパラメーターには括弧が必要です。
関連 EWIs¶
SSC-EWI-0027 :無効なクエリを含む変数です。
SSC-EWI-0030 :以下のステートメントでは、動的SQLが使用されています。
EXIT¶
Oracle EXITステートメントをSnowflakeスクリプトに変換するための変換リファレンス
注釈
わかりやすくするため、出力コードの一部を省略しています。
説明¶
EXITステートメントは、条件付きまたは無条件でループの現在の反復を終了し、現在のループまたは外側のラベル付きループの終わりに制御を移します。( Oracle PL/SQL言語リファレンスEXITステートメント )
Oracle EXIT構文¶
SnowflakeスクリプトEXIT構文¶
サンプルソースパターン¶
注釈
BREAK で EXIT を変更しても、すべて同じように動作することに注意してください。
1.単純な終了¶
コードは EXIT を使って INSERT ステートメントをスキップします。
注意
このケースは機能的に等価です。
Oracle¶
結果¶
ITERATOR |
|---|
Snowflakeスクリプト¶
結果¶
ITERATOR |
|---|
2.条件付きで終了¶
コードはイテレータが5より大きいときにループを終了します。
注意
このケースは、条件を IF ステートメントに変えることで、機能的に等価になります。
Oracle¶
結果¶
ITERATOR |
|---|
1 |
2 |
3 |
4 |
5 |
6 |
Snowflakeスクリプト¶
結果¶
ITERATOR |
|---|
1 |
2 |
3 |
4 |
5 |
6 |
3.ラベルと条件付きで終了¶
コードは、外側のループを指す EXIT ステートメントを使用して、両方のループを解除します。
注意
このケースは、機能的には前のサンプルと同じプロセスを適用するのと同じです。
注釈
ラベルはコメントアウトされることに注意してください。
Oracle¶
結果¶
ITERATOR |
|---|
I1 |
K1 |
K2 |
K3 |
K4 |
K5 |
Snowflakeスクリプト¶
結果¶
ITERATOR |
|---|
I1 |
K1 |
K2 |
K3 |
K4 |
K5 |
既知の問題¶
問題は見つかりませんでした。
関連 EWIs¶
SSC-EWI-0094 :ラベル宣言はサポートされていません。
EXPRESSIONS¶
Oracle式からSnowスクリプトへの変換リファレンス
注釈
わかりやすくするため、出力コードの一部を省略しています。
説明¶
次のテーブルは、異なる種類の Oracle式 をSnow Scriptingに変換する方法の要約です。
部分的にサポートされる一般的なシナリオ¶
Oracle定数¶
Oracle¶
結果¶
COL |
|---|
CONSTANT に TEXT |
Snowflake¶
結果¶
COL |
|---|
CONSTANT に TEXT |
サポートされていない数値式¶
Oracle¶
結果¶
COL |
|---|
4 |
104 |
11 |
3 |
サポートされていないブール式¶
Oracle¶
関連 EWIs。¶
SSC-FDM-0016 :定数はSnowflakeスクリプトではサポートされていません。変数に変換されました。
FOR LOOP¶
説明¶
FORLOOPステートメントが繰り返されるたびに、ステートメントが実行され、インデックスがインクリメントまたはデクリメントされ、制御はループの先頭に戻ります。(Oracle PL/SQL 言語リファレンス FOR LOOP ステートメント)。
Oracle構文¶
Snowflakeスクリプト構文¶
Snowflake Scriptingは、指定回数ループする FOR LOOP をサポートしています。上下限は INTEGER でなければなりません。詳細は Snowflake Scriptingドキュメント を参照してください。
Oracle FOR LOOP の動作もステートメントで変更できます。
サンプルソースパターン¶
1.FOR LOOP¶
注意
このケースは機能的に等価です。
Oracle FOR LOOPの例¶
Snowflake Scripting FOR LOOPの例¶
2.追加の句を含む FOR LOOP¶
Oracle FOR LOOPの例¶
Snowflake Scripting FOR LOOPの例¶
3.複数の条件を含む FOR LOOP¶
Oracle FOR LOOPの例¶
Snowflake Scripting FOR LOOPの例¶
4.サポートされていない形式を含む FOR LOOP¶
Oracle FOR LOOPの例¶
Snowflake Scripting FOR LOOPの例¶
警告
カスタムタイプの変換は、現在Snowflake Scriptingではサポートされていません。
既知の問題¶
1.複数の条件を含むFor¶
Oracleでは、1つの FOR LOOP に複数の条件を設定できますが、Snowflake Scriptingでは、1つの FOR LOOP に1つの条件しか設定できません。最初の条件だけが移行され、他の条件は変換中に無視されます。SSC-FDM-OR0022 を確認してください。
Oracle¶
Snowflake Scripting FOR LOOPの例¶
2.Mutable・Counter変数とInmutable Counter変数
Oracleでは、ループ内部で変数 FOR LOOP の値を変更することができます。現在のドキュメント にはこの機能が含まれていますが、Snowflakeはこれを避けることを推奨します。この変数の値を変更すると、Snowflake Scriptingで正しく動作しない場合があります。
3.上限または下限の整数と浮動小数点数
Snowflakeスクリプトでは、 FOR LOOP 条件の境界として、 INTEGER または INTEGER と評価される式のみが許可されます。浮動小数点数は切り上げまたは切り下げされ、元の境界を変更します。
4.Oracleでサポートされていない句
Oracleでは、 FOR LOOP の条件に追加句を加えることができます。BY 句のように、条件を段階的にインクリメントします。また、ブール式の WHILE 句と WHEN 句もあります。これらの追加の句はSnowflakeスクリプトではサポートされておらず、変換時には無視されます。SSC-EWI-OR0101 をご確認ください。
Oracle¶
Snowflakeスクリプト¶
5.サポートされていない形式
Oracleでは、 FOR LOOP にさまざまな条件を指定できます。ブール式、コレクション、レコードがサポートされています。しかし、Snowflakeスクリプトは、境界として定義された整数を持つ FOR LOOP のみをサポートします。それ以外のフォーマットはサポート外と表示され、変換には手作業が必要となります。SSC-EWI-OR0103 をご確認ください。
関連 EWIs¶
SSC-EWI-0058 :機能は現在、Snowflakeスクリプトではサポートされていません。
SSC-EWI-0062 :カスタム型の使用法がバリアントに変更されました。
SSC-EWI-OR0100 :複数の条件を含むForループは、現在Snowflakeスクリプトではサポートされていません。最初の条件のみ使用されています。
SSC-EWI-OR0101 :特定のFor Loop句は現在Snowflakeスクリプトではサポートされていません。
SSC-EWI-OR0103 :For Loopフォーマットは現在Snowflakeスクリプトではサポートされていません。
FORALL¶
説明¶
FORALLステートメントは、1つの DML ステートメントを複数回実行し、VALUESとWHERE句に異なる値を指定します。(Oracle PL/SQL 言語リファレンス FORALL ステートメント)。
Oracle構文¶
警告
Snowflake Scriptingは FORALL ステートメントと直接等価ではありませんが、さまざまな回避策でエミュレートし、機能的に等価にすることができます。
サンプルソースパターン¶
セットアップデータ¶
Oracle¶
テーブル1¶
テーブル2¶
Snowflake¶
テーブル1¶
テーブル2¶
1.記録のコレクションを含む FORALL¶
Oracle¶
注意
以下の3つのケースは、Snowflake Scriptingへの変換が同じであり、機能的にも等価です。
ソース¶
結果¶
COLUMN1 |
COLUMN2 |
|---|
Snowflake¶
FORALLとレコードのコレクション¶
結果¶
COLUMN1 |
COLUMN2 |
|---|---|
1.000000000000000000 |
2.000000000000000000 |
1.000000000000000000 |
2.000000000000000000 |
2.000000000000000000 |
3.000000000000000000 |
3.000000000000000000 |
4.000000000000000000 |
4.000000000000000000 |
5.000000000000000000 |
5.000000000000000000 |
6.000000000000000000 |
注釈
EWIs SSC-PRF-0001と SSC-PRF-0003は、 FORALL ステートメントに FETCH BULK COLLECT ごとに追加されます。
2.INSERT INTO を使用した FORALL¶
Oracle¶
FORALL の例¶
結果¶
COLUMN1 |
COLUMN2 |
|---|---|
1 |
2 |
1 |
2 |
2 |
3 |
3 |
4 |
4 |
5 |
5 |
6 |
Snowflake¶
FORALLの同等物¶
結果¶
COLUMN1 |
COLUMN2 |
|---|---|
1.000000000000000000 |
2.000000000000000000 |
1.000000000000000000 |
2.000000000000000000 |
2.000000000000000000 |
3.000000000000000000 |
3.000000000000000000 |
4.000000000000000000 |
4.000000000000000000 |
5.000000000000000000 |
5.000000000000000000 |
6.000000000000000000 |
3.複数のフェッチされたコレクションを含む FORALL¶
Oracle¶
INSERT INTO を使用¶
UPDATEを使用¶
INSERT INTOの結果¶
COLUMN1 |
COLUMN2 |
|---|---|
1 |
2 |
2 |
3 |
3 |
4 |
4 |
5 |
5 |
6 |
1 |
2 |
UPDATEの結果¶
COLUMN1 |
COLUMN2 |
|---|---|
1 |
2. |
Snowflake¶
INSERT INTO を使用¶
UPDATEを使用¶
INSERT INTOの結果¶
COLUMN1 |
COLUMN2 |
|---|---|
1.000000000000000000 |
2.000000000000000000 |
1.000000000000000000 |
2.000000000000000000 |
2.000000000000000000 |
3.000000000000000000 |
3.000000000000000000 |
4.000000000000000000 |
4.000000000000000000 |
5.000000000000000000 |
5.000000000000000000 |
6.000000000000000000 |
UPDATEの結果¶
COLUMN1 |
COLUMN2 |
|---|---|
1.000000000000000000 |
2.000000000000000000 |
4.コレクションの記録を含む FORALL¶
Oracle¶
FORALL の例¶
結果¶
COLUMN1 |
COLUMN2 |
|---|---|
1 |
2 |
1 |
2 |
2 |
3 |
3 |
4 |
4 |
5 |
5 |
6 |
Snowflake¶
スクリプトのFORALL同等物¶
結果¶
COLUMN1 |
COLUMN2 |
|---|---|
1.000000000000000000 |
2.000000000000000000 |
1.000000000000000000 |
2.000000000000000000 |
2.000000000000000000 |
3.000000000000000000 |
3.000000000000000000 |
4.000000000000000000 |
4.000000000000000000 |
5.000000000000000000 |
5.000000000000000000 |
6.000000000000000000 |
5.動的 SQL を含む FORALL¶
Oracle¶
FORALL の例¶
結果¶
COLUMN1 |
COLUMN2 |
|---|---|
1 |
2 |
1 |
2 |
2 |
3 |
3 |
4 |
4 |
5 |
5 |
6 |
Snowflake¶
FORALLの同等物¶
結果¶
COLUMN1 |
COLUMN2 |
|---|---|
1.000000000000000000 |
2.000000000000000000 |
1.000000000000000000 |
2.000000000000000000 |
2.000000000000000000 |
3.000000000000000000 |
3.000000000000000000 |
4.000000000000000000 |
4.000000000000000000 |
5.000000000000000000 |
5.000000000000000000 |
6.000000000000000000 |
6.リテラル SQL を含む FORALL¶
Oracle¶
FORALL の例¶
結果¶
COLUMN1 |
COLUMN2 |
|---|---|
1 |
2 |
1 |
2 |
2 |
3 |
3 |
4 |
4 |
5 |
5 |
6 |
Snowflake¶
FORALLの同等物¶
結果¶
COLUMN1 |
COLUMN2 |
|---|---|
1 |
2 |
1 |
2 |
2 |
3 |
3 |
4 |
4 |
5 |
5 |
6 |
7.パラメトライズされたカーソルを含む FORALL¶
Oracle¶
FORALL の例¶
結果¶
COLUMN1 |
COLUMN2 |
|---|---|
1 |
2 |
1 |
2 |
2 |
3 |
3 |
4 |
4 |
5 |
5 |
6 |
Snowflake¶
FORALLの同等物¶
結果¶
COLUMN1 |
COLUMN2 |
|---|---|
1 |
2 |
1 |
2 |
2 |
3 |
3 |
4 |
4 |
5 |
5 |
6 |
8.LOOPS なしの FORALL¶
Oracle¶
FORALL の例¶
結果¶
COLUMN1 |
COLUMN2 |
|---|---|
1 |
2 |
1 |
2 |
2 |
3 |
3 |
4 |
4 |
5 |
5 |
6 |
Snowflake¶
FORALLの同等物¶
結果¶
COLUMN1 |
COLUMN2 |
|---|---|
1.000000000000000000 |
2.000000000000000000 |
1.000000000000000000 |
2.000000000000000000 |
2.000000000000000000 |
3.000000000000000000 |
3.000000000000000000 |
4.000000000000000000 |
4.000000000000000000 |
5.000000000000000000 |
5.000000000000000000 |
6.000000000000000000 |
9.UPDATE ステートメントを含む FORALL¶
Oracle¶
FORALL の例¶
結果¶
COLUMN1 |
COLUMN2 |
|---|---|
54321 |
2 |
Snowflake¶
FORALLの同等物¶
結果¶
COLUMN1 |
COLUMN2 |
|---|---|
54321 |
2 |
10.DELETE ステートメントを含む FORALL¶
Oracle¶
FORALL の例¶
結果¶
Snowflake¶
FORALLの同等物¶
結果¶
11.PACKAGE 参照を含む FORALL¶
Oracle¶
FORALL の例¶
結果¶
COLUMN1 |
COLUMN2 |
|---|---|
1 |
2 |
10 |
10 |
Snowflake¶
FORALLの同等物¶
結果¶
COLUMN1 |
COLUMN2 |
|---|---|
1.000000000000000000 |
2.000000000000000000 |
10.000000000000000000 |
10.000000000000000000 |
警告
上記の変換は、パッケージで定義された変数がコレクションの記録である場合にのみ機能します。
12.MERGE ステートメントを含む FORALL¶
Oracle¶
FORALL の例¶
結果¶
COLUMN1 |
COLUMN2 |
|---|---|
1 |
4 |
2 |
3 |
3 |
4 |
4 |
5 |
5 |
6 |
Snowflake¶
FORALLの同等物¶
結果¶
COLUMN1 |
COLUMN2 |
|---|---|
2.000000000000000000 |
3.000000000000000000 |
3.000000000000000000 |
4.000000000000000000 |
4.000000000000000000 |
5.000000000000000000 |
5.000000000000000000 |
6.000000000000000000 |
1.000000000000000000 |
4.000000000000000000 |
警告
上記の変換は、 MERGE 内部の SELECT ステートメントが DUAL テーブルから選択している場合にのみ機能します。
13.デフォルト FORALL 変換¶
注釈
また、Bulk Cursorヘルパー も役立つかもしれません。
Oracle¶
FORALL の例¶
結果¶
COLUMN1 |
COLUMN2 |
|---|---|
1 |
2 |
1 |
2 |
2 |
3 |
3 |
4 |
4 |
5 |
5 |
6 |
Snowflake¶
FORALLの同等物¶
結果¶
COLUMN1 |
COLUMN2 |
|---|---|
1.000000000000000000 |
2.000000000000000000 |
1.000000000000000000 |
2.000000000000000000 |
2.000000000000000000 |
3.000000000000000000 |
3.000000000000000000 |
4.000000000000000000 |
4.000000000000000000 |
5.000000000000000000 |
5.000000000000000000 |
6.000000000000000000 |
注釈
この変換は、先に述べた変換がどれもできない場合にのみ行われます。
14.LOOP 句の中の複数の FORALL¶
注釈
このパターンは、同じプロシージャに複数の FORALL があり、以下の構造を満たす場合に適用されます。
Oracle¶
FORALL の例¶
結果¶
COLUMN1 |
COLUMN2 |
|---|---|
54321 |
2 |
54321 |
2 |
54321 |
3 |
54321 |
4 |
54321 |
5 |
54321 |
6 |
Snowflake¶
FORALLの同等物¶
結果¶
COLUMN1 |
COLUMN2 |
|---|---|
54321 |
2 |
54321 |
2 |
54321 |
3 |
54321 |
4 |
54321 |
5 |
54321 |
6 |
15.異なる LOOP 句の中の複数の FORALL¶
注釈
このパターンは、同じプロシージャに複数の FORALL があり、以下の構造を満たす場合に適用されます。
Oracle¶
FORALL の例¶
結果¶
COLUMN1 |
COLUMN2 |
|---|---|
54321 |
2 |
54321 |
2 |
54321 |
3 |
54321 |
4 |
54321 |
5 |
54321 |
6 |
Snowflake¶
FORALLの同等物¶
結果¶
COLUMN1 |
COLUMN2 |
|---|---|
54321 |
2 |
54321 |
2 |
54321 |
3 |
54321 |
4 |
54321 |
5 |
54321 |
6 |
16.MERGE INTO と LOG ERRORS の FORALL¶
警告
このパターンはまだ実装されていません
Oracle¶
LOG に ERRORS¶
Snowflake¶
LOG に ERRORS¶
17.INSERT と LOG ERRORS の FORALL¶
警告
このパターンはまだ実装されていません
Oracle¶
LOG に ERRORS¶
Snowflake¶
LOG に ERRORS¶
既知の問題¶
問題は見つかりませんでした。
関連 EWIs¶
SSC-EWI-0030 :以下のステートメントでは、動的SQLが使用されています。
SSC-EWI-0036: データ型が別のデータ型に変換されました。
SSC-EWI-0056: 作成タイプがサポートされていません。
SSC-EWI-0058 :機能は現在、Snowflakeスクリプトではサポートされていません。
SSC-EWI-0062 :カスタム型の使用法がバリアントに変更されました。
SSC-EWI-OR0049 :ステートフルパッケージのパッケージ定数はまだサポートされていません。
SSC-FDM-0006 :数値型の列はSnowflakeでは同様の動作をしない場合があります。
SSC-FDM-0015:クエリで参照されているカスタム型が見つかりません。
SSC-PRF-0001 :このステートメントには、カーソルフェッチ一括操作の使用法があります。
SSC-PRF-0003 :ループ内のフェッチは複雑なパターンとみなされるため、Snowflakeのパフォーマンスが低下する可能性があります。
IF¶
説明¶
IF ステートメントは、 BOOLEAN 式の値に応じて、1つ以上のステートメントのシーケンスを実行するかスキップします。Oracle IF に関する詳細情報については、 こちら をご覧ください。
サンプルソースパターン¶
Sample auxiliary table¶
考えられる IF バリエーション¶
Oracle¶
コード1¶
コード2¶
コード3¶
コード4¶
結果1¶
COL1 |
|---|
one |
結果2¶
COL1 |
|---|
予期しない入力。 |
結果3¶
COL1 |
|---|
three |
結果4¶
COL1 |
|---|
予期しない入力。 |
Snowflakeスクリプト¶
コード1¶
コード2¶
コード3¶
コード4¶
結果1¶
COL1 |
|---|
one |
結果2¶
COL1 |
|---|
予期しない入力。 |
結果3¶
COL1 |
|---|
three |
結果4¶
COL1 |
|---|
予期しない入力。 |
既知の問題¶
問題は見つかりませんでした。
関連 EWIs¶
関連 EWIs はありません。
IS EMPTY¶
これは、Oracle IS EMPTYステートメントをSnowflakeに変換するための変換リファレンスです。
警告
このセクションは進行中であり、情報は将来変更される可能性があります。
説明¶
IS [NOT] EMPTY 条件を使用して、コレクションの要素が NULL であるかどうかに関係なく、指定されたネストされたテーブルが空かどうかをテストします。(ドキュメント)。
Oracle構文¶
サンプルソースパターン¶
Oracle¶
次の例は、 IS EMPTY ステートメントの使用例です。ステートメントは、 UDT を定義型として使用するネストされたテーブルに対して適用されます。出力には、電話番号を持っていない従業員の名前が表示されます。
出力¶
EMP_NAME |
|---|
ジェーン・スミス |
Snowflake¶
以下に示すSnowflakeクエリは、 IS EMPTY ステートメントの機能と同等です。特に、 IS EMPTY ステートメントには、 NULL と EMPTY オブジェクトの違いがあります。
ユーザー定義型が VARIANT に変換されていることに注目してください。Snowflakeの VARIANT 型はオブジェクトや配列を格納することができます。ネストされたテーブルは一連の情報であるため、 ARRAY 型はそれらを再定義し、オブジェクト ARRAY が空であるかどうかを検証するのに最も適した型です。
ARRAY_SIZE の等価の解決策は、ネストされたテーブルの無効性(VARIANT に変換)を求めることもできます。言い換えれば、 VARIANT 型は、 NULLs と空の ARRAYs も格納できます。
出力¶
EMP_NAME |
|---|
ジェーン・スミス |
その他の可能な組み合わせ¶
| Description | Oracle | Snowflake |
|---|---|---|
| Ask for a IS NOT EMPTY | | |
| Ask for NULL instead of EMPTY | | |
既知の問題¶
1.ユーザー定義型がバリアントに変換されます。¶
ユーザー定義型はサポートされていないため、いくつかの機能を確保するために手作業が必要となるバリアント型に変換されます。
詳細は以下のページをご覧ください。
2.ネストされたテーブルはサポートされていません。¶
ネストされたテーブルは現在サポートされていません。この等価性に基づく最良のアプローチは、ネストされたテーブルをバリアントとして扱いますが、 JSON データを内部に持つ配列を宣言し、 PARSE_JSON Snowflake関数を実行してネストされた情報を入力することです。
詳細は以下のページをご覧ください。
**3.Insertステートメントは、ユーザー定義型ではサポートされていません。¶
ユーザー定義型はサポートされていないため、これらの型へのInsertステートメントはサポートされていません。特にネストされたテーブルでは、 INSERT INTO ... VALUES ステートメントを INSERT INTO ...SELECT に変更する必要があります。これは、 ARRAY_CONSTRUCT 関数がこのパターンで使用されることが期待されているためです。
詳細は以下のページをご覧ください。
4.ロジックは ARRAY 型に適応する必要があります。¶
ネストされたテーブルは、 VARIANT に等価に変換され、 ARRAYs として動作する必要があるため、プロシージャの実装やデータとのインタラクションの機能とロジックを適合させる必要があります。
以下の例をご覧ください。
4.1 プロシージャの等価性¶
Oracle¶
Snowflake¶
出力¶
PROC1 |
|---|
IS EMPTY |
4.2 Selectステートメント¶
出力はテーブルから ARRAYs まで異なる場合があります。
Oracle¶
出力¶
PHONE_NUMBER |
|---|
1234567890 |
Snowflake¶
出力¶
PHONE_NUMBERS_COL |
|---|
[ 1234567890 ] |
関連 EWIs¶
SSC-EWI-0056: 作成タイプがサポートされていません。
SSC-EWI-0062 :カスタム型の使用法がバリアントに変更されました。
SSC-EWI-0073: 機能等価性レビュー保留中。
SSC-EWI-OR0035 :式のコレクションとして使用する場合、table関数はサポートされていません。
SSC-FDM-0006 :数値型の列はSnowflakeでは同様の動作をしない場合があります。
SSC-FDM-0015:クエリで参照されているカスタム型が見つかりません。
SSC-FDM-OR0035 :DBMS_OUTPUT.PUTLINE UDF実装を確認します。
LOCK TABLE¶
注釈
関連性のないステートメント。
警告
このステートメントは関連性のない構文であるため、移行から削除されることに注意してください。つまり、Snowflakeでは必要ないということです。
説明¶
Oracleでは、 LOCK TABLE ステートメントにより、指定したテーブルの共有または排他テーブルロックを明示的に取得できます。テーブルロックは現在のトランザクションが終了するまで続きます。詳しくは こちら をご覧ください。
構文
サンプルソースパターン¶
ロック中のテーブル¶
この例では、 LOCK TABLE ステートメントが削除されていることに注意してください。これは、Snowflakeがトランザクションを通じて別の方法でロックを処理するためです。
Oracle¶
Snowflake¶
LOG ERROR¶
注釈
わかりやすくするため、出力コードの一部を省略しています。
説明¶
FORALLステートメントは、1つの DML ステートメントを複数回実行し、VALUESとWHERE句に異なる値を指定します。(Oracle PL/SQL 言語リファレンス FORALL ステートメント)。
Oracle構文¶
警告
Snowflake Scriptingは FORALL ステートメントと直接等価ではありませんが、さまざまな回避策でエミュレートし、機能的に等価にすることができます。
サンプルソースパターン¶
セットアップデータ¶
Oracle¶
テーブル¶
Snowflake¶
テーブル¶
1.FORALL 内の MERGE INTO¶
Oracle¶
注意
以下の3つのケースは、Snowflake Scriptingへの変換が同じであり、機能的にも等価です。
ケース1¶
Snowflake¶
FORALLとレコードのコレクション¶
2.INSERT INTO を使用した FORALL¶
Oracle¶
FORALL の例¶
結果¶
COLUMN1 |
COLUMN2 |
|---|---|
1 |
2 |
1 |
2 |
2 |
3 |
3 |
4 |
4 |
5 |
5 |
6 |
Snowflake¶
FORALLの同等物¶
結果¶
COLUMN1 |
COLUMN2 |
|---|---|
1.000000000000000000 |
2.000000000000000000 |
1.000000000000000000 |
2.000000000000000000 |
2.000000000000000000 |
3.000000000000000000 |
3.000000000000000000 |
4.000000000000000000 |
4.000000000000000000 |
5.000000000000000000 |
5.000000000000000000 |
6.000000000000000000 |
3.複数のフェッチされたコレクションを含む FORALL¶
Oracle¶
INSERT INTO を使用¶
UPDATEを使用¶
INSERT INTOの結果¶
COLUMN1 |
COLUMN2 |
|---|---|
1 |
2 |
2 |
3 |
3 |
4 |
4 |
5 |
5 |
6 |
1 |
2 |
UPDATEの結果¶
COLUMN1 |
COLUMN2 |
|---|---|
1 |
2 |
Snowflake¶
INSERT INTO を使用¶
UPDATEを使用¶
INSERT INTOの結果¶
COLUMN1 |
COLUMN2 |
|---|---|
1.000000000000000000 |
2.000000000000000000 |
1.000000000000000000 |
2.000000000000000000 |
2.000000000000000000 |
3.000000000000000000 |
3.000000000000000000 |
4.000000000000000000 |
4.000000000000000000 |
5.000000000000000000 |
5.000000000000000000 |
6.000000000000000000 |
UPDATEの結果¶
COLUMN1 |
COLUMN2 |
|---|---|
1.000000000000000000 |
2.000000000000000000 |
4.コレクションの記録を含む FORALL¶
Oracle¶
FORALL の例¶
結果¶
COLUMN1 |
COLUMN2 |
|---|---|
1 |
2 |
1 |
2 |
2 |
3 |
3 |
4 |
4 |
5 |
5 |
6 |
Snowflake¶
スクリプトのFORALL同等物¶
結果¶
COLUMN1 |
COLUMN2 |
|---|---|
1.000000000000000000 |
2.000000000000000000 |
1.000000000000000000 |
2.000000000000000000 |
2.000000000000000000 |
3.000000000000000000 |
3.000000000000000000 |
4.000000000000000000 |
4.000000000000000000 |
5.000000000000000000 |
5.000000000000000000 |
6.000000000000000000 |
5.動的 SQL を含む FORALL¶
Oracle¶
FORALL の例¶
結果¶
COLUMN1 |
COLUMN2 |
|---|---|
1 |
2 |
1 |
2 |
2 |
3 |
3 |
4 |
4 |
5 |
5 |
6 |
Snowflake¶
FORALLの同等物¶
結果¶
COLUMN1 |
COLUMN2 |
|---|---|
1.000000000000000000 |
2.000000000000000000 |
1.000000000000000000 |
2.000000000000000000 |
2.000000000000000000 |
3.000000000000000000 |
3.000000000000000000 |
4.000000000000000000 |
4.000000000000000000 |
5.000000000000000000 |
5.000000000000000000 |
6.000 |
6.LOOPS なしの FORALL¶
Oracle¶
FORALL の例¶
結果¶
COLUMN1 |
COLUMN2 |
|---|---|
1 |
2 |
1 |
2 |
2 |
3 |
3 |
4 |
4 |
5 |
5 |
6 |
Snowflake¶
FORALLの同等物¶
結果¶
COLUMN1 |
COLUMN2 |
|---|---|
1.000000000000000000 |
2.000000000000000000 |
1.000000000000000000 |
2.000000000000000000 |
2.000000000000000000 |
3.000000000000000000 |
3.000000000000000000 |
4.000000000000000000 |
4.000000000000000000 |
5.000000000000000000 |
5.000000000000000000 |
6.000000000000000000 |
7.UPDATE ステートメントを含む FORALL¶
Oracle¶
FORALL の例¶
結果¶
COLUMN1 |
COLUMN2 |
|---|---|
54321 |
2 |
Snowflake¶
FORALLの同等物¶
結果¶
8.DELETE ステートメントを含む FORALL¶
Oracle¶
FORALL の例¶
結果¶
Snowflake¶
FORALLの同等物¶
結果¶
既知の問題¶
問題は見つかりませんでした。
関連 EWIs¶
SSC-EWI-0030 :以下のステートメントでは、動的SQLが使用されています。
SSC-EWI-0036: データ型が別のデータ型に変換されました。
SSC-EWI-0058 :機能は現在、Snowflakeスクリプトではサポートされていません。
SSC-EWI-0062 :カスタム型の使用法がバリアントに変更されました。
SSC-EWI-OR0129 :TYPE属性を解決できませんでした。
SSC-FDM-0006 :数値型の列はSnowflakeでは同様の動作をしない場合があります。
SSC-FDM-OR0031: DMLステートメント内のエラーログ句はSnowflakeではサポートされていません。
SSC-PRF-0001 :このステートメントには、カーソルフェッチ一括操作の使用法があります。
SSC-PRF-0003 :ループ内のフェッチは複雑なパターンとみなされるため、Snowflakeのパフォーマンスが低下する可能性があります。
LOOP¶
Oracle LOOPステートメントをSnowflakeスクリプトに変換するための変換リファレンス
説明¶
基本的な
LOOPステートメントが繰り返されるたびに、そのステートメントが実行され、制御はループの先頭に戻ります。LOOPステートメントは、ループ内のステートメントがループ外に制御を移すか、例外を発生させたときに終了します。( OraclePL/SQL言語リファレンスBASIC LOOPステートメント )
Oracle BASIC LOOP構文¶
SnowflakeスクリプトBASIC LOOP構文¶
Oracle BASIC LOOP の動作もステートメントで変更できます。
サンプルソースパターン¶
ループの単純なケース¶
注意
このケースは機能的に等価です。
Oracle¶
結果¶
ITERATOR |
|---|
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
Snowflakeスクリプト¶
結果¶
ITERATOR |
|---|
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
既知の問題¶
問題は見つかりませんでした。
関連 EWIs¶
関連 EWIs はありません。
OUTPUT PARAMETERS¶
説明¶
出力パラメーター は、ストアドプロシージャ/関数モジュールから、呼び出し元の PL/SQL ブロックに値が渡されるパラメーターです。出力パラメーターはSnowflake Scriptingではサポートされていないため、その機能をエミュレートするためのソリューションが実装されています。
サンプルソースパターン¶
単一の出力パラメーター¶
Oracle¶
Snowflakeスクリプト¶
複数の出力パラメーター¶
Oracle¶
Snowflakeスクリプト¶
機能が正しくエミュレートされていることを確認するために、次のクエリは、前述のテーブルからプロシージャと SELECT を実行します。
Oracle¶
結果¶
COL1 |
COL2 |
|---|---|
123 |
-1 |
123 |
456 |
Snowflakeスクリプト¶
結果¶
COL1 |
COL2 |
|---|---|
123.000000000000000000 |
-1 |
123.000000000000000000 |
456.000000000000000000 |
顧客データ型 OUT パラメーター¶
出力パラメータが顧客型の場合、処理は通常のデータ型と同様です。
Oracle¶
Snowflakeスクリプト¶
カーソルOUTパラメーター¶
カーソルOUTパラメーターはSnowflakeではサポートされていませんが、Oracleの動作をエミュレートする回避策が変換後のコードに適用されます。outパラメーターを持つプロシージャは、動的な名前を持つ仮テーブルを生成し、プロシージャ呼び出しでは、仮テーブルの名前を文字列として定義し、プロシージャ呼び出し内でテーブルを作成します。
Oracle¶
Snowflakeスクリプト¶
レコードOUTパラメーター¶
レコードはSnowflakeではネイティブにサポートされていませんが、出力パラメーターとしてエミュレートするための回避策が用いられました。レコードの代わりにOBJECT変数を定義することで、outパラメーターの結果を各オブジェクトプロパティに代入することで、レコードのフィールド構造をエミュレートすることができます。さらに、outパラメータとして割り当てられたレコードフィールドごとに、フィールドタイプを持つ新しい変数が生成されます。
Oracle¶
Snowflakeスクリプト¶
OUTパラメーターとしてのパッケージ変数¶
Snowflakeではパッケージはサポートされていないため、変数や定数のようなローカルメンバーも回避策を使用して保存する必要があります。このシナリオでは、パッケージ変数はセッション変数を使用してエミュレートされ、そのセッション変数は、出力パラメータの結果でローカル変数を設定した後に更新されます。
Oracle¶
Snowflakeスクリプト¶
既知の問題¶
1.パッケージ内の出力パラメーターを持つプロシージャが正しく動作しない場合があります¶
現在、パッケージ内に存在するプロシージャのセマンティック情報を収集することに問題があり、そのために出力パラメーターの変換が部分的に機能したり、まったく機能しなかったりします。この問題を解決するための作業がすでに進行中です。
2.データ型によっては正常に動作しない場合があります¶
変換に見られるように、呼び出されたプロシージャから値を取得するとき、 VARIANT から変数で指定された型への暗黙のキャストが実行されます。可能なデータ型は多数あるため、キャストによっては失敗したり、異なるデータを含むことがあります。
関連 EWIs¶
SSC-FDM-0006 :数値型の列はSnowflakeでは同様の動作をしない場合があります。
SSC-FDM-0007 :依存関係が欠落している要素。
SSC-FDM-0015 :データ型が認識されません。
NESTED に PROCEDURES¶
説明¶
OracleのPL/SQL、 NESTED PROCEDURES 定義とは、別のPL/SQLブロックの宣言セクション内で宣言・定義されるプロシージャを指します。この親ブロックは、別のプロシージャ、関数、パッケージボディのいずれでもよいです。詳細については、 Oracleのプロシージャの宣言と定義 をご参照ください。
注釈
以下に説明する変換は、他のプロシージャやパッケージの中に埋め込まれたプロシージャに特有です。
サンプルソースパターン¶
ネストされたプロシージャのINパラメーターモード¶
Snowflakeのネストされたプロシージャは暗黙的にINパラメーターのみをサポートするため、INキーワードは削除されます。
Oracle¶
Snowflakeスクリプト¶
ネストされたプロシージャのOUTパラメーターモード¶
SnowScriptのネストされたプロシージャは、出力パラメーターをサポートしていません。この機能をSnowflakeで再現するには、出力パラメーターに基づいてRETURN型を作成する必要があります。
出力パラメーターが1つしかない場合は、そのパラメーターが最後に返されます。複数の出力パラメーターがある場合、それらの値を含むオブジェクト構造体が生成されます。呼び出し中、これらの値は変数に代入され、その後、これらの結果は対応する変数またはパラメーターに代入されます。
Oracle¶
Snowflakeスクリプト¶
ネストされたプロシージャ内の複数のOUTパラメーター¶
Oracle¶
Snowflakeスクリプト¶
マルチレベルのネストされたプロシージャ¶
Snowflakeでは、ネストされたプロシージャに対して1レベルのネストしか許可されません。したがって、ネストされたプロシージャの中に別のネストされたプロシージャを入れることはサポートされていません。これが発生した場合、変換には次のエラーが含まれます。 !!!RESOLVE EWI!!! /*** SSC-EWI-0111 - ONLY ONE LEVEL OF NESTING IS ALLOWED FOR NESTED PROCEDURES IN SNOWFLAKE. ***/!!!
Oracle¶
Snowflakeスクリプト¶
ネストされたプロシージャのデフォルト値¶
ネストされたプロシージャ引数はデフォルト句をサポートしません。したがって、ネストされたプロシージャ呼び出しでオプションのパラメーターが省略されている場合、その引数のデフォルト値をプロシージャ呼び出し内で送信しなければなりません。SnowConvert AIは、このようなシナリオを自動的に識別し、プロシージャ呼び出しを適切に埋めます。
Oracle¶
Snowflakeスクリプト¶
ネストされたプロシージャのオーバーロード¶
Snowflakeは、ネストされたプロシージャのオーバーロードをサポートしていません。これが発生した場合、EWI SSC-EWI-0112 - NESTED PROCEDURE OVERLOADING IS NOT SUPPORTED が追加されます。
Oracle¶
Snowflakeスクリプト¶
パラメーターリストのないネストされたプロシージャ¶
Snowflakeでは、ネストされたプロシージャ定義がパラメーターを持たない場合に構文的に有効であるためには、空の括弧 () が必要です。SnowConvert AIでは、変換時に自動的に追加されます。
Oracle¶
Snowflakeスクリプト¶
REFCURSOR出力パラメーターを持つネストされたプロシージャ¶
Oracle¶
Snowflakeスクリプト¶
NOCOPY パラメーターオプション付きのネストされたプロシージャ¶
Oracle PL/SQLでは、NOCOPYキーワードは、 OUT および IN OUT プロシージャパラメーターの最適化ヒントです。デフォルトでは、Oracleはこれらのパラメーターを値で渡し、呼び出し中に高コストのデータのコピーを作成し、完了時にそれをコピーバックします。これは、大きなデータ構造に対して大きなパフォーマンスオーバーヘッドを引き起こす可能性があります。
NOCOPYはOracleに参照渡しを指示し、プロシージャが元のデータを直接変更できるようにします。これによりコピーのオーバーヘッドがなくなり、パフォーマンスが向上します。しかし、変更は即座に反映され、プロシージャ内で未処理の例外が発生しても暗黙のうちにロールバックされることはありません。
そのため、NOCOPYパラメーターオプションを削除し、FDM SSC-FDM-OR0050 - EXCEPTIONS WITH NOCOPY PARAMETERS MAY LEAD TO DATA INCONSISTENCY を追加します。これは、例外が発生するとプロシージャの実行が終了し、 RETURN ステートメントに到達できなくなるためです。その結果、呼び出し元の宣言ブロックの変数は、プロシージャが代入のための新しい値をうまく返せなかったため、初期値を保持します。
Oracle¶
Snowflakeスクリプト¶
既知の問題¶
1.マルチレベルのネストされたプロシージャ¶
Snowflakeにおけるネストされたプロシージャに対する変換は、他のプロシージャの中に直接ネストされたプロシージャに限定され、1レベルのネストしかサポートしていません。Iネストレベルが1を超える場合、またはプロシージャがスタンドアロン関数内にネストされている場合、変換はサポートされず、EWI !!!RESOLVE EWI!!! /*** SSC-EWI-0111 - ONLY ONE LEVEL OF NESTING IS ALLOWED FOR NESTED PROCEDURES IN SNOWFLAKE. ***/!!! が追加されます。
2.ネストされたプロシージャのオーバーロード¶
さらに、ネストされたプロシージャのオーバーロードはSnowflakeではサポートされていません。そのような場合、EWI !!!RESOLVE EWI!!! /*** SSC-EWI-0112 - NESTED PROCEDURE OVERLOADING IS NOT SUPPORTED. ***/!!! が追加されます。
3.匿名ブロック内のネストされたプロシージャ¶
匿名ブロック内のネストされたプロシージャの変換は現在保留中です。EWI !!!RESOLVE EWI!!! /*** SSC-EWI-OR0057 - TRANSFORMATION FOR NESTED PROCEDURE OR FUNCTION IS NOT SUPPORTED IN THIS SCENARIO ***/!!! が追加されます。
関連 EWIs¶
SSC-FDM-OR0050 :
NOCOPYパラメーターを持つ例外は、データの不整合を引き起こす可能性があります。SSC-EWI-OR0057 :ネストされたプロシージャや関数に対する変換はサポートされていません。
SSC-EWI-0111 :Snowflakeでは、ネストされたプロシージャには1つのレベルしか許可されません。
SSC-EWI-0112 :ネストされたプロシージャのオーバーロードはサポートされていません。
PROCEDURE CALL¶
PROCEDURE CALL または SUBPROGRAM INVOCATION の変換リファレンス
注釈
わかりやすくするため、出力コードの一部を省略しています。
説明¶
このセクションでは、プロシージャや匿名ブロックなど、 PL ブロック内のサブプログラム呼び出しの構文について説明します。
この件に関する詳細は、Oracleのサブプログラムのドキュメントを参照してください: (Oracle PL/SQL 言語リファレンスサブプログラム呼び出しステートメント)
プロシージャ呼び出しは、オプションのパラメーターがなく、その順序が正式なパラメーターと一致する限り、Snowflakeに移行できます。プロシージャの呼び出しはCallステートメントに移行することに注意してください。
Oracleサブプログラム呼び出し構文¶
Snowflake Scriptingは、いくつかの機能的な違いはあるものの、このステートメントをサポートしています。
Snowスクリプトのサブプログラム呼び出し構文¶
サンプルソースパターン¶
注釈
次のテーブルとプロシージャの例を考えてみましょう。
Oracle¶
Snowflake¶
単純な呼び出し¶
Oracle¶
結果¶
COL1 |
|---|
1 |
Snowflakeスクリプト¶
結果¶
COL1 |
|---|
1 |
オプションのパラメーターを持つプロシージャの呼び出し¶
警告
このサンプルには、いくつかの機能的な違いに対する手動の介入が含まれており、それらを説明するために使用されます。これらの違いの詳細については、以下の 既知の問題セクション を確認してください。
Oracle¶
結果¶
COL1 |
|---|
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
Snowflakeスクリプト¶
結果¶
COL1 |
|---|
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
既知の問題¶
1. Default parameter reordering¶
Snowflake requires default parameters to appear at the end of the parameter list. SnowConvert AI automatically reorders them and emits an SSC-FDM-0041 notice. When positional callers are detected, they are converted to named arguments.
2.名前付きパラメーターは使用可能ですが、機能的には等価ではありません¶
Named parameters are supported in Snowflake. When default parameters are reordered, SnowConvert AI automatically converts positional call sites to use named arguments to preserve the original semantics.
3.出力パラメーターによるサブプログラムの呼び出しはサポートされていません¶
Snowflakeはパラメーターモードをサポートしていませんが、その機能をエミュレートするソリューションが実装されています。出力パラメーターの変換に関する詳しい情報は、以下の記事 出力パラメーターをご覧ください。
関連 EWIs¶
SSC-FDM-0041: Default parameters were reordered to the end of the parameter list.
SSC-FDM-0007 :依存関係が欠落している要素。
RAISE¶
説明¶
RAISEステートメントは明示的に例外を発生させます。例外ハンドラーの外では、例外名を指定する必要があります。例外ハンドラーの内部では、例外名を省略すると、
RAISEステートメントが現在の例外を再度発生させます。(Oracle PL/SQL 言語リファレンスRaiseステートメント)
ステートメントはSnowflake Scriptingで完全にサポートされていますが、いくつかのコミットステートメントとロールバックステートメントを持つ場合、いくつかの違いがあるかもしれないことを考慮してください。
Snowflake Scriptingはこのステートメントをサポートしています。
サンプルソースパターン¶
単純な例外のスロー¶
Oracle¶
結果¶
Snowflakeスクリプト¶
結果¶
既知の問題¶
問題は見つかりませんでした。
関連 EWIs¶
関連 EWIs はありません。
RAISE_APPICATION_ERROR¶
raise_application_errorステートメントの変換リファレンス。
概要¶
プロシージャ RAISE_APPLICATION_ERROR では、ストアドサブプログラムからユーザー定義の ORA- エラーメッセージを発行することができます。そうすることで、アプリケーションにエラーを報告し、処理されない例外を返すことを避けることができます(Oracleドキュメント)。
Oracle構文¶
注釈
error_number は-20000から-20999までの範囲の負の整数で、 message は2048バイトまでの文字列です。
オプションの3つ目のパラメーターが TRUE の場合、エラーは以前のエラーのスタックに置かれます。パラメーターが FALSE (デフォルト)の場合、エラーは以前のエラーをすべて置き換えます。
Snowflakeの同等のステートメントは RAISE 句です。ただし、ユーザー定義の例外を変数として宣言してから、その例外のための RAISE ステートメントを呼び出す必要があります。
Snowflake構文¶
注釈
詳細情報については、以下の Snowflakeドキュメント を参照してください。
サンプルソースパターン¶
1.セクションを宣言しない関数での例外¶
このシナリオでは、宣言セクションのない関数は例外宣言のあるプロシージャに翻訳されます。以下の点にご注意ください。
例外変数名は大文字で宣言されます。
例外変数名は説明に基づき、末尾は例外コード名と連続番号で構成されます。
最初の関数やプロシージャに宣言セクションがなくても、宣言セクションは作成されます。
Oracle¶
出力¶
Snowflake¶
出力¶
2.制限外の例外コード番号¶
次の例では、プロシージャ本文でコメントアウトされた翻訳を示しています。これは、コードがSnowflakeの適用可能なコード制限外にあるためです。解決策は、クエリセクションで利用可能なコードの例外コードを変更することです。
Oracle¶
出力¶
Snowflake¶
出力¶
3.例外スタック機能¶
例外スタック機能はSnowflakeではサポートされていないため、例外宣言から削除されています。
Oracle¶
出力¶
Snowflake¶
出力¶
4.同じ例外コードを持つ複数の例外¶
宣言セクションとraiseステートメントには、同じ例外を複数共存させることができます。
Oracle¶
出力¶
Snowflake¶
出力¶
既知の問題¶
SQLREM 関数が見直される可能性があります。
Snowflakeで適用可能な制限外の例外コード番号を利用可能なコード例外に変更する必要があります。
エラーのスタックへの追加はサポートされていません。
関連 EWIs¶
SSC-EWI-OR0099 :例外コードがSnowflakeスクリプトの制限を超えています。
SSC-FDM-0029 :ユーザー定義関数がSnowflakeプロシージャに変換されました。
SSC-FDM-OR0011 :「スタックに追加」オプションがサポートされていないため、boolean引数は削除されました。
UDF CALL¶
ユーザー定義関数(UDF)呼び出しの変換リファレンス
注釈
わかりやすくするため、出力コードの一部を省略しています。
説明¶
広く知られているように、Oracleのスカラーでないユーザー定義関数(UDFs)は、より複雑な機能に対応するためにSnowflakeのストアドプロシージャに変換されます。
この変換により、関数の呼び出し方も変わり、従来の関数呼び出しからストアドプロシージャ呼び出しに移行します。
ストアドプロシージャの呼び出しに関する詳細は、ここからアクセスできるドキュメントを参照してください: PROCEDURE CALL。
サンプルソースパターン¶
注釈
次の関数とテーブルの例を考えてみましょう。
Oracle¶
Snowflake¶
UDF 呼び出し¶
Oracle¶
結果¶
Snowflakeスクリプト¶
結果¶
クエリ内の UDF 呼び出し¶
関数呼び出しがクエリ内に埋め込まれている場合、クエリ内でプロシージャを直接呼び出すことができないというSnowflakeの制限により、呼び出しプロセスが複雑になります。この制限を克服するために、プロシージャの呼び出しはクエリの外部に移動され、結果は変数に割り当てられます。この変数がクエリ内で参照されることで、機能的等価性が達成されます。このアプローチにより、プロシージャ制約を遵守しながら、Snowflakeクエリ内でより複雑な動作を実行することができます。
Oracle¶
結果¶
Snowflakeスクリプト¶
結果¶
既知の問題¶
1.クエリ依存関係のあるクエリでの UDFs のサポートされていない使用¶
クエリ依存関係を持つクエリ内でユーザー定義関数(UDFs)を呼び出す場合、列を引数に持つ埋め込み関数を含むシナリオはサポートされません。クエリの外部から列値にアクセスできないため、このような制限が生じます。サポートされていないシナリオの例としては、以下のようなものがあります。
\ サポートされるシナリオには、リテラル値、外部変数、パラメーターなど他のタイプの引数を持つ関数呼び出しが含まれます。例:
サポートされているシナリオでは、関数を効果的に移行することができます。
関連 EWIs¶
SSC-EWI-0073: 機能等価性レビュー保留中。
SSC-FDM-0006 :数値型の列はSnowflakeでは同様の動作をしない場合があります。
SSC-FDM-0029 :ユーザー定義関数がSnowflakeプロシージャに変換されました。
WHILE¶
Oracle WHILEステートメントをSnowflakeスクリプトに変換するための変換リファレンス
説明¶
WHILELOOPステートメントは、条件がTRUEの場合に1つ以上のステートメントを実行します。( Oracle PL/SQL言語リファレンスWHILEステートメント )
Oracle WHILE構文¶
SnowflakeスクリプトWHILE構文¶
Oracle WHILE の動作もステートメントで変更できます。
サンプルソースパターン¶
Whileの単純なケース¶
注意
このケースは機能的に等価です。
Oracle¶
結果¶
ITERATOR |
|---|
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
Snowflakeスクリプト¶
結果¶
ITERATOR |
|---|
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
既知の問題¶
問題は見つかりませんでした。
関連 EWIs¶
関連 EWIs はありません。