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 } ]       
Copy

サンプルソースパターン

入力コード:

Redshift

 CREATE PROCEDURE TEST_PROCEDURE()
LANGUAGE PLPGSQL
AS
$$
BEGIN
    NULL;
END;
$$;
Copy

出力コード:

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;
$$;
Copy

ALIAS DECLARATION

説明

ストアドプロシージャのシグネチャで引数名が省略されている場合は、引数のエイリアスを宣言することができます。

Snowflakeにはこのサポートはありません。

機能的な同等性を達成するため、エイリアスは削除され、使用名はすべて変更されます。

名前のないパラメーターに対してエイリアスが宣言されると、パラメーターと使用に対して生成された名前が作成されます。エイリアスが名前を持つパラメーターの場合、エイリアスは実際のパラメーター名に置き換えられます。

文法構文

 name ALIAS FOR $n;
Copy

サンプルソースパターン

入力コード:

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;
$$;
Copy
出力コード:
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;
$$;
Copy

既知の問題

既知の問題はありません。

関連 EWIs。

関連 EWIs はありません。

ARGUMENTS MODE

説明

Amazon Redshiftのストアドプロシージャは、プロシージャの呼び出し中に渡すことができるパラメーターをサポートしています。これらのパラメーターにより、入力値を提供したり、出力値を取得したり、入出力操作に使用したりすることができます。以下にパラメーターのタイプ、モード、使用例を詳しく説明します。Snowflakeは入力値のみをサポートしています。

IN (入力パラメーター)

目的: プロシージャに値を渡すために使用します。

デフォルトモード: モードが指定されていない場合、パラメーターは IN とみなされます。

動作: プロシージャに渡された値は、プロシージャ内部では変更できません。

OUT (出力パラメーター)

目的: プロシージャから値を返すために使用します。

動作: パラメーターはプロシージャ内部で変更でき、呼び出し元に返されます。初期値は送信できません。

INOUT (入力/出力パラメーター)

目的: 値をプロシージャに渡し、更新された値を返すように変更するために使用します。

動作: IN と OUT の動作を組み合わせたものです。出力に関係なく初期値を送信する必要があります。

文法構文

 [ argname ] [ argmode ] argtype
Copy

サンプルソースパターン

入力コード:

Redshift
CREATE OR REPLACE PROCEDURE SP_PARAMS(
IN PARAM1 INTEGER,
OUT PARAM2 INTEGER,
INOUT PARAM3 INTEGER)
AS 
$$
    BEGIN
        NULL;
    END;
$$ 
LANGUAGE plpgsql;
Copy
出力コード:
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;
$$;
Copy

既知の問題

既知の問題はありません。

関連 EWIs

  1. SCC-EWI-0028 :Snowflakeがサポートしていないタイプです。

  2. SSC-EWI-RS0010 :outパラメーターによるトップレベルプロシージャcallはサポートされていません。

PROCEDURE BODY

説明

Redshiftと同様に、Snowflakeもボディとして $$ procedure_logic $$ を使用したCREATE PROCEDUREをサポートします。Redshiftの構文には違いがあり、 $word$ のように単語を $$ の中に入れたり、 $word$ procedure_logic $word$ のように単語を区切り体として使うことができます。SnowConvert AIは、単語を削除して変換し、 $$ を残します。

文法構文

 AS
$Alias$
  procedure_body
$Alias$ 
Copy

サンプルソースパターン

入力コード:

Redshift
 CREATE OR REPLACE PROCEDURE SP()
AS 
$somename$
BEGIN
   NULL;
END;
$somename$ 
LANGUAGE plpgsql;
Copy
出力コード:
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;
$$;
Copy

既知の問題

既知の問題はありません。

関連 EWIs。

関連 EWIs はありません。

BLOCK STATEMENT

説明

PL/pgSQL はブロック構造言語です。プロシージャの完全な本文は、変数宣言と PL/pgSQL ステートメントを含むブロックで定義されます。ステートメントはネストされたブロックやサブブロックになることもあります。

文法構文

 [ <<label>> ]
[ DECLARE
  declarations ]
BEGIN
  statements
EXCEPTION
  WHEN OTHERS THEN
    statements
END [ label ];
Copy

サンプルソースパターン

入力コード:

Redshift
 CREATE OR REPLACE PROCEDURE MY_PROCEDURE() 
AS 
$$
    BEGIN
        NULL;
    END;
$$ 
LANGUAGE plpgsql;
Copy
出力コード:
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;
$$;
Copy

既知の問題

既知の問題はありません。

関連 EWIs。

関連 EWIs はありません。

DECLARE

説明

ループ変数を除くすべてのプロシージャ変数を宣言するセクションです。\ Redshiftはブロックステートメントごとに複数の DECLARE セクションをサポートしていますが、Snowflakeはこの動作をサポートしていないため、ブロックごとに1つの宣言ステートメントにマージする必要があります。

文法構文

 [ DECLARE declarations ]
Copy

サンプルソースパターン

入力コード:

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;
$$;
Copy
出力コード:
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;
$$;
Copy

既知の問題

既知の問題はありません。

関連 EWIs。

関連 EWIs はありません。

EXCEPTION

説明

例外が発生し、例外処理ブロックを追加すると、 RAISE ステートメントやその他のほとんどの PL/pgSQL ステートメントを記述できます。例えば、カスタムメッセージで例外を発生させたり、ログテーブルに記録を挿入することができます。

文法構文

 EXCEPTION
  WHEN OTHERS THEN
    statements
Copy

サンプルソースパターン

入力コード:

Redshift
 CREATE OR REPLACE PROCEDURE update_employee_sp() AS
$$
BEGIN
    select var;
EXCEPTION WHEN OTHERS THEN
    RAISE INFO 'An exception occurred.';
END;
$$
LANGUAGE plpgsql;
Copy
出力コード:
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;
$$;
Copy

既知の問題

既知の問題はありません。

関連 EWIs。

関連 EWIs はありません。

LABEL

説明

ラベルは、Redshiftでブロックを修飾したり、 EXIT または END ステートメントを使用したりするために使用されます。Snowflakeはラベルをサポートしていません。

警告

Snowflakeではラベルはサポートされていないため、 EWI が印刷されます。

文法構文

 [<<label>>]
BEGIN
    ...
END [label]
Copy

サンプルソースパターン

入力コード:

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;
$$;
Copy
出力コード:
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;
$$;
Copy

既知の問題

既知の問題はありません。

関連 EWIs

  1. SSC-EWI-0094 :ラベル宣言がサポートされていません

NONATOMIC

説明

NONATOMIC はストアドプロシージャの各ステートメントの後にコミットします。Snowflakeは AUTOCOMMIT パラメーターをサポートしています。AUTOCOMMIT のデフォルト設定は TRUE (有効)です。

AUTOCOMMIT が有効になっている間は、明示的トランザクションの外側にある各ステートメントは、その暗黙的な単一ステートメントトランザクションの内側として扱われます。つまり、そのステートメントは、成功すると自動的にコミットされ、失敗すると自動的にロールバックされます。つまり、Snowflakeは「デフォルトで」 NONATOMIC で動作します。

文法構文

 NONATOMIC
Copy

サンプルソースパターン

入力コード:

Redshift
 CREATE OR REPLACE PROCEDURE SP_NONATOMIC()
NONATOMIC 
AS 
$$
    BEGIN
        NULL;
    END;
$$ 
LANGUAGE plpgsql;
Copy
出力コード:
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;
$$;
Copy

既知の問題

既知の問題はありません。

関連 EWIs。

関連 EWIs はありません。

POSITIONAL ARGUMENTS

説明

Redshiftは、$を使用してパラメーターを位置で参照することで、名前のないパラメーターをサポートしています。Snowflakeはこの動作をサポートしていません。機能的な等価性を確保するため、SnowConvert AIは、定義にパラメーター名があれば、パラメーター名でこれらの参照を変換することができます。そうでない場合、SnowConvert AIはパラメーター名を生成し、usesは新しい名前に置き換えられます。

文法構文

 $n
Copy

サンプルソースパターン

入力コード:

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;
Copy
出力コード:
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;
$$;
Copy

既知の問題

既知の問題はありません。

関連 EWIs。

関連 EWIs はありません。

RAISE

説明

メッセージの報告やエラーの発生には、 RAISEレベル ステートメントを使用します。

Redshift SQL言語リファレンスRAISE

注意

RAISEは Snowflake によって完全にサポートされています。

文法構文

 RAISE level 'format' [, variable [, ...]];
Copy

Amazon Redshiftでは、 RAISE ステートメントを使用して、コンソールにメッセージを生成したり、カスタム例外をスローしたりします。Redshiftでは、メッセージの重大度を示すために、さまざまな レベル を指定することができます。Snowflakeでは、指定されたレベルに応じてコンソールへの呼び出しを行うユーザー定義関数(UDF)を使用して、この機能をエミュレートできます。

  1. 例外:\ レベルが「EXCEPTION」の場合、次の一般的なメッセージとともにカスタム例外が発生します: 「EXCEPTION MESSAGE を表示するには、ログを確認する必要があります。」 例外コードは -20002 で、ログ内にカスタムメッセージがあることをユーザーに通知します。これは、Snowflakeでカスタム例外を送信する際の制限によるものです。

  2. 警告:\ レベルが「WARNING」の場合、 SYSTEM$LOG_WARN はSnowflakeのログに警告メッセージを出力するために使用され、実行のフローを中断することなく潜在的な問題を強調するのに役立ちます。

  3. 情報:\ その他のレベル(「INFO」など)では、 SYSTEM$LOG_INFO を使用してメッセージをコンソールログに出力し、重大な混乱を引き起こすことなくシステムの状態についてより詳細なフィードバックを提供します。

このアプローチでは、Redshiftの重大度レベルの機能をエミュレートし、Snowflakeの構文と機能に適合させながら、実行中に生成されるメッセージと例外の柔軟性と制御を維持することができます。

制限事項

  • Snowflakeでログを表示するには、 ACCOUNTADMIN または SECURITYADMIN ロールなどの特定の権限が必要です。

  • Snowflakeのログはすぐには利用できないため、情報が表示されるまでに若干の遅れが生じる場合があります。

  • 例外のパーソナライズされたエラーメッセージは、Redshiftのように表示されません。カスタムメッセージを表示するには、ログに直接アクセスする必要があります。

詳しくは以下のページ をご参照ください。

サンプルソースパターン

入力コード:

Redshift
 CREATE OR REPLACE PROCEDURE raise_example(IN user_id INT)
LANGUAGE plpgsql
AS $$
BEGIN
	RAISE EXCEPTION 'User % not exists.', user_id;
END;
$$;
Copy
出力コード:
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;
$$;
Copy

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;
$$;
Copy
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;
$$;
Copy

既知の問題

既知の問題はありません。

関連 EWIs。

関連 EWIs はありません。

RETURN

説明

RETURN ステートメントは、ストアドプロシージャから呼び出し元に戻ります。(Redshift SQL 言語リファレンスReturn)。

Amazon RedshiftからSnowflakeへのreturnステートメントの変換は簡単で、Snowflakeのreturnステートメントに NULL を追加することだけを検討します。

文法構文

 RETURN;
Copy

サンプルソースパターン

単純なケース

入力コード:
Redshift
 CREATE OR REPLACE PROCEDURE procedure1 ()
AS
$$
BEGIN
   RETURN;
END
$$ LANGUAGE plpgsql;
Copy
出力コード:
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
$$;
Copy

プロシージャに出力パラメーターがある場合

SnowConvert AIは出力パラメーターとして設定されたパラメーターを持つバリアントを返します。そのため、SnowConvert AIは、それぞれのリターンに対して、バリアントが返り値として追加します。

入力コード:
Redshift
 CREATE OR REPLACE PROCEDURE procedure1 (OUT output_value VARCHAR)
AS
$$
BEGIN
   RETURN;
END
$$ LANGUAGE plpgsql;
Copy
出力コード:
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
$$;
Copy

既知の問題

既知の問題はありません。

関連 EWIs。

関連 EWIs はありません。

SECURITY (DEFINER | INVOKER)

説明

Amazon Redshiftストアドプロシージャの SECURITY 句は、プロシージャが実行されるアクセス制御と許可コンテキストを定義します。これは、プロシージャが所有者(作成者)と呼び出し元(プロシージャを呼び出すユーザー)のどちらの権限を使用するかを決定します。

文法構文

 [ { SECURITY INVOKER | SECURITY DEFINER } ]  
Copy

サンプルソースパターン

入力コード:

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;
Copy
出力コード:
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;
$$;
Copy

既知の問題

既知の問題はありません。

関連 EWIs。

関連 EWIs はありません。

VARIABLE DECLARATION

説明

ループ変数を除くブロック内のすべての変数を、ブロックのDECLAREセクションで宣言します。

Redshift SQL言語リファレンス変数宣言

注意

変数宣言は Snowflake によって完全にサポートされています。

文法構文

 DECLARE
name [ CONSTANT ] type [ NOT NULL ] [ { DEFAULT | := } expression ];
Copy

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;
$$;
Copy
出力コード:
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;
$$;
Copy

既知の問題

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

関連 EWIs

  1. SSC-FDM-PG0012: NOT NULL 制約が削除されました。この変数に NULL を割り当てても失敗しなくなりました。

TRANSACTIONS

COMMIT

説明

現在のトランザクションをデータベースにコミットします。このコマンドは、トランザクションからのデータベース更新を永続化します。(Redshift SQL 言語リファレンス COMMIT)

文法構文

COMMIT [WORK | TRANSACTION]

Copy

サンプルソースパターン

セットアップデータ

Redshift
クエリ
 CREATE TABLE transaction_values_test
(
    col1 INTEGER
);
Copy
Snowflake
クエリ
 CREATE TABLE transaction_values_test
(
    col1 INTEGER
);
Copy

TRANSACTION キーワードを使用した COMMIT

Snowflakeでは TRANSACTION キーワードはサポートされていません。しかし、機能には影響しないため、削除されるだけです。

Redshift
クエリ
 COMMIT TRANSACTION;
Copy
Snowflake
クエリ
 COMMIT;
Copy

デフォルトのトランザクション動作プロシージャの COMMIT (NONATOMIC 句なし)

Snowflakeのスコープ外のトランザクション例外を回避するために、 COMMIT の使用は、 BEGIN TRANSACTION と一致します。

プロシージャ内に複数の COMMIT ステートメントが存在する場合、Redshiftのトランザクション動作をエミュレートするため、 COMMIT の後に複数の BEGIN TRANSACTION ステートメントが生成されます。

Redshift
クエリ
 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;
Copy
結果
+------+
| col1 |
+------+
| 120  |
| 121  |
+------+

Copy
Snowflake
クエリ
 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;
Copy
結果
+------+
| col1 |
+------+
| 120  |
| 121  |
+------+

Copy

NONATOMIC 動作のプロシージャの COMMIT

Redshiftの NONATOMIC の動作は、セッションパラメーター AUTOCOMMIT をtrueにセットすることでSnowflakeでエミュレートされます。

AUTOCOMMITセッションパラメーターは、SnowConvert AIによって真であると仮定されるため、NONATOMICプロシージャ内のCOMMITステートメントはそのままです。

Redshift
クエリ
 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;
Copy
結果
+------+
| col1 |
+------+
| 12   |
| 13   |
+------+

Copy
Snowflake
クエリ
 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;
Copy
結果
+------+
| col1 |
+------+
| 12   |
| 13   |
+------+

Copy

既知の問題

1.ネストされたプロシージャ呼び出しの内側の COMMIT

Redshiftでは、 COMMIT ステートメントがネストされたプロシージャ呼び出しで指定されると、コマンドは現在のスコープと親スコープで以前のステートメントからの保留中の作業をすべてコミットします。親スコープアクションのコミットはSnowflakeではサポートされていません。このケースが検出されると、 FDM が生成されます。

Redshift

クエリ
 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
$$;
Copy
Snowflake
クエリ
 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
$$;
Copy

既知の問題

既知の問題はありません。

関連 EWIs

  1. SSC-FDM-RS0006: 呼び出されたプロシージャに COMMIT/ROLLBACK の使用が含まれています。子スコープで現在のトランザクションを変更することはSnowflakeではサポートされていません。

ROLLBACK

説明

現在のトランザクションを停止し、そのトランザクションによって行われたすべての更新を破棄します。(Redshift SQL 言語リファレンス ROLLBACK)

文法構文

ROLLBACK [WORK | TRANSACTION]

Copy

サンプルソースパターン

セットアップデータ

Redshift
クエリ
 CREATE TABLE transaction_values_test
(
    col1 INTEGER
);
Copy
Snowflake
クエリ
 CREATE TABLE transaction_values_test
(
    col1 INTEGER
);
Copy

TRANSACTION キーワードを使用した ROLLBACK

Snowflakeでは TRANSACTION キーワードはサポートされていません。しかし、機能には影響しないため、削除されるだけです。

Redshift
クエリ
 ROLLBACK TRANSACTION;
Copy
Snowflake
クエリ
 ROLLBACK;
Copy

デフォルトのトランザクション動作プロシージャの ROLLBACK (NONATOMIC 句なし)

Snowflakeのスコープ外のトランザクション例外を回避するために、 ROLLBACK の使用は、 BEGIN TRANSACTION と一致します。

プロシージャ内に複数のトランザクション制御ステートメントが存在する場合、Redshiftのトランザクション動作をエミュレートするために、それぞれのステートメントの後に複数の BEGIN TRANSACTION ステートメントが生成されます。

Redshift
クエリ
 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;
Copy
結果
+------+
| col1 |
+------+
| 120  |
+------+

Copy
Snowflake
クエリ
 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;
Copy
結果
+------+
| col1 |
+------+
| 120  |
+------+

Copy

NONATOMIC 動作のプロシージャの ROLLBACK

Redshiftの NONATOMIC の動作は、セッションパラメーター AUTOCOMMIT をtrueにセットすることでSnowflakeでエミュレートされます。

AUTOCOMMITセッションパラメーターは、SnowConvert AIによって真であると仮定されるため、NONATOMICプロシージャ内のROLLBACKステートメントはそのままです。

Redshift
クエリ
 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;
Copy
結果
+------+
| col1 |
+------+
| 10   |
| 11   |
| 12   |
| 13   |
+------+

Copy
Snowflake
クエリ
 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;
Copy
結果
+------+
| col1 |
+------+
| 10   |
| 11   |
| 12   |
| 13   |
+------+

Copy

既知の問題

1.ネストされたプロシージャ呼び出しの内側の ROLLBACK

Redshiftでは、 ROLLBACK ステートメントがネストされたプロシージャ呼び出しで指定されると、コマンドは現在のスコープと親スコープで以前のステートメントからの保留中の作業をすべてコミットします。親スコープアクションのコミットはSnowflakeではサポートされていません。このケースが検出されると、 FDM が生成されます。

Redshift

クエリ
 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
$$;
Copy
Snowflake
クエリ
 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
$$;
Copy

2.DDL ステートメントの ROLLBACK

Snowflakeでは、 DDL ステートメントは、プロシージャ内で実行されるたびに暗黙的なコミットを実行し、 DDL 自体と同様に、 DDL 実行前のすべての作業を有効にします。このため、 ROLLBACK ステートメントでは、その時点より前の変更を破棄することができません。この問題は、 FDM を使って通知されます。

Redshift
クエリ
 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
$$;
Copy
Snowflake
クエリ
 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
$$;
Copy

既知の問題

既知の問題はありません。

関連 EWIs

  1. SSC-FDM-RS0006: 呼び出されたプロシージャに COMMIT/ROLLBACK の使用が含まれています。子スコープで現在のトランザクションを変更することはSnowflakeではサポートされていません。

  2. SSC-FDM-RS0007: DDL ステートメントは自動的に COMMIT を実行しますが、 ROLLBACK は期待通りには動きません。

TRUNCATE

説明

テーブルスキャンを行わずにテーブルから全ての行を削除します(Redshift SQL 言語リファレンス TRUNCATE)

文法構文

TRUNCATE [TABLE] table_name

Copy

サンプルソースパターン

セットアップデータ

Redshift
クエリ
 CREATE TABLE transaction_values_test
(
    col1 INTEGER
);
Copy
Snowflake
クエリ
 CREATE TABLE transaction_values_test
(
    col1 INTEGER
);
Copy

デフォルトのトランザクション動作プロシージャの TRUNCATE (NONATOMIC 句なし)

TRUNCATE ステートメントは、実行されたトランザクションを自動的にコミットするため、それを使用すると、Snowflakeで COMMIT ステートメントが生成され、この動作をエミュレートします。

COMMIT ステートメントが生成されるので、同じ BEGIN TRANSACTION ステートメント生成が TRUNCATE にも適用されます。詳細は COMMIT 翻訳仕様を確認してください。

Redshift
クエリ
 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;
Copy
結果
+------+
| col1 |
+------+
| 22   |
+------+

Copy
Snowflake
クエリ
 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;
Copy
結果
+------+
| col1 |
+------+
| 22   |
+------+

Copy

NONATOMIC 動作のプロシージャの TRUNCATE

Redshiftの NONATOMIC の動作は、セッションパラメーター AUTOCOMMIT をtrueにセットすることでSnowflakeでエミュレートされます。

AUTOCOMMITセッションパラメーターは、SnowConvert AIによって真であると仮定されるため、NONATOMICプロシージャ内のTRUNCATEステートメントはそのままで、実行時にすべてのステートメントが自動的にコミットされるため、COMMITステートメントを生成する必要はありません。

Redshift
クエリ
 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;
Copy
結果
+------+
| col1 |
+------+
| 10   |
| 11   |
| 12   |
| 13   |
+------+

Copy
Snowflake
クエリ
 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;
Copy
結果
+------+
| col1 |
+------+
| 10   |
| 11   |
| 12   |
| 13   |
+------+

Copy

既知の問題

1.ネストされたプロシージャ呼び出しの内側の TRUNCATE

Redshiftでは、 COMMIT ステートメントがネストされたプロシージャ呼び出しで指定されると、コマンドは現在のスコープと親スコープで以前のステートメントからの保留中の作業をすべてコミットします。親スコープアクションのコミットはSnowflakeではサポートされていません。このケースが検出されると、 FDM が生成されます。

Redshift

クエリ
 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
$$;
Copy
Snowflake
クエリ
 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
$$;
Copy

既知の問題

既知の問題はありません。

関連 EWIs

  1. SSC-FDM-RS0006: 呼び出されたプロシージャに COMMIT/ROLLBACK の使用が含まれています。子スコープで現在のトランザクションを変更することはSnowflakeではサポートされていません。

CONDITIONS

CASE

説明

Redshiftの CASE ステートメントを使用すると、条件に基づいて値を返すことができ、クエリで条件付きロジックを実現できます。単純と検索の2種類があります。(Redshift SQL 言語リファレンス条件: ケース)。

単純なケース

単純な CASE ステートメントは、オペランドの等号に基づく条件実行を提供します。

注意

単純なケースは Snowflake によって完全にサポートされています。

文法構文

 CASE search-expression
WHEN expression [, expression [ ... ]] THEN
  statements
[ WHEN expression [, expression [ ... ]] THEN
  statements
  ... ]
[ ELSE
  statements ]
END CASE;
Copy

サンプルソースパターン

入力コード:

Redshift
 CREATE OR REPLACE PROCEDURE proc1(x INT)
LANGUAGE plpgsql
AS $$
BEGIN
  CASE x
WHEN 1, 2 THEN
  NULL;
ELSE
  NULL;
END CASE;                  
END;
$$;
Copy
出力コード:
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;
$$;
Copy

検索されたケース

注意

検索されたケースは Snowflake によって完全にサポートされています。

文法構文

 CASE
WHEN boolean-expression THEN
  statements
[ WHEN boolean-expression THEN
  statements
  ... ]
[ ELSE
  statements ]
END CASE;
Copy

サンプルソースパターン

入力コード:

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;
$$;
Copy
出力コード:
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;
$$;
Copy

ELSE なしの CASE

Redshiftでは、 CASE 式が実行され、検証された条件がどれも満たされず、 ELSE が定義されていない場合、例外「CASE NOT FOUND」がトリガーされます。Snowflakeでは、コードは実行されますが、結果は返されません。このシナリオでSnowflakeの同じ機能を維持するために、同じ名前の例外が宣言され、 CASE の条件が満たされない場合に実行されます。

注意

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;
Copy
出力コード:
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;
$$;
Copy

既知の問題

既知の問題はありません。

関連 EWIs。

関連 EWIs はありません。

IF

説明

このステートメントを使用すると、特定の条件に基づいて意思決定を行うことができます。(Redshift SQL 言語リファレンス条件: IF)。

SnowConvert AIは、条件に括弧を追加し、キーワードELSIFをELSEIFに変更します。Redshiftは条件に括弧を必要とせず、ELSIFがキーワードだからです。

文法構文

 IF boolean-expression THEN
  statements
[ ELSIF boolean-expression THEN
  statements
[ ELSIF boolean-expression THEN
  statements
    ...] ]
[ ELSE
  statements ]
END IF;
Copy

サンプルソースパターン

入力コード:

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;
$$;
Copy
出力コード:
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;
$$;
Copy

既知の問題

既知の問題はありません。

関連 EWIs。

関連 EWIs はありません。

LOOPS

説明

これらのステートメントは、指定された条件までコードのブロックを繰り返すために使用されます。(Redshift SQL 言語リファレンスループ)。

CONTINUE FOR LOOP WHILE EXIT

CONTINUE

説明

CONTINUE 条件がtrueの場合、ループは実行を継続でき、falseの場合はループを停止します。(Redshift SQL 言語リファレンス条件: CONTINUE)。

警告

CONTINUE は Snowflake によって部分的にサポートされています。

文法構文

 CONTINUE [ label ] [ WHEN expression ];
Copy

サンプルソースパターン

入力コード:

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

コンソール出力

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

コンソール出力

1

2

3

4

6

7

既知の問題

既知の問題はありません。

関連 EWIs。

関連 EWIs はありません。

EXIT

説明

WHEN ステートメントで定義された条件がtrueになった時にループ実行を停止します(Redshift SQL 言語リファレンス条件: EXIT)。

警告

EXIT は Snowflake によって部分的にサポートされています。

文法構文

 EXIT [ label ] [ WHEN expression ];
Copy

サンプルソースパターン

入力コード:

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;
$$;   
Copy
出力コード:
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;
$$;
Copy

既知の問題

既知の問題はありません。

関連 EWIs。

関連 EWIs はありません。

FOR

文法構文

整数バリアント

 [<<label>>]
FOR name IN [ REVERSE ] expression .. expression LOOP
  statements
END LOOP [ label ];
Copy

サンプルソースパターン

入力コード:

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;
Copy
出力コード:
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;
$$;
Copy

既知の問題

既知の問題はありません。

関連 EWIs。

  1. SSC-EWI-PG0006 :ラベルを使用した変数の参照は Snowflakeではサポートされていません。

LOOP

説明

単純ループは、EXIT または RETURN ステートメントによって終了するまで、無条件に繰り返されるループを定義します。(Redshift SQL 言語リファレンス条件: 単純ループ)。

警告

単純ループは Snowflake によって部分的にサポートされています。

文法構文

 [<<label>>]
LOOP
  statements
END LOOP [ label ];
Copy

サンプルソースパターン

入力コード:

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;
$$;   
Copy
出力コード:
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;
$$;
Copy

既知の問題

既知の問題はありません。

関連 EWIs。

関連 EWIs はありません。

WHILE

文法構文

 [<<label>>]
WHILE expression LOOP
  statements
END LOOP [ label ];
Copy

サンプルソースパターン

入力コード:

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;
$$;
Copy
出力コード:
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;
$$;
Copy

既知の問題

既知の問題はありません。

関連 EWIs。

関連 EWIs はありません。

CURSORS

CLOSE CURSOR

説明

開いているカーソルに関連付けられているすべての空きリソースを閉じます。(Redshift SQL 言語リファレンスClose Cursor)。

注意

この構文はSnowflakeで完全にサポートされています。

文法構文

 CLOSE cursor
Copy

サンプルソースパターン

入力コード:

Redshift
 CREATE OR REPLACE PROCEDURE cursor_test()
AS $$
BEGIN
   CLOSE cursor1;
END;
$$;
Copy
出力コード:
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;
$$;
Copy

既知の問題

既知の問題はありません。

関連 EWIs。

関連 EWIs はありません。

FETCH CURSOR

説明

カーソルを使用して行を取得します。(Redshift SQL 言語リファレンスFetch)

変換情報

 FETCH [ NEXT | ALL | {FORWARD [ count | ALL ] } ] FROM cursor

FETCH cursor INTO target [, target ...];
Copy

サンプルソースパターン

セットアップデータ

Redshift
クエリ
 CREATE TABLE cursor_example
(
	col1 INTEGER,
	col2 VARCHAR(20)
);

INSERT INTO cursor_example VALUES (10, 'hello');
Copy
Snowflake
クエリ
 CREATE TABLE cursor_example
(
	col1 INTEGER,
	col2 VARCHAR(20)
);

INSERT INTO cursor_example VALUES (10, 'hello');
Copy

Fetch into

Redshiftの FETCH intoステートメントは、Snowflakeでも完全に同等です

Redshift
クエリ
 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;
Copy
結果
+------+-------------+
| col1 | col2        |
+------+-------------+
| 10   | hello       |
| 100  | hello world!|
+------+-------------+

Copy
Snowflake
クエリ
 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;
Copy
結果
+------+-------------+
| col1 | col2        |
+------+-------------+
| 10   | hello       |
| 100  | hello world!|
+------+-------------+

Copy

既知の問題

1.ターゲット変数なしのFetchはサポートされていません

Snowflakeでは、 FETCH ステートメントで、取得した行の値を格納する変数を INTO 句で指定する必要があります。INTO 句のないコードで FETCH ステートメントが見つかると、 EWI が生成されます。

入力コード:

 FETCH FORWARD FROM cursor1;
Copy

出力コード:

 !!!RESOLVE EWI!!! /*** SSC-EWI-PG0015 - FETCH CURSOR WITHOUT TARGET VARIABLES IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
FETCH FORWARD FROM cursor1;
Copy

既知の問題

既知の問題はありません。

関連 EWIs

  1. SSC-EWI-PG0015 :ターゲット変数を使用しないフェッチカーソルはSnowflakeではサポートされていません。

OPEN CURSOR

説明

カーソルを使用して行を取得する前に、カーソルを開く必要があります。(Redshift SQL 言語リファレンスカーソルを開く)。

注意

この構文はSnowflakeで完全にサポートされています。

文法構文

 OPEN bound_cursor_name [ ( argument_values ) ];
Copy

サンプルソースパターン

セットアップデータ

Redshift
クエリ
 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');
Copy
Snowflake
クエリ
 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');
Copy

引数なしでカーソルを開く

入力コード:
Redshift
 CREATE OR REPLACE PROCEDURE cursor_test()
AS $$
BEGIN
   OPEN cursor1;
END;
$$;
Copy
出力コード:
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;
$$;
Copy

引数でカーソルを開く

カーソル引数は使用ごとにバインドされる必要があり、SnowConvert AIは、バインディングを生成し、バインディングを満たすために必要に応じてOPENに渡された値を並べ替えたり、繰り返したりします。

Redshift
クエリ
 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;
Copy
結果
+------+-------+
| col1 | col2  |
+------+-------+
| 60   | hello |
+------+-------+

Copy
Snowflake
クエリ
 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;
Copy
結果
+------+-------+
| col1 | col2  |
+------+-------+
| 60   | hello |
+------+-------+

Copy

プロシージャパラメーターまたはローカル変数でカーソルを開く

プロシージャパラメーターまたはローカル変数は、カーソルクエリでの使用ごとにバインドされなければなりません。SnowConvert AIはバインドを生成し、カーソルが元々パラメーターを持っていなくても、パラメーターまたは変数名をOPENステートメントに追加します。

Redshift
クエリ
 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);
Copy
結果
+------+-------+
| col1 | col2  |
+------+-------+
| 40   | hello |
+------+-------+

Copy
Snowflake
クエリ
 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);
Copy
結果
+------+-------+
| col1 | col2  |
+------+-------+
| 40   | hello |
+------+-------+

Copy

既知の問題

既知の問題はありません。

関連 EWIs。

関連 EWIs はありません。

DECLARE CURSOR

説明

新しいカーソルを定義します。カーソルを使用して、大きなクエリの結果セットから一度に数行を取得します。(Redshift SQL 言語リファレンスカーソル宣言)。

注意

この構文はSnowflakeで完全にサポートされています。

文法構文

 name CURSOR [ ( arguments ) ] FOR query 
Copy

サンプルソースパターン

入力コード:

入力コード:

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;
$$;
Copy
出力コード:
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;
$$;
Copy

既知の問題

既知の問題はありません。

関連 EWIs。

関連 EWIs はありません。

DECLARE REFCURSOR

説明

refcursor データ型は、単にカーソルへの参照を保持します。カーソル変数を作成するには、 refcursor 型の変数として宣言します

(Redshift SQL 言語リファレンスRefcursor宣言)

注意

Refcursor宣言は Snowflake によって完全にサポートされています。

文法構文

 DECLARE
name refcursor;
Copy

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;
$$;
Copy
出力コード:
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;
$$;
Copy
ケース: 動的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;
$$;
Copy
出力コード:
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;
$$;
Copy
ケース: 複数の使用:
入力コード:
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;
$$;
Copy
出力コード:
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;
$$;
Copy

既知の問題

既知の問題はありません。

関連 EWIs。

関連 EWIs はありません。