SnowConvert AI - Oracle - CURSOR¶
説明¶
危険
このセクションでは、Oracle 明示的カーソル の翻訳リファレンスについて説明します。Oracle カーソル変数 については、Snowflake Scriptingには同等のものはありません。
注釈
わかりやすくするため、出力コードの一部を省略しています。
カーソルは、ユーザーがクエリ結果を反復処理できるようにするポインターです。Oracleのカーソルの詳細情報については、 こちら をご覧ください。
Oracleのカーソル構文¶
Cursor Definition
CURSOR cursor
[ ( cursor_parameter_dec [, cursor_parameter_dec ]... )]
[ RETURN rowtype] IS select_statement ;
Cursor Open
OPEN cursor [ ( cursor_parameter [ [,] actual_cursor_parameter ]... ) ] ;
Cursor Fetch
FETCH { cursor | cursor_variable | :host_cursor_variable }
{ into_clause | bulk_collect_into_clause [ LIMIT numeric_expression ] } ;
Cursor Close
CLOSE { cursor | cursor_variable | :host_cursor_variable } ;
Cursor Attributes
named_cursor%{ ISOPEN | FOUND | NOTFOUND | ROWCOUNT }
Cursor FOR Loop
[ FOR record IN
{ cursor [ ( cursor_parameter_dec
[ [,] cursor_parameter_dec ]... )]
| ( select_statement )
}
LOOP statement... END LOOP [label] ;
Snowflake Scriptingはカーソルをサポートしていますが、Oracleと比較すると機能は少ないです。これらのカーソルに関する詳しい情報は、 こちら をご覧ください。
Snowflakeスクリプトのカーソル構文¶
カーソル宣言
<cursor_name> CURSOR FOR <query>
Cursor Open
OPEN <cursor_name> [ USING (bind_variable_1 [, bind_variable_2 ...] ) ] ;
Cursor Fetch
FETCH <cursor_name> INTO <variable> [, <variable> ... ] ;
Cursor Close
CLOSE <cursor_name> ;
Cursor FOR Loop
FOR <row_variable> IN <cursor_name> DO
statement;
[ statement; ... ]
END FOR [ <label> ] ;
サンプルソースパターン¶
1.基本的なカーソルの例¶
Oracleのカーソルの例¶
CREATE OR REPLACE PROCEDURE basic_cursor_sample AS
var1 VARCHAR(20);
CURSOR cursor1 IS SELECT region_name FROM hr.regions ORDER BY region_name;
BEGIN
OPEN cursor1;
FETCH cursor1 INTO var1;
CLOSE cursor1;
END;
Snowflakeスクリプトのカーソルの例¶
CREATE OR REPLACE PROCEDURE basic_cursor_sample ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
DECLARE
var1 VARCHAR(20);
--** SSC-PRF-0009 - PERFORMANCE REVIEW - CURSOR USAGE **
cursor1 CURSOR
FOR
SELECT region_name FROM
hr.regions
ORDER BY region_name;
BEGIN
OPEN cursor1;
FETCH cursor1 INTO
:var1;
CLOSE cursor1;
END;
$$;
2.明示的Cursor For Loop¶
Oracleの明示的Cursor For Loopの例¶
CREATE OR REPLACE PROCEDURE explicit_cursor_for_sample AS
CURSOR cursor1 IS SELECT region_name FROM hr.regions ORDER BY region_name;
BEGIN
FOR r1 IN cursor1 LOOP
NULL;
END LOOP;
END;
Snowflakeスクリプトの明示的Cursor For Loopの例¶
CREATE OR REPLACE PROCEDURE explicit_cursor_for_sample ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
DECLARE
--** SSC-PRF-0009 - PERFORMANCE REVIEW - CURSOR USAGE **
cursor1 CURSOR
FOR
SELECT region_name FROM
hr.regions
ORDER BY region_name;
BEGIN
OPEN cursor1;
--** SSC-PRF-0004 - THIS STATEMENT HAS USAGES OF CURSOR FOR LOOP **
FOR r1 IN cursor1 DO
NULL;
END FOR;
CLOSE cursor1;
END;
$$;
3.暗黙的Cursor For Loop¶
Oracleの暗黙的Cursor For Loopの例¶
CREATE OR REPLACE PROCEDURE implicit_cursor_for_sample AS
BEGIN
FOR r1 IN (SELECT region_name FROM hr.regions ORDER BY region_name) LOOP
NULL;
END LOOP;
END;
Snowflakeスクリプトの暗黙的Cursor For Loopの例¶
CREATE OR REPLACE PROCEDURE implicit_cursor_for_sample ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
BEGIN
LET temporary_for_cursor_0 CURSOR
FOR
(SELECT region_name FROM
hr.regions
ORDER BY region_name);
--** SSC-PRF-0004 - THIS STATEMENT HAS USAGES OF CURSOR FOR LOOP **
FOR r1 IN temporary_for_cursor_0 DO
NULL;
END FOR;
END;
$$;
4.パラメーター化されたカーソル¶
「?」を使用できます宣言セクションのカーソルのフィルター条件で、バインド変数を定義します。カーソルを開いている間に、バインド変数を渡すために「USING <bind_variable_1 >」という構文を追加することができます。
以下は、カーソルでパラメーターを使用する際に起こりうるシナリオの例です。
4.1 基本的なカーソルのパラメーター化の例¶
Oracleのパラメーター化カーソルの例¶
CREATE OR REPLACE PROCEDURE parameterized_cursor_for_sample AS
CURSOR cursor1 (low number, high IN number) IS
SELECT region_name FROM hr.regions WHERE region_id BETWEEN low AND high;
BEGIN
OPEN cursor1(3,5);
CLOSE cursor1;
END;
Snowflakeのパラメーター化カーソルの例¶
CREATE OR REPLACE PROCEDURE parameterized_cursor_for_sample ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
DECLARE
--** SSC-PRF-0009 - PERFORMANCE REVIEW - CURSOR USAGE **
cursor1 CURSOR
FOR
SELECT region_name FROM
hr.regions
WHERE region_id BETWEEN ? AND ?;
BEGIN
OPEN cursor1 USING (3, 5);
CLOSE cursor1;
END;
$$;
4.2 複数の送信パラメーターを持つパラメーター化カーソル¶
Oracleのパラメーター化カーソルの例¶
CREATE OR REPLACE PROCEDURE parameterized_cursor_for_sample AS
CURSOR cursor1 (low number DEFAULT 2, high IN number DEFAULT 7) IS
SELECT region_name FROM hr.regions
WHERE region_id BETWEEN low AND high OR low < 0;
BEGIN
OPEN cursor1(3,5);
OPEN cursor1(3);
OPEN cursor1;
OPEN cursor1(high => 15, low => 5);
OPEN cursor1(high => 15);
CLOSE cursor1;
END;
Snowflakeのパラメーター化カーソルの例¶
CREATE OR REPLACE PROCEDURE parameterized_cursor_for_sample ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
DECLARE
--** SSC-PRF-0009 - PERFORMANCE REVIEW - CURSOR USAGE **
cursor1 CURSOR
FOR
SELECT region_name FROM
hr.regions
WHERE region_id BETWEEN ? AND ?
OR ? < 0;
BEGIN
OPEN cursor1 USING (3, 5, 3);
OPEN cursor1 USING (3, 7, 3);
OPEN cursor1 USING (2, 7, 2);
OPEN cursor1 USING (5, 15, 5);
OPEN cursor1 USING (2, 15, 2);
CLOSE cursor1;
END;
$$;
4.3 クエリでプロシージャパラメーターを使用するパラメーター化カーソル¶
Oracleのパラメーター化カーソルの例¶
CREATE OR REPLACE PROCEDURE parameterized_cursor_for_sample (high_param number) AS
CURSOR cursor1 (low number DEFAULT 2) IS
SELECT region_name FROM hr.regions
WHERE region_id BETWEEN low AND high_param;
BEGIN
OPEN cursor1(3);
CLOSE cursor1;
END;
CALL parameterized_cursor_for_sample(5);
Snowflakeのパラメーター化カーソルの例¶
CREATE OR REPLACE PROCEDURE parameterized_cursor_for_sample (high_param NUMBER(38, 18))
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
DECLARE
--** SSC-PRF-0009 - PERFORMANCE REVIEW - CURSOR USAGE **
cursor1 CURSOR
FOR
SELECT region_name FROM
hr.regions
WHERE region_id BETWEEN ? AND ?;
BEGIN
OPEN cursor1 USING (3, high_param);
CLOSE cursor1;
END;
$$;
CALL parameterized_cursor_for_sample(5);
5.FetchとFor Loopでのカーソルの使用¶
カーソルは FOR ステートメントを使用して制御することができ、カーソルの各記録を処理することができます。一方、 FETCH ステートメントは、カーソルによって返された値を記録ごとに変数のセットに格納します。この変数は PLSQL 記録である可能性があります
5.1 Cursors For Loop¶
OracleのCursor For Loopの例¶
CREATE OR REPLACE PROCEDURE p_cursors_for_loop AS
datePlusOne TIMESTAMP;
CURSOR c_product(low number, high number) IS
SELECT name, price, create_on FROM products WHERE price BETWEEN low AND high;
BEGIN
FOR record_product IN c_product(3,5)
LOOP
datePlusOne := record_product.create_on + 1;
INSERT INTO sold_items values(record_product.name, record_product.price, datePlusOne);
END LOOP;
END;
SnowflakeのCursor For Loopの例¶
CREATE OR REPLACE PROCEDURE p_cursors_for_loop ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
DECLARE
datePlusOne TIMESTAMP(6);
--** SSC-PRF-0009 - PERFORMANCE REVIEW - CURSOR USAGE **
c_product CURSOR
FOR
SELECT
OBJECT_CONSTRUCT('NAME', name, 'PRICE', price, 'CREATE_ON', create_on) sc_cursor_record FROM
products
WHERE price BETWEEN ? AND ?;
BEGIN
OPEN c_product USING (3, 5);
--** SSC-PRF-0004 - THIS STATEMENT HAS USAGES OF CURSOR FOR LOOP **
FOR record_product IN c_product DO
LET record_product OBJECT := record_product.sc_cursor_record;
datePlusOne :=
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0036 - TYPES RESOLUTION ISSUES, ARITHMETIC OPERATION '+' MAY NOT BEHAVE CORRECTLY BETWEEN unknown AND Number ***/!!!
record_product.CREATE_ON + 1;
INSERT INTO sold_items
SELECT
:record_product:NAME,
:record_product:PRICE,
:datePlusOne;
END FOR;
CLOSE c_product;
END;
$$;
5.2 Cursors Fetch¶
OracleのCursor Fetchの例¶
CREATE OR REPLACE PROCEDURE p_cursors_fetch AS
record_product products%rowtype;
CURSOR c_product(low number, high number) IS
SELECT * FROM products WHERE price BETWEEN low AND high;
BEGIN
OPEN c_product(3,5);
LOOP
FETCH c_product INTO record_product;
EXIT WHEN c_product%notfound;
INSERT INTO sold_items VALUES (record_product.name, record_product.price);
INSERT INTO sold_items VALUES record_product;
END LOOP;
CLOSE c_product;
END;
SnowflakeのCursor Fetchの例¶
CREATE OR REPLACE PROCEDURE p_cursors_fetch ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "oracle", "convertedOn": "07/14/2025", "domain": "no-domain-provided" }}'
EXECUTE AS CALLER
AS
$$
DECLARE
record_product OBJECT !!!RESOLVE EWI!!! /*** SSC-EWI-0036 - ROWTYPE DATA TYPE CONVERTED TO OBJECT ***/!!! := OBJECT_CONSTRUCT();
--** SSC-PRF-0009 - PERFORMANCE REVIEW - CURSOR USAGE **
c_product CURSOR
FOR
SELECT
OBJECT_CONSTRUCT( *) sc_cursor_record FROM
products
WHERE price BETWEEN ? AND ?;
BEGIN
OPEN c_product USING (3, 5);
--** SSC-PRF-0008 - PERFORMANCE REVIEW - LOOP USAGE **
LOOP
--** SSC-PRF-0003 - FETCH INSIDE A LOOP IS CONSIDERED A COMPLEX PATTERN, THIS COULD DEGRADE SNOWFLAKE PERFORMANCE. **
FETCH c_product INTO
:record_product;
IF (record_product IS NULL) THEN
EXIT;
END IF;
INSERT INTO sold_items
SELECT
:record_product:NAME,
:record_product:PRICE;
INSERT INTO sold_items
SELECT
null !!!RESOLVE EWI!!! /*** SSC-EWI-OR0002 - COLUMNS FROM EXPRESSION products%rowtype NOT FOUND ***/!!!;
END LOOP;
CLOSE c_product;
END;
$$;
既知の問題¶
1.RETURN 句はSnowflake Scriptingのカーソル宣言ではサポートされていません¶
Snowflake Scriptingのカーソル宣言にはこの句はありません。Oracleのカーソル定義からこれを削除することで、機能的等価性を得ることができます。
2.OPEN ステートメントは宣言された引数の値を渡すことはできません¶
カーソルに対して引数を宣言することができても、Snowflake Scriptingではその値を割り当てることはできません。最善の代替案は、バインド変数とともに USING 句を使用することです。
3.FETCH ステートメントで記録を使用することはできません¶
Snowflakeスクリプトは記録をサポートしていません。しかし、 OBJECT データ型と OBJECT_CONSTRUCT()メソッドを使って移行することは可能です。詳細は 記録の種類定義セクション を参照してください。
4.FETCH BULK COLLECT INTO 句はSnowflake Scriptingではサポートされていません¶
Snowflakeスクリプトは BULK COLLECT INTO 句をサポートしていません。しかし、 ARRAY_AGG を一時テーブルと共に使用し、カーソル情報に対応するデータを持つ新しい変数を構築することが可能です。詳細は コレクション一括操作セクション を参照してください。
5.Snowflake Scriptingにカーソル属性は存在しません¶
Oracleカーソルには、カーソルが開かれているかどうかやフェッチされた行数などのステータスをユーザーが確認できるさまざまな属性がありますが、カーソルステータスに関するこれらの属性はSnowflake Scriptingには存在しません。
6.カーソルのクエリはプロシージャの変数やパラメーターにアクセスできません¶
Oracleでは、カーソル宣言のクエリはプロシージャ変数とパラメーターにアクセスできますが、Snowflakeスクリプトではアクセスできません。これに代わる方法として、 USING 句をバインド変数と一緒に使う方法があります。
7. %NOTFOUND attribute is not supported in Snowflake Scripting Cursor¶
Oracleでは、開いているカーソルからの最初のフェッチの前に、cursor_name%NOTFOUND は、最後のフェッチが行を返せなかった場合は TRUE を返し、最後のフェッチが行を返した場合は FALSE を返します。Snowflake Scriptingはこの属性の使用をサポートしていません。代わりに、カーソル結果に割り当てられた変数に値が含まれているかどうかを検証することができます
CURSOR DECLARATION¶
注釈
関連性のないステートメント。
警告
このステートメントは関連性のない構文であるため、移行から削除されることに注意してください。つまり、Snowflakeでは必要ないということです。
注釈
わかりやすくするため、出力コードの一部を省略しています。
説明¶
このセクションでは、Oracleにおけるカーソル宣言の翻訳について説明します。詳細情報については、Oracleの プロシージャ と カーソル に関する以下のドキュメントを参照してください。
サンプルソースパターン¶
CURSOR DECLARATION¶
この例では、 CURSOR ステートメントが削除されていることに注意してください。これはSnowflakeをターゲットにした変換では関係のない構文です。
Oracle¶
CREATE PROCEDURE PROC_COLLECTIONS
AS
CURSOR C2 RETURN T1%TYPE;
BEGIN
NULL;
END
Snowflake¶
CREATE OR REPLACE PROCEDURE PROC_COLLECTIONS ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
BEGIN
NULL;
END;
$$;
既知の問題¶
問題は見つかりませんでした。
関連 EWIs¶
関連 EWIs はありません。
カーソル変数¶
カーソル変数と OPEN FOR ステートメントの翻訳リファレンス
注釈
わかりやすくするため、出力コードの一部を省略しています。
説明¶
カーソル変数は、1つのクエリに限定されない明示的なカーソルのようなものです。
Oracle構文¶
参照カーソルタイプ定義
TYPE type IS REF CURSOR
[ RETURN
{ {db_table_or_view | cursor | cursor_variable}%ROWTYPE
| record%TYPE
| record_type
| ref_cursor_type
}
] ;
カーソル変数宣言
cursor_variable type;
OPEN FOR ステートメント
OPEN { cursor_variable | :host_cursor_variable}
FOR select_statement [ using_clause ] ;
警告
Snowflake Scriptingはカーソル変数や OPEN FOR ステートメントと直接等価ではありませんが、さまざまな回避策でエミュレートし、機能的に等価にすることができます。
サンプルソースパターン¶
1.VARCHAR 変数内の動的 SQL を含む OPEN FOR ステートメント¶
Oracleの例¶
CREATE OR REPLACE PROCEDURE procedure1
AS
query1 VARCHAR(200) := 'SELECT 123 FROM dual';
cursor_var SYS_REFCURSOR;
BEGIN
OPEN cursor_var FOR query1;
CLOSE cursor_var;
END;
Snowflakeスクリプトの例¶
CREATE OR REPLACE PROCEDURE procedure1 ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
DECLARE
query1 VARCHAR(200) := 'SELECT 123 FROM dual';
cursor_var_res RESULTSET;
BEGIN
!!!RESOLVE EWI!!! /*** SSC-EWI-0030 - THE STATEMENT BELOW HAS USAGES OF DYNAMIC SQL. ***/!!!
cursor_var_res := (
EXECUTE IMMEDIATE :query1
);
LET cursor_var CURSOR
FOR
cursor_var_res;
OPEN cursor_var;
CLOSE cursor_var;
END;
$$;
2.文字列リテラル内の動的 SQL を含む OPEN FOR ステートメント¶
Oracleの例¶
CREATE OR REPLACE PROCEDURE procedure2
AS
cursor_var SYS_REFCURSOR;
BEGIN
OPEN cursor_var FOR 'SELECT 123 FROM dual';
CLOSE cursor_var;
END;
Snowflakeスクリプトの例¶
CREATE OR REPLACE PROCEDURE procedure2 ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
DECLARE
cursor_var_res RESULTSET;
BEGIN
!!!RESOLVE EWI!!! /*** SSC-EWI-0030 - THE STATEMENT BELOW HAS USAGES OF DYNAMIC SQL. ***/!!!
cursor_var_res := (
EXECUTE IMMEDIATE 'SELECT 123 FROM dual'
);
LET cursor_var CURSOR
FOR
cursor_var_res;
OPEN cursor_var;
CLOSE cursor_var;
END;
$$;
3.SELECT ステートメントを含む OPEN FOR ステートメント¶
Oracleの例¶
CREATE OR REPLACE PROCEDURE procedure3
AS
cursor_var SYS_REFCURSOR;
BEGIN
OPEN cursor_var FOR SELECT 123 FROM dual;
CLOSE cursor_var;
END;
Snowflakeスクリプトの例¶
CREATE OR REPLACE PROCEDURE procedure3 ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
DECLARE
cursor_var_res RESULTSET;
BEGIN
LET cursor_var CURSOR
FOR
SELECT 123 FROM dual;
OPEN cursor_var;
CLOSE cursor_var;
END;
$$;
4.REF CURSOR 型で宣言されたカーソル変数¶
Oracleの例¶
CREATE OR REPLACE PROCEDURE procedure4
AS
TYPE cursor_ref_type1 IS REF CURSOR;
query1 VARCHAR(200) := 'SELECT 123 FROM dual';
cursor_var cursor_ref_type1;
BEGIN
OPEN cursor_var FOR query1;
CLOSE cursor_var;
END;
Snowflakeスクリプトの例¶
CREATE OR REPLACE PROCEDURE procedure4 ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
DECLARE
-- !!!RESOLVE EWI!!! /*** SSC-EWI-0058 - FUNCTIONALITY FOR 'PL REF CURSOR TYPE DEFINITION' IS NOT CURRENTLY SUPPORTED BY SNOWFLAKE SCRIPTING ***/!!!
-- TYPE cursor_ref_type1 IS REF CURSOR;
query1 VARCHAR(200) := 'SELECT 123 FROM dual';
cursor_var_res RESULTSET;
BEGIN
!!!RESOLVE EWI!!! /*** SSC-EWI-0030 - THE STATEMENT BELOW HAS USAGES OF DYNAMIC SQL. ***/!!!
cursor_var_res := (
EXECUTE IMMEDIATE :query1
);
LET cursor_var CURSOR
FOR
cursor_var_res;
OPEN cursor_var;
CLOSE cursor_var;
END;
$$;
5.USING 句を含む OPEN FOR ステートメント¶
Oracleの例¶
CREATE OR REPLACE PROCEDURE procedure5
AS
query1 VARCHAR(200) := 'SELECT col1 FROM cursortable1 WHERE col1 = :a';
column_filter INTEGER := 1;
cursor_var SYS_REFCURSOR;
BEGIN
OPEN cursor_var FOR query1 USING column_filter;
CLOSE cursor_var;
END;
Snowflakeスクリプトの例¶
CREATE OR REPLACE PROCEDURE procedure5 ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
DECLARE
query1 VARCHAR(200) := 'SELECT col1 FROM
cursortable1
WHERE col1 = ?';
column_filter INTEGER := 1;
cursor_var_res RESULTSET;
BEGIN
!!!RESOLVE EWI!!! /*** SSC-EWI-0030 - THE STATEMENT BELOW HAS USAGES OF DYNAMIC SQL. ***/!!!
cursor_var_res := (
EXECUTE IMMEDIATE :query1 USING ( column_filter)
);
LET cursor_var CURSOR
FOR
cursor_var_res;
OPEN cursor_var;
CLOSE cursor_var;
END;
$$;
既知の問題¶
問題は見つかりませんでした。
関連 EWIs¶
SSC-EWI-0030:以下のステートメントでは、動的 SQL が使用されています。
SSC-EWI-0058:機能は現在、Snowflakeスクリプトではサポートされていません。
PARAMETRIZED CURSOR¶
パラメーター化カーソルはSnowflakeスクリプトではサポートされていません
注釈
わかりやすくするため、出力コードの一部を省略しています。
説明¶
Oracleは宣言されたカーソルのパラメーターをサポートします。しかし、Snowflake Scriptingはこの機能をサポートしていないため、カーソルの宣言や使用はできません。
コード例¶
Oracle¶
CREATE OR REPLACE PROCEDURE parametrized_cursor_sample AS
CURSOR cursor1(param1 number) IS SELECT region_name FROM hr.regions where region_id = param1 ORDER BY region_name;
var1 integer;
BEGIN
OPEN cursor1(123);
FETCH cursor1 INTO var1;
CLOSE cursor1;
FOR r1 IN cursor1(456) LOOP
NULL;
END LOOP;
END;
Snowflake¶
CREATE OR REPLACE PROCEDURE parametrized_cursor_sample ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "oracle", "convertedOn": "07/14/2025", "domain": "no-domain-provided" }}'
EXECUTE AS CALLER
AS
$$
DECLARE
--** SSC-PRF-0009 - PERFORMANCE REVIEW - CURSOR USAGE **
cursor1 CURSOR
FOR
SELECT
OBJECT_CONSTRUCT('REGION_NAME', region_name) sc_cursor_record FROM
hr.regions
where region_id = ?
ORDER BY region_name;
var1 integer;
BEGIN
OPEN cursor1 USING (123);
FETCH cursor1 INTO
:var1;
CLOSE cursor1;
OPEN cursor1 USING (456);
--** SSC-PRF-0004 - THIS STATEMENT HAS USAGES OF CURSOR FOR LOOP **
FOR r1 IN cursor1 DO
LET r1 OBJECT := r1.sc_cursor_record;
NULL;
END FOR;
CLOSE cursor1;
END;
$$;
推奨事項¶
カーソル内のクエリにバインディングを使用し、
USING句でカーソルを開いてみてください。1つのカーソルで複数回使用されるパラメーターは、USING句で変数を複数回渡す必要があることに注意してください。
Snowflakeクエリ¶
CREATE OR REPLACE PROCEDURE PUBLIC.parametrized_cursor_sample_fixed ()
RETURNS VARCHAR
LANGUAGE SQL
EXECUTE AS CALLER
AS
$$
DECLARE
var1 STRING;
cursor1 CURSOR FOR SELECT region_name FROM hr.regions where region_id = ? ORDER BY region_name;
BEGIN
NULL;
OPEN cursor1 USING (1);
FETCH cursor1 INTO var1;
CLOSE cursor1;
OPEN cursor1 USING (2);
FOR r1 IN cursor1 DO
NULL;
END FOR;
CLOSE cursor1;
END;
$$;
バインディングを使用するカーソルを手動で変更します。
さらにサポートが必要な場合は、 snowconvert-support@snowflake.com までメールでお問い合わせください
関連 EWIs¶
SSC-PRF-0004:このステートメントには、cursor for loopが使用されています。
パラメーターまたはプロシージャ変数を使用するカーソルの回避策¶
説明¶
このセクションでは、カーソルのクエリ内でのカーソルパラメーターとプロシージャ変数の使用のシミュレーション方法について説明します。変数やパラメーターの名前は、 ? 記号を使ってバインディングに置き換えられます。そして、カーソルがオープンされた時、値は USING 句で渡されなければなりません。
注釈
Some parts in the output code are omitted for clarity reasons.
ローカル変数を含むカーソル¶
使用される変数やプロシージャパラメーターのために、クエリのバインディングをカーソルで使用し、 USING 句でカーソルをオープンしてください。
Oracleのカーソル¶
CREATE OR REPLACE PROCEDURE oracle_cursor_sample
AS
like_value VARCHAR(255);
CURSOR c1 IS SELECT region_name FROM hr.regions WHERE region_name LIKE like_value ORDER BY region_name;
r_name VARCHAR(255);
BEGIN
like_value := 'E%';
OPEN c1;
FETCH c1 INTO r_name;
CLOSE c1;
like_value := 'A%';
FOR r1 IN c1 LOOP
NULL;
END LOOP;
END;
Snowflakeスクリプトのカーソル¶
CREATE OR REPLACE PROCEDURE oracle_cursor_sample ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "oracle", "convertedOn": "07/14/2025", "domain": "no-domain-provided" }}'
EXECUTE AS CALLER
AS
$$
DECLARE
like_value VARCHAR(255);
--** SSC-PRF-0009 - PERFORMANCE REVIEW - CURSOR USAGE **
c1 CURSOR
FOR
SELECT region_name FROM
hr.regions
WHERE region_name LIKE ?
ORDER BY region_name;
r_name VARCHAR(255);
BEGIN
like_value := 'E%';
OPEN c1 USING (like_value);
FETCH c1 INTO
:r_name;
CLOSE c1;
like_value := 'A%';
OPEN c1;
--** SSC-PRF-0004 - THIS STATEMENT HAS USAGES OF CURSOR FOR LOOP **
FOR r1 IN c1 DO
NULL;
END FOR;
CLOSE c1;
END;
$$;
パラメーターを含むカーソル¶
使用されるパラメーターごとにクエリのバインディングをカーソルで使用し、 USING 句でカーソルを開きます。1つのカーソルで複数回使用されるパラメーターは、 USING 句で変数を複数回渡す必要があることに注意してください。
Oracleのカーソル¶
CREATE OR REPLACE PROCEDURE parametrized_cursor_sample AS
CURSOR cursor1(param1 number) IS SELECT region_name FROM hr.regions where region_id = param1 ORDER BY region_name;
var1 integer;
BEGIN
OPEN cursor1(123);
FETCH cursor1 INTO var1;
CLOSE cursor1;
FOR r1 IN cursor1(456) LOOP
NULL;
END LOOP;
END;
Snowflakeスクリプトのカーソル¶
CREATE OR REPLACE PROCEDURE parametrized_cursor_sample ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
DECLARE
--** SSC-PRF-0009 - PERFORMANCE REVIEW - CURSOR USAGE **
cursor1 CURSOR
FOR
SELECT
OBJECT_CONSTRUCT('REGION_NAME', region_name) sc_cursor_record FROM
hr.regions
where region_id = ?
ORDER BY region_name;
var1 integer;
BEGIN
OPEN cursor1 USING (123);
FETCH cursor1 INTO
:var1;
CLOSE cursor1;
OPEN cursor1 USING (456);
--** SSC-PRF-0004 - THIS STATEMENT HAS USAGES OF CURSOR FOR LOOP **
FOR r1 IN cursor1 DO
LET r1 OBJECT := r1.sc_cursor_record;
NULL;
END FOR;
CLOSE cursor1;
END;
$$;
関連 EWIs¶
SSC-PRF-0004:このステートメントには、cursor for loopが使用されています