SnowConvert AI - Redshift - CREATE PROCEDURE¶
説明¶
現在のデータベースに対して、新しいストアドプロシージャを作成するか、既存のプロシージャを置き換えます。(Redshift SQL 言語リファレンスプロシージャ作成)。
プロシージャ句の詳細については、以下の定義を参照してください。
文法構文¶
以下はAmazon Redshiftでプロシージャを作成するための SQL 構文です。こちらをクリックして、この構文のRedshifts仕様にアクセスしてください。
CREATE [ OR REPLACE ] PROCEDURE sp_procedure_name
( [ [ argname ] [ argmode ] argtype [, ...] ] )
[ NONATOMIC ]
AS $$
procedure_body
$$ LANGUAGE plpgsql
[ { SECURITY INVOKER | SECURITY DEFINER } ]
[ SET configuration_parameter { TO value | = value } ]
サンプルソースパターン¶
入力コード:¶
Redshift¶
CREATE PROCEDURE TEST_PROCEDURE()
LANGUAGE PLPGSQL
AS
$$
BEGIN
NULL;
END;
$$;
出力コード:¶
Snowflake¶
CREATE PROCEDURE TEST_PROCEDURE ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "redshift", "convertedOn": "02/07/2025", "domain": "test" }}'
AS
$$
BEGIN
NULL;
END;
$$;
ALIAS DECLARATION¶
説明¶
ストアドプロシージャのシグネチャで引数名が省略されている場合は、引数のエイリアスを宣言することができます。
Snowflakeにはこのサポートはありません。
機能的な同等性を達成するため、エイリアスは削除され、使用名はすべて変更されます。
名前のないパラメーターに対してエイリアスが宣言されると、パラメーターと使用に対して生成された名前が作成されます。エイリアスが名前を持つパラメーターの場合、エイリアスは実際のパラメーター名に置き換えられます。
文法構文¶
name ALIAS FOR $n;
サンプルソースパターン¶
入力コード:¶
Redshift¶
CREATE OR REPLACE PROCEDURE test_procedure (integer)
LANGUAGE plpgsql
AS
$$
DECLARE
first_alias ALIAS FOR $1;
second_alias ALIAS FOR $1;
BEGIN
INSERT INTO t1
VALUES (first_alias + 1);
INSERT INTO t1
VALUES (second_alias + 2);
END;
$$;
--Notice the parameter already has a name
--and we are defining two alias to the same parameter
CREATE OR REPLACE PROCEDURE test_procedure (PARAMETER1 integer)
LANGUAGE plpgsql
AS
$$
DECLARE
first_alias ALIAS FOR $1;
second_alias ALIAS FOR $1;
BEGIN
INSERT INTO t1
VALUES (first_alias + 1);
INSERT INTO t1
VALUES (second_alias + 2);
END;
$$;
出力コード:¶
Snowflake¶
CREATE OR REPLACE PROCEDURE test_procedure (SC_ARG1 integer)
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "redshift", "convertedOn": "03/03/2025", "domain": "test" }}'
AS
$$
BEGIN
INSERT INTO t1
VALUES (:SC_ARG1 + 1);
INSERT INTO t1
VALUES (:SC_ARG1 + 2);
END;
$$;
--Notice the parameter already has a name
--and we are defining two alias to the same parameter
--** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "t1" **
CREATE OR REPLACE PROCEDURE test_procedure (PARAMETER1 integer)
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "redshift", "convertedOn": "03/03/2025", "domain": "test" }}'
AS
$$
BEGIN
INSERT INTO t1
VALUES (:PARAMETER1 + 1);
INSERT INTO t1
VALUES (:PARAMETER1 + 2);
END;
$$;
既知の問題¶
既知の問題はありません。
関連 EWIs。¶
関連 EWIs はありません。
ARGUMENTS MODE¶
説明¶
Amazon Redshiftのストアドプロシージャは、プロシージャの呼び出し中に渡すことができるパラメーターをサポートしています。これらのパラメーターにより、入力値を提供したり、出力値を取得したり、入出力操作に使用したりすることができます。以下にパラメーターのタイプ、モード、使用例を詳しく説明します。Snowflakeは入力値のみをサポートしています。
IN (入力パラメーター)¶
目的: プロシージャに値を渡すために使用します。
デフォルトモード: モードが指定されていない場合、パラメーターは IN とみなされます。
動作: プロシージャに渡された値は、プロシージャ内部では変更できません。
OUT (出力パラメーター)¶
目的: プロシージャから値を返すために使用します。
動作: パラメーターはプロシージャ内部で変更でき、呼び出し元に返されます。初期値は送信できません。
INOUT (入力/出力パラメーター)¶
目的: 値をプロシージャに渡し、更新された値を返すように変更するために使用します。
動作: IN と OUT の動作を組み合わせたものです。出力に関係なく初期値を送信する必要があります。
文法構文¶
[ argname ] [ argmode ] argtype
サンプルソースパターン¶
入力コード:¶
Redshift¶
CREATE OR REPLACE PROCEDURE SP_PARAMS(
IN PARAM1 INTEGER,
OUT PARAM2 INTEGER,
INOUT PARAM3 INTEGER)
AS
$$
BEGIN
NULL;
END;
$$
LANGUAGE plpgsql;
出力コード:¶
Snowflake¶
CREATE OR REPLACE PROCEDURE SP_PARAMS (PARAM1 INTEGER, PARAM2 OUT INTEGER, PARAM3 OUT INTEGER)
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "redshift", "convertedOn": "07/10/2025", "domain": "no-domain-provided" }}'
AS
$$
BEGIN
NULL;
END;
$$;
既知の問題¶
既知の問題はありません。
関連 EWIs¶
SCC-EWI-0028 : Snowflakeがサポートしていないタイプです。
SSC-EWI-RS0010: Top-level procedure call with out parameters is not supported.
PROCEDURE BODY¶
説明¶
Like Redshift, Snowflake supports CREATE PROCEDURE using $$ procedure_logic $$ as the body. There is a difference in the Redshift syntax where a word can be inside the $$ like $word$ and used as a delimiter body like $word$ procedure_logic $word$. SnowConvert AI will transform it by removing the word, leaving the $$.
文法構文¶
AS
$Alias$
procedure_body
$Alias$
サンプルソースパターン¶
入力コード:¶
Redshift¶
CREATE OR REPLACE PROCEDURE SP()
AS
$somename$
BEGIN
NULL;
END;
$somename$
LANGUAGE plpgsql;
出力コード:¶
Snowflake¶
CREATE OR REPLACE PROCEDURE SP ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "redshift", "convertedOn": "02/07/2025", "domain": "test" }}'
AS
$$
BEGIN
NULL;
END;
$$;
既知の問題¶
既知の問題はありません。
関連 EWIs。¶
関連 EWIs はありません。
BLOCK STATEMENT¶
説明¶
PL/pgSQL はブロック構造言語です。プロシージャの完全な本文は、変数宣言と PL/pgSQL ステートメントを含むブロックで定義されます。ステートメントはネストされたブロックやサブブロックになることもあります。
文法構文¶
[ <<label>> ]
[ DECLARE
declarations ]
BEGIN
statements
EXCEPTION
WHEN OTHERS THEN
statements
END [ label ];
サンプルソースパターン¶
入力コード:¶
Redshift¶
CREATE OR REPLACE PROCEDURE MY_PROCEDURE()
AS
$$
BEGIN
NULL;
END;
$$
LANGUAGE plpgsql;
出力コード:¶
Snowflake¶
CREATE OR REPLACE PROCEDURE MY_PROCEDURE ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "redshift", "convertedOn": "02/10/2025", "domain": "test" }}'
AS
$$
BEGIN
NULL;
END;
$$;
既知の問題¶
既知の問題はありません。
関連 EWIs。¶
関連 EWIs はありません。
DECLARE¶
説明¶
ループ変数を除くすべてのプロシージャ変数を宣言するセクションです。\ Redshiftはブロックステートメントごとに複数の DECLARE セクションをサポートしていますが、Snowflakeはこの動作をサポートしていないため、ブロックごとに1つの宣言ステートメントにマージする必要があります。
文法構文¶
[ DECLARE declarations ]
サンプルソースパターン¶
入力コード:¶
Redshift¶
CREATE OR REPLACE PROCEDURE first_procedure (first_parameter integer)
LANGUAGE plpgsql
AS
$$
DECLARE
i int := first_parameter;
BEGIN
select i;
END;
$$;
CREATE OR REPLACE PROCEDURE second_procedure (first_parameter integer)
LANGUAGE plpgsql
AS
$$
DECLARE
i int := first_parameter;
DECLARE
j int := first_parameter;
BEGIN
select i;
END;
$$;
出力コード:¶
Snowflake¶
CREATE OR REPLACE PROCEDURE first_procedure (first_parameter integer)
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "redshift", "convertedOn": "02/11/2025", "domain": "test" }}'
AS
$$
DECLARE
i int := first_parameter;
BEGIN
select i;
END;
$$;
CREATE OR REPLACE PROCEDURE second_procedure (first_parameter integer)
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "redshift", "convertedOn": "02/11/2025", "domain": "test" }}'
AS
$$
DECLARE
i int := first_parameter;
j int := first_parameter;
BEGIN
select i;
END;
$$;
既知の問題¶
既知の問題はありません。
関連 EWIs。¶
関連 EWIs はありません。
EXCEPTION¶
説明¶
例外が発生し、例外処理ブロックを追加すると、 RAISE ステートメントやその他のほとんどの PL/pgSQL ステートメントを記述できます。例えば、カスタムメッセージで例外を発生させたり、ログテーブルに記録を挿入することができます。
文法構文¶
EXCEPTION
WHEN OTHERS THEN
statements
サンプルソースパターン¶
入力コード:¶
Redshift¶
CREATE OR REPLACE PROCEDURE update_employee_sp() AS
$$
BEGIN
select var;
EXCEPTION WHEN OTHERS THEN
RAISE INFO 'An exception occurred.';
END;
$$
LANGUAGE plpgsql;
出力コード:¶
Snowflake¶
CREATE OR REPLACE PROCEDURE update_employee_sp ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "redshift", "convertedOn": "03/03/2025", "domain": "test" }}'
AS
$$
BEGIN
select var;
EXCEPTION WHEN OTHER THEN
CALL RAISE_MESSAGE_UDF('INFO', 'An exception occurred.');
RAISE;
END;
$$;
既知の問題¶
既知の問題はありません。
関連 EWIs。¶
関連 EWIs はありません。
LABEL¶
説明¶
ラベルは、Redshiftでブロックを修飾したり、 EXIT または END ステートメントを使用したりするために使用されます。Snowflakeはラベルをサポートしていません。
警告
Snowflakeではラベルはサポートされていないため、 EWI が印刷されます。
文法構文¶
[<<label>>]
BEGIN
...
END [label]
サンプルソースパターン¶
入力コード:¶
Redshift¶
CREATE OR REPLACE PROCEDURE test_procedure (first_parameter integer)
LANGUAGE plpgsql
AS
$$
<<Begin_block_label>>
BEGIN
INSERT INTO my_test_table
VALUES (first_parameter);
END;
$$;
出力コード:¶
Snowflake¶
CREATE OR REPLACE PROCEDURE test_procedure (first_parameter integer)
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "redshift", "convertedOn": "03/03/2025", "domain": "test" }}'
AS
$$
!!!RESOLVE EWI!!! /*** SSC-EWI-0094 - LABEL DECLARATION FOR A STATEMENT IS NOT SUPPORTED BY SNOWFLAKE SCRIPTING <<Begin_block_label>> ***/!!!
BEGIN
INSERT INTO my_test_table
VALUES (:first_parameter);
END;
$$;
既知の問題¶
既知の問題はありません。
関連 EWIs¶
SSC-EWI-0094: Label declaration not supported
NONATOMIC¶
説明¶
NONATOMIC はストアドプロシージャの各ステートメントの後にコミットします。Snowflakeは AUTOCOMMIT パラメーターをサポートしています。AUTOCOMMIT のデフォルト設定は TRUE (有効)です。
AUTOCOMMIT が有効になっている間は、明示的トランザクションの外側にある各ステートメントは、その暗黙的な単一ステートメントトランザクションの内側として扱われます。つまり、そのステートメントは、成功すると自動的にコミットされ、失敗すると自動的にロールバックされます。つまり、Snowflakeは「デフォルトで」 NONATOMIC で動作します。
文法構文¶
NONATOMIC
サンプルソースパターン¶
入力コード:¶
Redshift¶
CREATE OR REPLACE PROCEDURE SP_NONATOMIC()
NONATOMIC
AS
$$
BEGIN
NULL;
END;
$$
LANGUAGE plpgsql;
出力コード:¶
Snowflake¶
CREATE OR REPLACE PROCEDURE SP_NONATOMIC ()
RETURNS VARCHAR
----** SSC-FDM-RS0008 - SNOWFLAKE USES AUTOCOMMIT BY DEFAULT. **
--NONATOMIC
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "redshift", "convertedOn": "02/10/2025", "domain": "test" }}'
AS
$$
BEGIN
NULL;
END;
$$;
既知の問題¶
既知の問題はありません。
関連 EWIs。¶
関連 EWIs はありません。
POSITIONAL ARGUMENTS¶
説明¶
Redshift supports nameless parameters by referencing the parameters by their position using $. Snowflake does not support this behavior. To ensure functional equivalence, SnowConvert AI can convert those references by the parameter’s name if the name is present in the definition. If not, SnowConvert AI will generate a name for the parameter, and the uses will be replaced with the new name.
文法構文¶
$n
サンプルソースパターン¶
入力コード:¶
Redshift¶
CREATE OR REPLACE PROCEDURE SP_POSITIONAL_REFERENCES(
INTEGER,
param2 INTEGER,
INTEGER)
AS
$$
DECLARE
localVariable INTEGER := 0;
BEGIN
localVariable := $2 + $3 + $1;
END;
$$
LANGUAGE plpgsql;
出力コード:¶
Snowflake¶
CREATE OR REPLACE PROCEDURE SP_POSITIONAL_REFERENCES (SC_ARG1
INTEGER,
param2 INTEGER, SC_ARG3 INTEGER)
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "redshift", "convertedOn": "03/03/2025", "domain": "test" }}'
AS
$$
DECLARE
localVariable INTEGER := 0;
BEGIN
localVariable := param2 + SC_ARG3 + SC_ARG1;
END;
$$;
既知の問題¶
既知の問題はありません。
関連 EWIs。¶
関連 EWIs はありません。
RAISE¶
説明¶
Use the
RAISE level
statement to report messages and raise errors.
Note
RAISE are fully supported by Snowflake.
文法構文¶
RAISE level 'format' [, variable [, ...]];
Amazon Redshiftでは、 RAISE
ステートメントを使用して、コンソールにメッセージを生成したり、カスタム例外をスローしたりします。Redshiftでは、メッセージの重大度を示すために、さまざまな レベル を指定することができます。Snowflakeでは、指定されたレベルに応じてコンソールへの呼び出しを行うユーザー定義関数(UDF)を使用して、この機能をエミュレートできます。
例外:\ レベルが「EXCEPTION」の場合、次の一般的なメッセージとともにカスタム例外が発生します: 「EXCEPTION MESSAGE を表示するには、ログを確認する必要があります。」 例外コードは
-20002
で、ログ内にカスタムメッセージがあることをユーザーに通知します。これは、Snowflakeでカスタム例外を送信する際の制限によるものです。警告:\ レベルが「WARNING」の場合、
SYSTEM$LOG_WARN
はSnowflakeのログに警告メッセージを出力するために使用され、実行のフローを中断することなく潜在的な問題を強調するのに役立ちます。情報:\ その他のレベル(「INFO」など)では、
SYSTEM$LOG_INFO
を使用してメッセージをコンソールログに出力し、重大な混乱を引き起こすことなくシステムの状態についてより詳細なフィードバックを提供します。
このアプローチでは、Redshiftの重大度レベルの機能をエミュレートし、Snowflakeの構文と機能に適合させながら、実行中に生成されるメッセージと例外の柔軟性と制御を維持することができます。
制限事項
Snowflakeでログを表示するには、
ACCOUNTADMIN
またはSECURITYADMIN
ロールなどの特定の権限が必要です。Snowflakeのログはすぐには利用できないため、情報が表示されるまでに若干の遅れが生じる場合があります。
例外のパーソナライズされたエラーメッセージは、Redshiftのように表示されません。カスタムメッセージを表示するには、ログに直接アクセスする必要があります。
For further information, please refer to the following page.
サンプルソースパターン¶
入力コード:¶
Redshift¶
CREATE OR REPLACE PROCEDURE raise_example(IN user_id INT)
LANGUAGE plpgsql
AS $$
BEGIN
RAISE EXCEPTION 'User % not exists.', user_id;
END;
$$;
出力コード:¶
Snowflake¶
CREATE OR REPLACE PROCEDURE raise_example (user_id INT)
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "redshift", "convertedOn": "02/11/2025", "domain": "test" }}'
AS $$
BEGIN
CALL RAISE_MESSAGE_UDF('EXCEPTION', 'User % not exists.', array_construct(:user_id));
END;
$$;
UDFs ¶
RAISE_MESSAGE_UDF¶
CREATE OR REPLACE PROCEDURE RAISE_MESSAGE_UDF(LEVEL VARCHAR, MESSAGE VARCHAR, ARGS VARIANT)
RETURNS VARCHAR
LANGUAGE SQL
AS
$$
DECLARE
MY_EXCEPTION EXCEPTION (-20002, 'To view the EXCEPTION MESSAGE, you need to check the log.');
SC_RAISE_MESSAGE VARCHAR;
BEGIN
SC_RAISE_MESSAGE := STRING_FORMAT_UDF(MESSAGE, ARGS);
IF (LEVEL = 'EXCEPTION') THEN
SYSTEM$LOG_ERROR(SC_RAISE_MESSAGE);
RAISE MY_EXCEPTION;
ELSEIF (LEVEL = 'WARNING') THEN
SYSTEM$LOG_WARN(SC_RAISE_MESSAGE);
RETURN 'Warning printed successfully';
ELSE
SYSTEM$LOG_INFO(SC_RAISE_MESSAGE);
RETURN 'Message printed successfully';
END IF;
END;
$$;
STRING_FORMAT_UDF¶
CREATE OR REPLACE FUNCTION PUBLIC.STRING_FORMAT_UDF(PATTERN VARCHAR, ARGS VARIANT)
RETURNS VARCHAR
LANGUAGE JAVASCRIPT
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "udf", "convertedOn": "02/11/2025", "domain": "test" }}'
AS
$$
var placeholder_str = "{%}";
var result = PATTERN.replace(/(?<!%)%(?!%)/g, placeholder_str).replace("%%","%");
for (var i = 0; i < ARGS.length; i++)
{
result = result.replace(placeholder_str, ARGS[i]);
}
return result;
$$;
既知の問題¶
既知の問題はありません。
関連 EWIs。¶
関連 EWIs はありません。
RETURN¶
説明¶
RETURN ステートメントは、ストアドプロシージャから呼び出し元に戻ります。(Redshift SQL 言語リファレンスReturn)。
Amazon RedshiftからSnowflakeへのreturnステートメントの変換は簡単で、Snowflakeのreturnステートメントに NULL
を追加することだけを検討します。
文法構文¶
RETURN;
サンプルソースパターン¶
単純なケース¶
入力コード:¶
Redshift¶
CREATE OR REPLACE PROCEDURE procedure1 ()
AS
$$
BEGIN
RETURN;
END
$$ LANGUAGE plpgsql;
出力コード:¶
Redshift¶
CREATE OR REPLACE PROCEDURE procedure1 ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "redshift", "convertedOn": "02/12/2025", "domain": "test" }}'
AS
$$
BEGIN
RETURN NULL;
END
$$;
プロシージャに出力パラメーターがある場合¶
SnowConvert AI returns a variant with parameters set up as output parameters. So, for each return, SnowConvert AI will add a variant as a return value.
入力コード:¶
Redshift¶
CREATE OR REPLACE PROCEDURE procedure1 (OUT output_value VARCHAR)
AS
$$
BEGIN
RETURN;
END
$$ LANGUAGE plpgsql;
出力コード:¶
Redshift¶
CREATE OR REPLACE PROCEDURE procedure1 (output_value OUT VARCHAR)
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "redshift", "convertedOn": "07/16/2025", "domain": "no-domain-provided" }}'
AS
$$
BEGIN
RETURN NULL;
END
$$;
既知の問題¶
既知の問題はありません。
関連 EWIs。¶
関連 EWIs はありません。
SECURITY (DEFINER | INVOKER)¶
説明¶
Amazon Redshiftストアドプロシージャの SECURITY 句は、プロシージャが実行されるアクセス制御と許可コンテキストを定義します。これは、プロシージャが所有者(作成者)と呼び出し元(プロシージャを呼び出すユーザー)のどちらの権限を使用するかを決定します。
文法構文¶
[ { SECURITY INVOKER | SECURITY DEFINER } ]
サンプルソースパターン¶
入力コード:¶
Redshift¶
CREATE OR REPLACE PROCEDURE SP_SECURITY_INVOKER( )
AS
$$
BEGIN
NULL;
END;
$$
LANGUAGE plpgsql
SECURITY INVOKER
;
CREATE OR REPLACE PROCEDURE SP_SECURITY_DEFINER( )
AS
$$
BEGIN
NULL;
END;
$$
LANGUAGE plpgsql
SECURITY DEFINER;
出力コード:¶
Snowflake¶
CREATE OR REPLACE PROCEDURE SP_SECURITY_INVOKER ( )
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "redshift", "convertedOn": "02/07/2025", "domain": "test" }}'
EXECUTE AS CALLER
AS
$$
BEGIN
NULL;
END;
$$
;
CREATE OR REPLACE PROCEDURE SP_SECURITY_DEFINER ( )
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "redshift", "convertedOn": "02/07/2025", "domain": "test" }}'
EXECUTE AS OWNER
AS
$$
BEGIN
NULL;
END;
$$;
既知の問題¶
既知の問題はありません。
関連 EWIs。¶
関連 EWIs はありません。
VARIABLE DECLARATION¶
説明¶
Declare all variables in a block, except for loop variables, in the block's DECLARE section.
Note
変数宣言は Snowflake によって完全にサポートされています。
文法構文¶
DECLARE
name [ CONSTANT ] type [ NOT NULL ] [ { DEFAULT | := } expression ];
Redshiftでは、 CONSTANT
キーワードは実行中の変数の再割り当てを防ぎます。Snowflakeはこのキーワードをサポートしていないため、変換時に削除されます。ロジックは定数変数の再割り当てを試みないため、これは機能に影響しません。
Redshiftの NOT NULL
制約は、変数にnull値を割り当てできないことを保証し、nullでないデフォルト値を要求します。Snowflakeはこの制約をサポートしていないため、変換時に削除されます。ただし、機能を維持するためにデフォルト値が保持されます。
Refcursorで宣言された変数はResultset型に変換されます。 詳細情報を参照してください。
サンプルソースパターン¶
入力コード:¶
Redshift¶
CREATE OR REPLACE PROCEDURE VARIABLE_DECLARATION()
LANGUAGE plpgsql
AS $$
DECLARE
v_simple_int INT;
v_default_char CHAR(4) DEFAULT 'ABCD';
v_default_float FLOAT := 10.00;
v_constant_char CONSTANT CHAR(4) := 'ABCD';
v_notnull VARCHAR NOT NULL DEFAULT 'Test default';
v_refcursor REFCURSOR;
BEGIN
-- Procedure logic
END;
$$;
出力コード:¶
Snowflake¶
CREATE OR REPLACE PROCEDURE VARIABLE_DECLARATION ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "redshift", "convertedOn": "03/03/2025", "domain": "test" }}'
AS $$
DECLARE
v_simple_int INT;
v_default_char CHAR(4) DEFAULT 'ABCD';
v_default_float FLOAT := 10.00;
v_constant_char CHAR(4) := 'ABCD';
--** SSC-FDM-PG0012 - NOT NULL CONSTRAINT HAS BEEN REMOVED. ASSIGNING NULL TO THIS VARIABLE WILL NO LONGER CAUSE A FAILURE. **
v_notnull VARCHAR DEFAULT 'Test default';
v_refcursor RESULTSET;
BEGIN
NULL;
-- Procedure logic
END;
$$;
既知の問題¶
問題は見つかりませんでした。
関連 EWIs¶
SSC-FDM-PG0012: NOT NULL 制約が削除されました。この変数に NULL を割り当てても失敗しなくなりました。
TRANSACTIONS¶
COMMIT¶
説明¶
現在のトランザクションをデータベースにコミットします。このコマンドは、トランザクションからのデータベース更新を永続化します。(Redshift SQL 言語リファレンス COMMIT)
文法構文
COMMIT [WORK | TRANSACTION]
サンプルソースパターン¶
セットアップデータ¶
Redshift¶
Query¶
CREATE TABLE transaction_values_test
(
col1 INTEGER
);
Snowflake¶
Query¶
CREATE TABLE transaction_values_test
(
col1 INTEGER
);
TRANSACTION キーワードを使用した COMMIT¶
Snowflakeでは TRANSACTION キーワードはサポートされていません。しかし、機能には影響しないため、削除されるだけです。
Redshift¶
Query¶
COMMIT TRANSACTION;
Snowflake¶
Query¶
COMMIT;
デフォルトのトランザクション動作プロシージャの COMMIT (NONATOMIC 句なし)¶
Snowflakeのスコープ外のトランザクション例外を回避するために、 COMMIT の使用は、 BEGIN TRANSACTION と一致します。
プロシージャ内に複数の COMMIT ステートメントが存在する場合、Redshiftのトランザクション動作をエミュレートするため、 COMMIT の後に複数の BEGIN TRANSACTION ステートメントが生成されます。
Redshift¶
Query¶
CREATE OR REPLACE PROCEDURE transaction_test(a INT)
LANGUAGE plpgsql
AS $$
BEGIN
INSERT INTO transaction_values_test VALUES (a);
COMMIT;
INSERT INTO transaction_values_test VALUES (a + 1);
COMMIT;
END
$$;
CALL transaction_test(120);
SELECT * FROM transaction_values_test;
Result¶
+------+
| col1 |
+------+
| 120 |
| 121 |
+------+
Snowflake¶
Query¶
CREATE OR REPLACE PROCEDURE transaction_test (a INT)
RETURNS VARCHAR
LANGUAGE SQL
AS $$
BEGIN
BEGIN TRANSACTION;
INSERT INTO transaction_values_test
VALUES (:a);
COMMIT;
BEGIN TRANSACTION;
INSERT INTO transaction_values_test
VALUES (:a + 1);
COMMIT;
END
$$;
CALL transaction_test(120);
SELECT * FROM
transaction_values_test;
Result¶
+------+
| col1 |
+------+
| 120 |
| 121 |
+------+
NONATOMIC 動作のプロシージャの COMMIT¶
Redshiftの NONATOMIC の動作は、セッションパラメーター AUTOCOMMIT をtrueにセットすることでSnowflakeでエミュレートされます。
Since the AUTOCOMMIT session parameter is assumed to be true by SnowConvert AI, the COMMIT statement inside NONATOMIC procedures is left as is.
Redshift¶
Query¶
CREATE OR REPLACE PROCEDURE nonatomic_procedure(a int)
NONATOMIC
LANGUAGE plpgsql
AS $$
BEGIN
INSERT INTO transaction_values_test values (a + 2);
INSERT INTO transaction_values_test values (a + 3);
COMMIT;
END
$$;
CALL nonatomic_procedure(10);
SELECT * FROM transaction_values_test;
Result¶
+------+
| col1 |
+------+
| 12 |
| 13 |
+------+
Snowflake¶
Query¶
CREATE OR REPLACE PROCEDURE nonatomic_procedure (a int)
RETURNS VARCHAR
-- --** SSC-FDM-RS0008 - SNOWFLAKE USES AUTOCOMMIT BY DEFAULT. **
-- NONATOMIC
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "redshift", "convertedOn": "03/03/2025", "domain": "test" }}'
AS $$
BEGIN
INSERT INTO transaction_values_test
values (:a + 2);
INSERT INTO transaction_values_test
values (:a + 3);
COMMIT;
END
$$;
CALL nonatomic_procedure(10);
SELECT * FROM
transaction_values_test;
Result¶
+------+
| col1 |
+------+
| 12 |
| 13 |
+------+
既知の問題¶
1.ネストされたプロシージャ呼び出しの内側の COMMIT
Redshiftでは、 COMMIT ステートメントがネストされたプロシージャ呼び出しで指定されると、コマンドは現在のスコープと親スコープで以前のステートメントからの保留中の作業をすべてコミットします。親スコープアクションのコミットはSnowflakeではサポートされていません。このケースが検出されると、 FDM が生成されます。
Redshift¶
Query¶
CREATE OR REPLACE PROCEDURE transaction_test(a INT)
LANGUAGE plpgsql
AS $$
BEGIN
INSERT INTO transaction_values_test VALUES (a);
COMMIT;
END
$$;
CREATE OR REPLACE PROCEDURE nested_transaction_test(a INT)
LANGUAGE plpgsql
AS $$
BEGIN
INSERT INTO transaction_values_test values (a);
INSERT INTO transaction_values_test values (a + 1);
INSERT INTO transaction_values_test values (a + 2);
CALL transaction_test(a + 3);
END
$$;
Snowflake¶
Query¶
CREATE OR REPLACE PROCEDURE transaction_test (a INT)
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "redshift", "convertedOn": "03/03/2025", "domain": "test" }}'
AS $$
BEGIN
BEGIN TRANSACTION;
INSERT INTO transaction_values_test
VALUES (:a);
COMMIT;
END
$$;
CREATE OR REPLACE PROCEDURE nested_transaction_test (a INT)
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "redshift", "convertedOn": "03/03/2025", "domain": "test" }}'
AS $$
BEGIN
INSERT INTO transaction_values_test
values (:a);
INSERT INTO transaction_values_test
values (:a + 1);
INSERT INTO transaction_values_test
values (:a + 2);
--** SSC-FDM-RS0006 - CALLED PROCEDURE CONTAINS USAGES OF COMMIT/ROLLBACK, MODIFYING THE CURRENT TRANSACTION IN CHILD SCOPES IS NOT SUPPORTED IN SNOWFLAKE **
CALL transaction_test(:a + 3);
END
$$;
既知の問題¶
既知の問題はありません。
関連 EWIs¶
SSC-FDM-RS0006: 呼び出されたプロシージャに COMMIT/ROLLBACK の使用が含まれています。子スコープで現在のトランザクションを変更することはSnowflakeではサポートされていません。
ROLLBACK¶
説明¶
現在のトランザクションを停止し、そのトランザクションによって行われたすべての更新を破棄します。(Redshift SQL 言語リファレンス ROLLBACK)
文法構文
ROLLBACK [WORK | TRANSACTION]
サンプルソースパターン¶
セットアップデータ¶
Redshift¶
Query¶
CREATE TABLE transaction_values_test
(
col1 INTEGER
);
Snowflake¶
Query¶
CREATE TABLE transaction_values_test
(
col1 INTEGER
);
TRANSACTION キーワードを使用した ROLLBACK¶
Snowflakeでは TRANSACTION キーワードはサポートされていません。しかし、機能には影響しないため、削除されるだけです。
Redshift¶
Query¶
ROLLBACK TRANSACTION;
Snowflake¶
Query¶
ROLLBACK;
デフォルトのトランザクション動作プロシージャの ROLLBACK (NONATOMIC 句なし)¶
Snowflakeのスコープ外のトランザクション例外を回避するために、 ROLLBACK の使用は、 BEGIN TRANSACTION と一致します。
プロシージャ内に複数のトランザクション制御ステートメントが存在する場合、Redshiftのトランザクション動作をエミュレートするために、それぞれのステートメントの後に複数の BEGIN TRANSACTION ステートメントが生成されます。
Redshift¶
Query¶
CREATE OR REPLACE PROCEDURE transaction_test(a INT)
LANGUAGE plpgsql
AS $$
BEGIN
INSERT INTO transaction_values_test values (a);
COMMIT;
insert into transaction_values_test values (80);
insert into transaction_values_test values (55);
ROLLBACK;
END
$$;
CALL transaction_test(120);
SELECT * FROM transaction_values_test;
Result¶
+------+
| col1 |
+------+
| 120 |
+------+
Snowflake¶
Query¶
CREATE OR REPLACE PROCEDURE transaction_test (a INT)
RETURNS VARCHAR
LANGUAGE SQL
AS $$
BEGIN
BEGIN TRANSACTION;
INSERT INTO transaction_values_test values (:a);
COMMIT;
BEGIN TRANSACTION;
insert into transaction_values_test values (80);
insert into transaction_values_test values (55);
ROLLBACK;
END
$$;
CALL transaction_test(120);
SELECT * FROM
transaction_values_test;
Result¶
+------+
| col1 |
+------+
| 120 |
+------+
NONATOMIC 動作のプロシージャの ROLLBACK¶
Redshiftの NONATOMIC の動作は、セッションパラメーター AUTOCOMMIT をtrueにセットすることでSnowflakeでエミュレートされます。
Since the AUTOCOMMIT session parameter is assumed to be true by SnowConvert AI, the ROLLBACK statement inside NONATOMIC procedures is left as is.
Redshift¶
Query¶
CREATE OR REPLACE PROCEDURE nonatomic_procedure(a int)
NONATOMIC
LANGUAGE plpgsql
AS $$
BEGIN
INSERT INTO transaction_values_test values (a);
INSERT INTO transaction_values_test values (a + 1);
ROLLBACK;
INSERT INTO transaction_values_test values (a + 2);
INSERT INTO transaction_values_test values (a + 3);
COMMIT;
END
$$;
CALL nonatomic_procedure(10);
SELECT * FROM transaction_values_test;
Result¶
+------+
| col1 |
+------+
| 10 |
| 11 |
| 12 |
| 13 |
+------+
Snowflake¶
Query¶
CREATE OR REPLACE PROCEDURE nonatomic_procedure (a int)
RETURNS VARCHAR
-- --** SSC-FDM-RS0008 - SNOWFLAKE USES AUTOCOMMIT BY DEFAULT. **
-- NONATOMIC
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "redshift", "convertedOn": "03/03/2025", "domain": "test" }}'
AS $$
BEGIN
INSERT INTO transaction_values_test
values (:a);
INSERT INTO transaction_values_test
values (:a + 1);
ROLLBACK;
INSERT INTO transaction_values_test
values (:a + 2);
INSERT INTO transaction_values_test
values (:a + 3);
COMMIT;
END
$$;
CALL nonatomic_procedure(10);
SELECT * FROM
transaction_values_test;
Result¶
+------+
| col1 |
+------+
| 10 |
| 11 |
| 12 |
| 13 |
+------+
既知の問題¶
1.ネストされたプロシージャ呼び出しの内側の ROLLBACK
Redshiftでは、 ROLLBACK ステートメントがネストされたプロシージャ呼び出しで指定されると、コマンドは現在のスコープと親スコープで以前のステートメントからの保留中の作業をすべてコミットします。親スコープアクションのコミットはSnowflakeではサポートされていません。このケースが検出されると、 FDM が生成されます。
Redshift¶
Query¶
CREATE OR REPLACE PROCEDURE transaction_test(a int)
LANGUAGE plpgsql
AS $$
BEGIN
INSERT INTO transaction_values_test values (a);
ROLLBACK;
INSERT INTO transaction_values_test values (a + 1);
END
$$;
CREATE OR REPLACE PROCEDURE nested_transaction_test(a int)
LANGUAGE plpgsql
AS $$
BEGIN
INSERT INTO transaction_values_test values (a);
CALL transaction_test(a + 3);
COMMIT;
END
$$;
Snowflake¶
Query¶
CREATE OR REPLACE PROCEDURE transaction_test (a int)
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "redshift", "convertedOn": "03/03/2025", "domain": "test" }}'
AS $$
BEGIN
BEGIN TRANSACTION;
INSERT INTO transaction_values_test
values (:a);
ROLLBACK;
BEGIN TRANSACTION;
INSERT INTO transaction_values_test
values (:a + 1);
COMMIT;
END
$$;
CREATE OR REPLACE PROCEDURE nested_transaction_test (a int)
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "redshift", "convertedOn": "03/03/2025", "domain": "test" }}'
AS $$
BEGIN
BEGIN TRANSACTION;
INSERT INTO transaction_values_test
values (:a);
--** SSC-FDM-RS0006 - CALLED PROCEDURE CONTAINS USAGES OF COMMIT/ROLLBACK, MODIFYING THE CURRENT TRANSACTION IN CHILD SCOPES IS NOT SUPPORTED IN SNOWFLAKE **
CALL transaction_test(:a + 3);
COMMIT;
END
$$;
2.DDL ステートメントの ROLLBACK
Snowflakeでは、 DDL ステートメントは、プロシージャ内で実行されるたびに暗黙的なコミットを実行し、 DDL 自体と同様に、 DDL 実行前のすべての作業を有効にします。このため、 ROLLBACK ステートメントでは、その時点より前の変更を破棄することができません。この問題は、 FDM を使って通知されます。
Redshift¶
Query¶
CREATE OR REPLACE PROCEDURE rollback_ddl(a int)
LANGUAGE plpgsql
AS $$
BEGIN
INSERT INTO transaction_values_test values (a);
CREATE TABLE someRollbackTable
(
col1 INTEGER
);
INSERT INTO someRollbackTable values (a);
ROLLBACK;
END
$$;
Snowflake¶
Query¶
CREATE OR REPLACE PROCEDURE rollback_ddl (a int)
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "redshift", "convertedOn": "03/03/2025", "domain": "test" }}'
AS $$
BEGIN
BEGIN TRANSACTION;
INSERT INTO transaction_values_test
values (:a);
CREATE TABLE someRollbackTable
(
col1 INTEGER
);
BEGIN TRANSACTION;
INSERT INTO someRollbackTable
values (:a);
--** SSC-FDM-RS0007 - DDL STATEMENTS PERFORM AN AUTOMATIC COMMIT, ROLLBACK WILL NOT WORK AS EXPECTED **
ROLLBACK;
END
$$;
既知の問題¶
既知の問題はありません。
関連 EWIs¶
SSC-FDM-RS0006: 呼び出されたプロシージャに COMMIT/ROLLBACK の使用が含まれています。子スコープで現在のトランザクションを変更することはSnowflakeではサポートされていません。
SSC-FDM-RS0007: DDL ステートメントは自動的に COMMIT を実行しますが、 ROLLBACK は期待通りには動きません。
TRUNCATE¶
説明¶
テーブルスキャンを行わずにテーブルから全ての行を削除します(Redshift SQL 言語リファレンス TRUNCATE)
文法構文
TRUNCATE [TABLE] table_name
サンプルソースパターン¶
セットアップデータ¶
Redshift¶
Query¶
CREATE TABLE transaction_values_test
(
col1 INTEGER
);
Snowflake¶
Query¶
CREATE TABLE transaction_values_test
(
col1 INTEGER
);
デフォルトのトランザクション動作プロシージャの TRUNCATE (NONATOMIC 句なし)¶
TRUNCATE ステートメントは、実行されたトランザクションを自動的にコミットするため、それを使用すると、Snowflakeで COMMIT ステートメントが生成され、この動作をエミュレートします。
COMMIT ステートメントが生成されるので、同じ BEGIN TRANSACTION ステートメント生成が TRUNCATE にも適用されます。詳細は COMMIT 翻訳仕様を確認してください。
Redshift¶
Query¶
CREATE OR REPLACE PROCEDURE truncate_in_procedure(a int)
LANGUAGE plpgsql
AS $$
BEGIN
INSERT INTO transaction_values_test VALUES (a);
TRUNCATE TABLE transaction_values_test;
INSERT INTO transaction_values_test VALUES (a + 12);
COMMIT;
END
$$;
CALL truncate_in_procedure(10);
SELECT * FROM transaction_values_test;
Result¶
+------+
| col1 |
+------+
| 22 |
+------+
Snowflake¶
Query¶
CREATE OR REPLACE PROCEDURE truncate_in_procedure (a int)
RETURNS VARCHAR
LANGUAGE SQL
AS $$
BEGIN
BEGIN TRANSACTION;
INSERT INTO transaction_values_test
VALUES (:a);
TRUNCATE TABLE transaction_values_test;
COMMIT;
BEGIN TRANSACTION;
INSERT INTO transaction_values_test
VALUES (:a + 12);
COMMIT;
END
$$;
CALL truncate_in_procedure(10);
SELECT * FROM
transaction_values_test;
Result¶
+------+
| col1 |
+------+
| 22 |
+------+
NONATOMIC 動作のプロシージャの TRUNCATE¶
Redshiftの NONATOMIC の動作は、セッションパラメーター AUTOCOMMIT をtrueにセットすることでSnowflakeでエミュレートされます。
Since the AUTOCOMMIT session parameter is assumed to be true by SnowConvert AI, the TRUNCATE statement inside NONATOMIC procedures is left as is, there is no need to generate a COMMIT statement because every statement is automatically commited when executed.
Redshift¶
Query¶
CREATE OR REPLACE PROCEDURE nonatomic_procedure(a int)
NONATOMIC
LANGUAGE plpgsql
AS $$
BEGIN
TRUNCATE TABLE transaction_values_test;
INSERT INTO transaction_values_test values (a);
INSERT INTO transaction_values_test values (a + 1);
ROLLBACK;
INSERT INTO transaction_values_test values (a + 2);
INSERT INTO transaction_values_test values (a + 3);
COMMIT;
END
$$;
CALL nonatomic_procedure(10);
SELECT * FROM transaction_values_test;
Result¶
+------+
| col1 |
+------+
| 10 |
| 11 |
| 12 |
| 13 |
+------+
Snowflake¶
Query¶
CREATE OR REPLACE PROCEDURE nonatomic_procedure (a int)
RETURNS VARCHAR
-- --** SSC-FDM-RS0008 - SNOWFLAKE USES AUTOCOMMIT BY DEFAULT. **
-- NONATOMIC
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "redshift", "convertedOn": "03/03/2025", "domain": "test" }}'
AS $$
BEGIN
TRUNCATE TABLE transaction_values_test;
INSERT INTO transaction_values_test
values (:a);
INSERT INTO transaction_values_test
values (:a + 1);
ROLLBACK;
INSERT INTO transaction_values_test
values (:a + 2);
INSERT INTO transaction_values_test
values (:a + 3);
COMMIT;
END
$$;
CALL nonatomic_procedure(10);
SELECT * FROM
transaction_values_test;
Result¶
+------+
| col1 |
+------+
| 10 |
| 11 |
| 12 |
| 13 |
+------+
既知の問題¶
1.ネストされたプロシージャ呼び出しの内側の TRUNCATE
Redshiftでは、 COMMIT ステートメントがネストされたプロシージャ呼び出しで指定されると、コマンドは現在のスコープと親スコープで以前のステートメントからの保留中の作業をすべてコミットします。親スコープアクションのコミットはSnowflakeではサポートされていません。このケースが検出されると、 FDM が生成されます。
Redshift¶
Query¶
CREATE OR REPLACE PROCEDURE transaction_test(a INT)
LANGUAGE plpgsql
AS $$
BEGIN
INSERT INTO transaction_values_test VALUES (a);
TRUNCATE TABLE transaction_values_test;
END
$$;
CREATE OR REPLACE PROCEDURE nested_transaction_test(a INT)
LANGUAGE plpgsql
AS $$
BEGIN
INSERT INTO transaction_values_test values (a);
INSERT INTO transaction_values_test values (a + 1);
INSERT INTO transaction_values_test values (a + 2);
CALL transaction_test(a + 3);
END
$$;
Snowflake¶
Query¶
CREATE OR REPLACE PROCEDURE transaction_test (a INT)
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "redshift", "convertedOn": "03/03/2025", "domain": "test" }}'
AS $$
BEGIN
BEGIN TRANSACTION;
INSERT INTO transaction_values_test
VALUES (:a);
TRUNCATE TABLE transaction_values_test;
COMMIT;
END
$$;
CREATE OR REPLACE PROCEDURE nested_transaction_test (a INT)
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "redshift", "convertedOn": "03/03/2025", "domain": "test" }}'
AS $$
BEGIN
INSERT INTO transaction_values_test
values (:a);
INSERT INTO transaction_values_test
values (:a + 1);
INSERT INTO transaction_values_test
values (:a + 2);
--** SSC-FDM-RS0006 - CALLED PROCEDURE CONTAINS USAGES OF COMMIT/ROLLBACK, MODIFYING THE CURRENT TRANSACTION IN CHILD SCOPES IS NOT SUPPORTED IN SNOWFLAKE **
CALL transaction_test(:a + 3);
END
$$;
既知の問題¶
既知の問題はありません。
関連 EWIs¶
SSC-FDM-RS0006: 呼び出されたプロシージャに COMMIT/ROLLBACK の使用が含まれています。子スコープで現在のトランザクションを変更することはSnowflakeではサポートされていません。
CONDITIONS¶
CASE¶
説明¶
Redshiftの
CASE
ステートメントを使用すると、条件に基づいて値を返すことができ、クエリで条件付きロジックを実現できます。単純と検索の2種類があります。(Redshift SQL 言語リファレンス条件: ケース)。
単純なケース¶
単純な CASE ステートメントは、オペランドの等号に基づく条件実行を提供します。
Note
単純なケースは Snowflake によって完全にサポートされています。
文法構文¶
CASE search-expression
WHEN expression [, expression [ ... ]] THEN
statements
[ WHEN expression [, expression [ ... ]] THEN
statements
... ]
[ ELSE
statements ]
END CASE;
サンプルソースパターン¶
入力コード:¶
Redshift¶
CREATE OR REPLACE PROCEDURE proc1(x INT)
LANGUAGE plpgsql
AS $$
BEGIN
CASE x
WHEN 1, 2 THEN
NULL;
ELSE
NULL;
END CASE;
END;
$$;
出力コード:¶
Redshift¶
CREATE OR REPLACE PROCEDURE proc1 (x INT)
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "redshift", "convertedOn": "02/14/2025", "domain": "test" }}'
AS $$
BEGIN
CASE x
WHEN 1 THEN
NULL;
WHEN 2 THEN
NULL;
ELSE
NULL;
END CASE;
END;
$$;
検索されたケース¶
Note
検索されたケースは Snowflake によって完全にサポートされています。
文法構文¶
CASE
WHEN boolean-expression THEN
statements
[ WHEN boolean-expression THEN
statements
... ]
[ ELSE
statements ]
END CASE;
サンプルソースパターン¶
入力コード:¶
Redshift¶
CREATE PROCEDURE PROC1 (paramNumber int)
LANGUAGE plpgsql
AS $$
DECLARE
result VARCHAR(100);
BEGIN
CASE
WHEN paramNumber BETWEEN 0 AND 10 THEN
result := 'value is between zero and ten';
WHEN paramNumber BETWEEN 11 AND 20 THEN
result := 'value is between eleven and twenty';
END CASE;
END;
$$;
出力コード:¶
Redshift¶
CREATE PROCEDURE PROC1 (paramNumber int)
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "redshift", "convertedOn": "07/11/2025", "domain": "no-domain-provided" }}'
AS $$
DECLARE
result VARCHAR(100);
case_not_found EXCEPTION (-20002, 'Case not found.');
BEGIN
CASE
WHEN paramNumber BETWEEN 0 AND 10 THEN
result := 'value is between zero and ten';
WHEN paramNumber BETWEEN 11 AND 20 THEN
result := 'value is between eleven and twenty';
ELSE
RAISE case_not_found;
END CASE;
END;
$$;
ELSE なしの CASE¶
Redshiftでは、 CASE
式が実行され、検証された条件がどれも満たされず、 ELSE
が定義されていない場合、例外「CASE NOT FOUND」がトリガーされます。Snowflakeでは、コードは実行されますが、結果は返されません。このシナリオでSnowflakeの同じ機能を維持するために、同じ名前の例外が宣言され、 CASE
の条件が満たされない場合に実行されます。
Note
ElseなしのCaseは Snowflake によって完全にサポートされています。
入力コード:¶
Redshift¶
CREATE OR REPLACE PROCEDURE procedure1 (input_value INT)
AS $$
BEGIN
CASE input_value
WHEN 1 THEN
NULL;
END CASE;
END;
$$ LANGUAGE plpgsql;
出力コード:¶
Redshift¶
CREATE OR REPLACE PROCEDURE procedure1 (input_value INT)
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "redshift", "convertedOn": "03/03/2025", "domain": "test" }}'
AS $$
DECLARE
case_not_found EXCEPTION (-20002, 'Case not found.');
BEGIN
CASE input_value
WHEN 1 THEN
NULL;
ELSE
RAISE case_not_found;
END CASE;
END;
$$;
既知の問題¶
既知の問題はありません。
関連 EWIs。¶
関連 EWIs はありません。
IF¶
説明¶
このステートメントを使用すると、特定の条件に基づいて意思決定を行うことができます。(Redshift SQL 言語リファレンス条件: IF)。
SnowConvert AI will add the parenthesis in the conditions and change the keyword ELSIF by ELSEIF since Redshift does not require the parenthesis in the conditions and ELSIF is the keyword.
文法構文¶
IF boolean-expression THEN
statements
[ ELSIF boolean-expression THEN
statements
[ ELSIF boolean-expression THEN
statements
...] ]
[ ELSE
statements ]
END IF;
サンプルソースパターン¶
入力コード:¶
Redshift¶
CREATE PROCEDURE PROC1 (paramNumber int)
LANGUAGE plpgsql
AS $$
DECLARE
result VARCHAR(100);
BEGIN
IF paramNumber = 0 THEN
result := 'zero';
ELSIF paramNumber > 0 THEN
result := 'positive';
ELSIF paramNumber < 0 THEN
result := 'negative';
ELSE
result := 'NULL';
END IF;
END;
$$;
出力コード:¶
Redshift¶
CREATE PROCEDURE PROC1 (paramNumber int)
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "redshift", "convertedOn": "07/11/2025", "domain": "no-domain-provided" }}'
AS $$
DECLARE
result VARCHAR(100);
BEGIN
IF (:paramNumber = 0) THEN
result := 'zero';
ELSEIF (:paramNumber > 0) THEN
result := 'positive';
ELSEIF (:paramNumber < 0) THEN
result := 'negative';
ELSE
result := 'NULL';
END IF;
END;
$$;
既知の問題¶
既知の問題はありません。
関連 EWIs。¶
関連 EWIs はありません。
LOOPS¶
説明¶
これらのステートメントは、指定された条件までコードのブロックを繰り返すために使用されます。(Redshift SQL 言語リファレンスループ)。
CONTINUE¶
説明¶
CONTINUE 条件がtrueの場合、ループは実行を継続でき、falseの場合はループを停止します。(Redshift SQL 言語リファレンス条件: CONTINUE)。
警告
CONTINUE は Snowflake によって部分的にサポートされています。
文法構文¶
CONTINUE [ label ] [ WHEN expression ];
サンプルソースパターン¶
入力コード:¶
Redshift¶
CREATE OR REPLACE PROCEDURE procedure1 (x INT)
LANGUAGE plpgsql
AS $$
DECLARE
i INTEGER := 0;
BEGIN
<<simple_loop_when>>
LOOP
i := i + 1;
CONTINUE WHEN i = 5;
RAISE INFO 'i %', i;
EXIT simple_loop_when WHEN (i >= x);
END LOOP;
END;
$$;
CREATE OR REPLACE PROCEDURE procedure11 (x INT)
LANGUAGE plpgsql
AS $$
DECLARE
i INTEGER := 0;
BEGIN
LOOP
i := i + 1;
IF (I = 5) THEN
CONTINUE;
END IF;
RAISE INFO 'i %', i;
EXIT WHEN (i >= x);
END LOOP;
END;
$$;
Results¶
コンソール出力 |
---|
1 |
2 |
3 |
4 |
6 |
7 |
出力コード:¶
Snowflake¶
CREATE OR REPLACE PROCEDURE procedure1 (x INT)
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "redshift", "convertedOn": "07/11/2025", "domain": "no-domain-provided" }}'
AS $$
DECLARE
i INTEGER := 0;
BEGIN
--** SSC-PRF-0008 - PERFORMANCE REVIEW - LOOP USAGE **
LOOP
i := i + 1;
IF (:i = 5) THEN
CONTINUE;
END IF;
CALL RAISE_MESSAGE_UDF('INFO', 'i %', array_construct(:i));
IF ((:i >= : x)) THEN
EXIT simple_loop_when;
END IF;
END LOOP simple_loop_when;
END;
$$;
CREATE OR REPLACE PROCEDURE procedure11 (x INT)
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "redshift", "convertedOn": "07/11/2025", "domain": "no-domain-provided" }}'
AS $$
DECLARE
i INTEGER := 0;
BEGIN
--** SSC-PRF-0008 - PERFORMANCE REVIEW - LOOP USAGE **
LOOP
i := i + 1;
IF (:I = 5) THEN
CONTINUE;
END IF;
CALL RAISE_MESSAGE_UDF('INFO', 'i %', array_construct(:i));
IF ((:i >= : x)) THEN
EXIT;
END IF;
END LOOP;
END;
$$;
Results¶
コンソール出力 |
---|
1 |
2 |
3 |
4 |
6 |
7 |
既知の問題¶
既知の問題はありません。
関連 EWIs。¶
関連 EWIs はありません。
EXIT¶
説明¶
WHEN ステートメントで定義された条件がtrueになった時にループ実行を停止します(Redshift SQL 言語リファレンス条件: EXIT)。
警告
EXIT は Snowflake によって部分的にサポートされています。
文法構文¶
EXIT [ label ] [ WHEN expression ];
サンプルソースパターン¶
入力コード:¶
Redshift¶
CREATE OR REPLACE PROCEDURE simple_loop_when(x int)
LANGUAGE plpgsql
AS $$
DECLARE i INTEGER := 0;
BEGIN
<<simple_loop_when>>
LOOP
RAISE INFO 'i %', i;
i := i + 1;
EXIT simple_loop_when WHEN (i >= x);
END LOOP;
END;
$$;
出力コード:¶
Redshift¶
CREATE OR REPLACE PROCEDURE simple_loop_when (x int)
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "redshift", "convertedOn": "07/11/2025", "domain": "no-domain-provided" }}'
AS $$
DECLARE
i INTEGER := 0;
BEGIN
--** SSC-PRF-0008 - PERFORMANCE REVIEW - LOOP USAGE **
LOOP
CALL RAISE_MESSAGE_UDF('INFO', 'i %', array_construct(:i));
i := i + 1;
IF ((:i >= : x)) THEN
EXIT simple_loop_when;
END IF;
END LOOP simple_loop_when;
END;
$$;
既知の問題¶
既知の問題はありません。
関連 EWIs。¶
関連 EWIs はありません。
FOR¶
文法構文¶
整数バリアント
[<<label>>]
FOR name IN [ REVERSE ] expression .. expression LOOP
statements
END LOOP [ label ];
サンプルソースパターン¶
入力コード:¶
Redshift¶
CREATE OR REPLACE PROCEDURE procedure1 ()
AS $$
BEGIN
FOR i IN 1..10 LOOP
NULL;
END LOOP;
FOR i IN REVERSE 10..1 LOOP
NULL;
END LOOP;
END;
$$ LANGUAGE plpgsql;
出力コード:¶
Redshift¶
CREATE OR REPLACE PROCEDURE procedure1 ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "redshift", "convertedOn": "07/11/2025", "domain": "no-domain-provided" }}'
AS $$
BEGIN
FOR i IN 1 TO 10
--** SSC-PRF-0008 - PERFORMANCE REVIEW - LOOP USAGE **
LOOP
NULL;
END LOOP;
FOR i IN REVERSE 10 TO 1
--** SSC-PRF-0008 - PERFORMANCE REVIEW - LOOP USAGE **
LOOP
NULL;
END LOOP;
END;
$$;
既知の問題¶
既知の問題はありません。
関連 EWIs。¶
SSC-EWI-PG0006: Reference a variable using the Label is not supported by Snowflake.
LOOP¶
説明¶
単純ループは、EXIT または RETURN ステートメントによって終了するまで、無条件に繰り返されるループを定義します。(Redshift SQL 言語リファレンス条件: 単純ループ)。
警告
単純ループは Snowflake によって部分的にサポートされています。
文法構文¶
[<<label>>]
LOOP
statements
END LOOP [ label ];
サンプルソースパターン¶
入力コード:¶
Redshift¶
CREATE OR REPLACE PROCEDURE simple_loop()
LANGUAGE plpgsql
AS $$
BEGIN
<<simple_while>>
LOOP
RAISE INFO 'I am raised once';
EXIT simple_while;
RAISE INFO 'I am not raised';
END LOOP;
RAISE INFO 'I am raised once as well';
END;
$$;
出力コード:¶
Redshift¶
CREATE OR REPLACE PROCEDURE simple_loop ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "redshift", "convertedOn": "07/11/2025", "domain": "no-domain-provided" }}'
AS $$
BEGIN
--** SSC-PRF-0008 - PERFORMANCE REVIEW - LOOP USAGE **
LOOP
CALL RAISE_MESSAGE_UDF('INFO', 'I am raised once');
EXIT simple_while;
CALL RAISE_MESSAGE_UDF('INFO', 'I am not raised');
END LOOP simple_while;
CALL RAISE_MESSAGE_UDF('INFO', 'I am raised once as well');
END;
$$;
既知の問題¶
既知の問題はありません。
関連 EWIs。¶
関連 EWIs はありません。
WHILE¶
文法構文¶
[<<label>>]
WHILE expression LOOP
statements
END LOOP [ label ];
サンプルソースパターン¶
入力コード:¶
Redshift¶
CREATE OR REPLACE PROCEDURE simple_loop_when()
LANGUAGE plpgsql
AS $$
DECLARE
i INTEGER := 0;
BEGIN
WHILE I > 5 AND I > 10 LOOP
NULL;
END LOOP;
END;
$$;
出力コード:¶
Redshift¶
CREATE OR REPLACE PROCEDURE simple_loop_when ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "redshift", "convertedOn": "07/11/2025", "domain": "no-domain-provided" }}'
AS $$
DECLARE
i INTEGER := 0;
BEGIN
WHILE (:I > 5 AND : I > 10)
--** SSC-PRF-0008 - PERFORMANCE REVIEW - LOOP USAGE **
LOOP
NULL;
END LOOP;
END;
$$;
既知の問題¶
既知の問題はありません。
関連 EWIs。¶
関連 EWIs はありません。
CURSORS¶
CLOSE CURSOR¶
説明¶
開いているカーソルに関連付けられているすべての空きリソースを閉じます。(Redshift SQL 言語リファレンスClose Cursor)。
Note
この構文はSnowflakeで完全にサポートされています。
文法構文¶
CLOSE cursor
サンプルソースパターン¶
入力コード:¶
Redshift¶
CREATE OR REPLACE PROCEDURE cursor_test()
AS $$
BEGIN
CLOSE cursor1;
END;
$$;
出力コード:¶
Redshift¶
CREATE OR REPLACE PROCEDURE cursor_test ()
RETURNS VARCHAR
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "redshift", "convertedOn": "02/05/2025", "domain": "test" }}'
AS $$
BEGIN
CLOSE cursor1;
END;
$$;
既知の問題¶
既知の問題はありません。
関連 EWIs。¶
関連 EWIs はありません。
FETCH CURSOR¶
説明¶
カーソルを使用して行を取得します。(Redshift SQL 言語リファレンスFetch)
変換情報
FETCH [ NEXT | ALL | {FORWARD [ count | ALL ] } ] FROM cursor
FETCH cursor INTO target [, target ...];
サンプルソースパターン¶
セットアップデータ¶
Redshift¶
Query¶
CREATE TABLE cursor_example
(
col1 INTEGER,
col2 VARCHAR(20)
);
INSERT INTO cursor_example VALUES (10, 'hello');
Snowflake¶
Query¶
CREATE TABLE cursor_example
(
col1 INTEGER,
col2 VARCHAR(20)
);
INSERT INTO cursor_example VALUES (10, 'hello');
Fetch into¶
Redshiftの FETCH intoステートメントは、Snowflakeでも完全に同等です
Redshift¶
Query¶
CREATE OR REPLACE PROCEDURE fetch_into_example()
LANGUAGE plpgsql
AS $$
DECLARE my_cursor CURSOR FOR
SELECT col1, col2
FROM cursor_example;
some_id INT;
message VARCHAR(20);
BEGIN
OPEN my_cursor;
FETCH my_cursor INTO some_id, message;
CLOSE my_cursor;
INSERT INTO cursor_example VALUES (some_id * 10, message || ' world!');
END;
$$;
CALL fetch_into_example();
SELECT * FROM cursor_example;
Result¶
+------+-------------+
| col1 | col2 |
+------+-------------+
| 10 | hello |
| 100 | hello world!|
+------+-------------+
Snowflake¶
Query¶
CREATE OR REPLACE PROCEDURE fetch_into_example ()
RETURNS VARCHAR
LANGUAGE SQL
AS $$
DECLARE
my_cursor CURSOR FOR
SELECT col1, col2
FROM
cursor_example;
some_id INT;
message VARCHAR(20);
BEGIN
OPEN my_cursor;
FETCH my_cursor INTO some_id, message;
CLOSE my_cursor;
INSERT INTO cursor_example
VALUES (:some_id * 10, :message || ' world!');
END;
$$;
CALL fetch_into_example();
SELECT * FROM
cursor_example;
Result¶
+------+-------------+
| col1 | col2 |
+------+-------------+
| 10 | hello |
| 100 | hello world!|
+------+-------------+
既知の問題¶
1.ターゲット変数なしのFetchはサポートされていません
Snowflakeでは、 FETCH ステートメントで、取得した行の値を格納する変数を INTO 句で指定する必要があります。INTO 句のないコードで FETCH ステートメントが見つかると、 EWI が生成されます。
入力コード:
FETCH FORWARD FROM cursor1;
出力コード:
!!!RESOLVE EWI!!! /*** SSC-EWI-PG0015 - FETCH CURSOR WITHOUT TARGET VARIABLES IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
FETCH FORWARD FROM cursor1;
既知の問題¶
既知の問題はありません。
関連 EWIs¶
SSC-EWI-PG0015: Fetch cursor without target variables is not supported in Snowflake
OPEN CURSOR¶
説明¶
カーソルを使用して行を取得する前に、カーソルを開く必要があります。(Redshift SQL 言語リファレンスカーソルを開く)。
Note
この構文はSnowflakeで完全にサポートされています。
文法構文¶
OPEN bound_cursor_name [ ( argument_values ) ];
サンプルソースパターン¶
セットアップデータ¶
Redshift¶
Query¶
CREATE TABLE cursor_example
(
col1 INTEGER,
col2 VARCHAR(20)
);
CREATE TABLE cursor_example_results
(
col1 INTEGER,
col2 VARCHAR(20)
);
INSERT INTO cursor_example VALUES (10, 'hello');
Snowflake¶
Query¶
CREATE TABLE cursor_example
(
col1 INTEGER,
col2 VARCHAR(20)
);
CREATE TABLE cursor_example_results
(
col1 INTEGER,
col2 VARCHAR(20)
);
INSERT INTO cursor_example VALUES (10, 'hello');
引数なしでカーソルを開く¶
入力コード:¶
Redshift¶
CREATE OR REPLACE PROCEDURE cursor_test()
AS $$
BEGIN
OPEN cursor1;
END;
$$;
出力コード:¶
Redshift¶
CREATE OR REPLACE PROCEDURE cursor_test ()
RETURNS VARCHAR
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "redshift", "convertedOn": "02/05/2025", "domain": "test" }}'
AS $$
BEGIN
OPEN cursor1;
END;
$$;
引数でカーソルを開く¶
Cursor arguments have to be binded per each one of its uses, SnowConvert AI will generate the bindings, was well as reorder and repeat the passed values to the OPEN statement as needed to satisfy the bindings.
Redshift¶
Query¶
CREATE OR REPLACE PROCEDURE cursor_open_test()
LANGUAGE plpgsql
AS $$
DECLARE
cursor2 CURSOR (val1 VARCHAR(20), val2 INTEGER) FOR SELECT col1 + val2, col2 FROM cursor_example where val1 = col2 and val2 > col1;
res1 INTEGER;
res2 VARCHAR(20);
BEGIN
OPEN cursor2('hello', 50);
FETCH cursor2 INTO res1, res2;
CLOSE cursor2;
INSERT INTO cursor_example_results VALUES (res1, res2);
END;
$$;
call cursor_open_test();
SELECT * FROM cursor_example_results;
Result¶
+------+-------+
| col1 | col2 |
+------+-------+
| 60 | hello |
+------+-------+
Snowflake¶
Query¶
CREATE OR REPLACE PROCEDURE cursor_open_test ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "redshift", "convertedOn": "07/11/2025", "domain": "no-domain-provided" }}'
AS $$
DECLARE
cursor2 CURSOR FOR SELECT col1 + ?, col2 FROM
cursor_example
where
? = col2 and ? > col1;
res1 INTEGER;
res2 VARCHAR(20);
BEGIN
OPEN cursor2 USING (50, 'hello', 50);
FETCH cursor2 INTO res1, res2;
CLOSE cursor2;
INSERT INTO cursor_example_results
VALUES (:res1, : res2);
END;
$$;
call cursor_open_test();
SELECT * FROM
cursor_example_results;
Result¶
+------+-------+
| col1 | col2 |
+------+-------+
| 60 | hello |
+------+-------+
プロシージャパラメーターまたはローカル変数でカーソルを開く¶
The procedure parameters or local variables have to be binded per each one of its uses in the cursor query, SnowConvert AI will generate the bindings and add the parameter or variable names to the OPEN statement, even if the cursor originally had no parameters.
Redshift¶
Query¶
CREATE OR REPLACE PROCEDURE cursor_open_test(someValue iNTEGER)
LANGUAGE plpgsql
AS $$
DECLARE
charVariable VARCHAR(20) DEFAULT 'hello';
cursor2 CURSOR FOR SELECT col1 + someValue, col2 FROM cursor_example where charVariable = col2 and someValue > col1;
res1 INTEGER;
res2 VARCHAR(20);
BEGIN
OPEN cursor2;
FETCH cursor2 INTO res1, res2;
CLOSE cursor2;
INSERT INTO cursor_example_results VALUES (res1, res2);
END;
$$;
call cursor_open_test(30);
Result¶
+------+-------+
| col1 | col2 |
+------+-------+
| 40 | hello |
+------+-------+
Snowflake¶
Query¶
CREATE OR REPLACE PROCEDURE cursor_open_test (someValue iNTEGER)
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "redshift", "convertedOn": "07/11/2025", "domain": "no-domain-provided" }}'
AS $$
DECLARE
charVariable VARCHAR(20) DEFAULT 'hello';
cursor2 CURSOR FOR SELECT col1 + ?, col2 FROM
cursor_example
where
? = col2 and ? > col1;
res1 INTEGER;
res2 VARCHAR(20);
BEGIN
OPEN cursor2 USING (someValue, charVariable, someValue);
FETCH cursor2 INTO res1, res2;
CLOSE cursor2;
INSERT INTO cursor_example_results
VALUES (:res1, : res2);
END;
$$;
call cursor_open_test(30);
Result¶
+------+-------+
| col1 | col2 |
+------+-------+
| 40 | hello |
+------+-------+
既知の問題¶
既知の問題はありません。
関連 EWIs。¶
関連 EWIs はありません。
DECLARE CURSOR¶
説明¶
新しいカーソルを定義します。カーソルを使用して、大きなクエリの結果セットから一度に数行を取得します。(Redshift SQL 言語リファレンスカーソル宣言)。
Note
この構文はSnowflakeで完全にサポートされています。
文法構文¶
name CURSOR [ ( arguments ) ] FOR query
サンプルソースパターン¶
入力コード:¶
入力コード:¶
Redshift¶
CREATE OR REPLACE PROCEDURE cursor_test()
AS $$
DECLARE
-- Declare the cursor
cursor1 CURSOR FOR SELECT 1;
cursor2 CURSOR (key integer) FOR SELECT 2 where 1 = key;
BEGIN
END;
$$;
出力コード:¶
Redshift¶
CREATE OR REPLACE PROCEDURE cursor_test ()
RETURNS VARCHAR
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "redshift", "convertedOn": "03/03/2025", "domain": "test" }}'
AS $$
DECLARE
-- Declare the cursor
cursor1 CURSOR FOR SELECT 1;
cursor2 CURSOR FOR SELECT 2 where 1 = ?;
BEGIN
NULL;
END;
$$;
既知の問題¶
既知の問題はありません。
関連 EWIs。¶
関連 EWIs はありません。
DECLARE REFCURSOR¶
説明¶
refcursor
データ型は、単にカーソルへの参照を保持します。カーソル変数を作成するには、refcursor
型の変数として宣言します
Note
Refcursor宣言は Snowflake によって完全にサポートされています。
文法構文¶
DECLARE
name refcursor;
Snowflakeは REFCURSOR
データ型をサポートしていないため、 REFCURSOR
変数を RESULTSET
型に変換することでその機能を複製します。REFCURSOR
を開くために使用されたクエリは、 RESULTSET
変数に割り当てられます。その後、新しいカーソルが作成され、 RESULTSET
変数にリンクされます。さらに、カーソルロジック内の元の REFCURSOR
の参照はすべて新しいカーソルを使用するように更新され、元の機能が複製されます。
サンプルソースパターン¶
ケース: 1回の使用¶
入力コード:¶
Redshift¶
CREATE OR REPLACE PROCEDURE VARIABLE_REFCURSOR()
LANGUAGE plpgsql
AS $$
DECLARE
v_curs1 refcursor;
BEGIN
OPEN v_curs1 FOR SELECT column1_name, column2_name FROM your_table;
-- Cursor logic
CLOSE v_curs1;
END;
$$;
出力コード:¶
Snowflake¶
CREATE OR REPLACE PROCEDURE VARIABLE_REFCURSOR ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "redshift", "convertedOn": "03/03/2025", "domain": "test" }}'
AS $$
DECLARE
v_curs1 RESULTSET;
BEGIN
v_curs1 := (
SELECT column1_name, column2_name FROM your_table
);
LET v_curs1_Resultset_1 CURSOR
FOR
v_curs1;
OPEN v_curs1_Resultset_1;
-- Cursor logic
CLOSE v_curs1_Resultset_1;
END;
$$;
ケース: 動的Sqlによるカーソル ¶
入力コード:¶
Redshift¶
CREATE OR REPLACE PROCEDURE VARIABLE_REFCURSOR_DYNAMIC(min_salary NUMERIC)
LANGUAGE plpgsql
AS $$
DECLARE
cur refcursor;
qry TEXT;
BEGIN
qry := 'SELECT id, name FROM employees WHERE salary > ' || min_salary;
OPEN cur FOR EXECUTE qry;
-- Cursor logic
CLOSE cur;
END;
$$;
CREATE OR REPLACE PROCEDURE VARIABLE_REFCURSOR_DYNAMIC2(min_salary NUMERIC)
LANGUAGE plpgsql
AS $$
DECLARE
cur refcursor;
BEGIN
OPEN cur FOR EXECUTE 'SELECT id, name FROM employees WHERE salary > ' || min_salary;
-- Cursor logic
CLOSE cur;
END;
$$;
出力コード:¶
Redshift¶
CREATE OR REPLACE PROCEDURE VARIABLE_REFCURSOR_DYNAMIC (min_salary NUMERIC)
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "redshift", "convertedOn": "03/03/2025", "domain": "test" }}'
AS $$
DECLARE
cur RESULTSET;
qry TEXT;
BEGIN
qry := 'SELECT id, name FROM employees WHERE salary > ' || min_salary;
cur := (
EXECUTE IMMEDIATE qry
);
LET cur_Resultset_1 CURSOR
FOR
cur;
OPEN cur_Resultset_1;
-- Cursor logic
CLOSE cur_Resultset_1;
END;
$$;
CREATE OR REPLACE PROCEDURE VARIABLE_REFCURSOR_DYNAMIC2 (min_salary NUMERIC)
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "redshift", "convertedOn": "03/03/2025", "domain": "test" }}'
AS $$
DECLARE
cur RESULTSET;
BEGIN
cur := (
EXECUTE IMMEDIATE 'SELECT id, name FROM employees WHERE salary > ' || min_salary
);
LET cur_Resultset_2 CURSOR
FOR
cur;
OPEN cur_Resultset_2;
-- Cursor logic
CLOSE cur_Resultset_2;
END;
$$;
ケース: 複数の使用: ¶
入力コード:¶
Redshift¶
CREATE OR REPLACE PROCEDURE VARIABLE_REFCURSOR()
LANGUAGE plpgsql
AS $$
DECLARE
v_curs1 refcursor;
BEGIN
OPEN v_curs1 FOR SELECT column1_name, column2_name FROM your_table;
-- Cursor logic
CLOSE v_curs1;
OPEN v_curs1 FOR SELECT column3_name, column4_name FROM your_table2;
-- Cursor logic
CLOSE v_curs1;
END;
$$;
出力コード:¶
Snowflake¶
CREATE OR REPLACE PROCEDURE VARIABLE_REFCURSOR ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "redshift", "convertedOn": "03/03/2025", "domain": "test" }}'
AS $$
DECLARE
v_curs1 RESULTSET;
BEGIN
v_curs1 := (
SELECT column1_name, column2_name FROM your_table
);
LET v_curs1_Resultset_1 CURSOR
FOR
v_curs1;
OPEN v_curs1_Resultset_1;
-- Cursor logic
CLOSE v_curs1_Resultset_1;
v_curs1 := (
SELECT column3_name, column4_name FROM your_table2
);
LET v_curs1_Resultset_2 CURSOR
FOR
v_curs1;
OPEN v_curs1_Resultset_2;
-- Cursor logic
CLOSE v_curs1_Resultset_2;
END;
$$;
既知の問題¶
既知の問題はありません。
関連 EWIs。¶
関連 EWIs はありません。