View a markdown version of this page

SQL ステートメントを Amazon Redshift データウェアハウスに渡す - Amazon Redshift

Amazon Redshift は、2026 年 6 月 30 日以降、Python UDF の使用をサポートしなくなります。これは段階的に実施されます。Python のサポート終了と移行オプションの詳細については、2025 年 6 月 30 日に公開されたブログ記事を参照してください。

SQL ステートメントを Amazon Redshift データウェアハウスに渡す

このページの例は、SQL ステートメントをデータウェアハウスに渡すさまざまな方法について説明しています。

SQL ステートメントを実行する

SQL ステートメントを実行するには、aws redshift-data execute-statement AWS CLI コマンドを使用します。

次の AWS CLI コマンドは、クラスターに対して SQL ステートメントを実行し、結果を取得する識別子を返します。この例では、AWS Secrets Manager の認証方法を使用します。

aws redshift-data execute-statement --secret-arn arn:aws:secretsmanager:us-west-2:123456789012:secret:myuser-secret-hKgPWn --cluster-identifier mycluster-test --sql "select * from stl_query limit 1" --database dev

次は、レスポンスの例です。

{ "ClusterIdentifier": "mycluster-test", "CreatedAt": 1598323175.823, "Database": "dev", "Id": "c016234e-5c6c-4bc5-bb16-2c5b8ff61814", "SecretArn": "arn:aws:secretsmanager:us-west-2:123456789012:secret:myuser-secret-hKgPWn" }

次の AWS CLI コマンドは、クラスターに対して SQL ステートメントを実行し、結果を取得する識別子を返します。この例では、一時的な認証情報認証方法を使用します。

aws redshift-data execute-statement --db-user myuser --cluster-identifier mycluster-test --database dev --sql "select * from stl_query limit 1"

次は、レスポンスの例です。

{ "ClusterIdentifier": "mycluster-test", "CreatedAt": 1598306924.632, "Database": "dev", "DbUser": "myuser", "Id": "d9b6c0c9-0747-4bf4-b142-e8883122f766" }

次の AWS CLI コマンドは、サーバーレスワークグループに対して SQL ステートメントを実行し、結果を取得する識別子を返します。この例では、一時的な認証情報認証方法を使用します。

aws redshift-data execute-statement --database dev --workgroup-name myworkgroup --sql "select 1;"

次は、レスポンスの例です。

{ "CreatedAt": "2022-02-11T06:25:28.748000+00:00", "Database": "dev", "DbUser": "IAMR:RoleName", "Id": "89dd91f5-2d43-43d3-8461-f33aa093c41e", "WorkgroupName": "myworkgroup" }

次の AWS CLI コマンドは、クラスターに対して SQL ステートメントを実行し、結果を取得する識別子を返します。この例では、AWS Secrets Manager 認証方法と冪等性トークンを使用しています。

aws redshift-data execute-statement --secret-arn arn:aws:secretsmanager:us-west-2:123456789012:secret:myuser-secret-hKgPWn --cluster-identifier mycluster-test --sql "select * from stl_query limit 1" --database dev --client-token b855dced-259b-444c-bc7b-d3e8e33f94g1

次は、レスポンスの例です。

{ "ClusterIdentifier": "mycluster-test", "CreatedAt": 1598323175.823, "Database": "dev", "Id": "c016234e-5c6c-4bc5-bb16-2c5b8ff61814", "SecretArn": "arn:aws:secretsmanager:us-west-2:123456789012:secret:myuser-secret-hKgPWn" }

複数の SQL ステートメントを実行する

1 つのコマンドで複数の SQL ステートメントを実行するには、aws redshift-data batch-execute-statementAWS CLI コマンドを実行します。

次の AWS CLI コマンドは、クラスターに対して 3 つの SQL ステートメントを実行し、結果を取得する識別子を返します。この例では、一時的な認証情報認証方法を使用します。

aws redshift-data batch-execute-statement --db-user myuser --cluster-identifier mycluster-test --database dev --sqls "set timezone to BST" "select * from mytable" "select * from another_table"

次は、レスポンスの例です。

{ "ClusterIdentifier": "mycluster-test", "CreatedAt": 1598306924.632, "Database": "dev", "DbUser": "myuser", "Id": "d9b6c0c9-0747-4bf4-b142-e8883122f766" }

パラメータを使用してステートメントを実行する

名前付きパラメータは、execute-statement オペレーションと batch-execute-statement オペレーションの両方で使用できます。batch-execute-statement を使用する場合、パラメータはバッチ内のすべての SQL ステートメント間で共有されます。各 SQL ステートメントは、指定されたパラメータのサブセットを参照できますが、どのパラメータも最低 1 回はどこかの SQL ステートメントで使用する必要があります。

次の AWS CLI コマンドは、クラスターに対して SQL ステートメントを実行し、結果を取得する識別子を返します。この例では、AWS Secrets Manager の認証方法を使用します。SQL テキストには、名前付きパラメータ distance があります。この場合、述部で使用される距離は 5 です。SELECT ステートメントでは、列名の名前付きパラメータは述部でのみ使用できます。SQL ステートメントの名前付きパラメータの値は、parametersオプションで指定できます。

aws redshift-data execute-statement --secret-arn arn:aws:secretsmanager:us-west-2:123456789012:secret:myuser-secret-hKgPWn --cluster-identifier mycluster-test --sql "SELECT ratecode FROM demo_table WHERE trip_distance > :distance" --parameters "[{\"name\": \"distance\", \"value\": \"5\"}]" --database dev

次は、レスポンスの例です。

{ "ClusterIdentifier": "mycluster-test", "CreatedAt": 1598323175.823, "Database": "dev", "Id": "c016234e-5c6c-4bc5-bb16-2c5b8ff61814", "SecretArn": "arn:aws:secretsmanager:us-west-2:123456789012:secret:myuser-secret-hKgPWn" }

次の例では、サンプルデータベースの EVENT テーブルを使用します。詳細については、Amazon Redshift データベースデベロッパーガイドの「EVENT テーブル」を参照してください。

まだデータベースに EVENT テーブルにない場合、Data API を使用して次のように作成できます。

aws redshift-data execute-statement --database dev --cluster-id mycluster-test --db-user awsuser --sql "create table event( eventid integer not null distkey, venueid smallint not null, catid smallint not null, dateid smallint not null sortkey, eventname varchar(200), starttime timestamp)"

次のコマンドは、1 つの行を EVENT テーブルに挿入します。

aws redshift-data execute-statement --database dev --cluster-id mycluster-test --db-user awsuser --sql "insert into event values(:eventid, :venueid::smallint, :catid, :dateid, :eventname, :starttime)" --parameters "[{\"name\": \"eventid\", \"value\": \"1\"}, {\"name\": \"venueid\", \"value\": \"1\"}, {\"name\": \"catid\", \"value\": \"1\"}, {\"name\": \"dateid\", \"value\": \"1\"}, {\"name\": \"eventname\", \"value\": \"event 1\"}, {\"name\": \"starttime\", \"value\": \"2022-02-22\"}]"

次のコマンドは、2 つ目の行を EVENT テーブルに挿入します。この例は以下を示します。

  • id という名前のパラメータは SQL テキストで 4 回使用されます。

  • 暗黙的な型変換は、パラメータ starttime を挿入する際に自動的に適用されます。

  • venueid 列は、SMALLINT データ型にタイプキャストされます。

  • DATE データ型を表す文字列は、TIMESTAMP データ型に暗黙的に変換されます。

  • コメントは SQL テキスト内で使用できます。

aws redshift-data execute-statement --database dev --cluster-id mycluster-test --db-user awsuser --sql "insert into event values(:id, :id::smallint, :id, :id, :eventname, :starttime) /*this is comment, and it won't apply parameterization for :id, :eventname or :starttime here*/" --parameters "[{\"name\": \"eventname\", \"value\": \"event 2\"}, {\"name\": \"starttime\", \"value\": \"2022-02-22\"}, {\"name\": \"id\", \"value\": \"2\"}]"

次に、挿入された 2 つの行を示します。

eventid | venueid | catid | dateid | eventname | starttime ---------+---------+-------+--------+-----------+--------------------- 1 | 1 | 1 | 1 | event 1 | 2022-02-22 00:00:00 2 | 2 | 2 | 2 | event 2 | 2022-02-22 00:00:00

次のコマンドでは、WHERE 句で名前付きパラメータを使用して、eventid1 である行を取得します。

aws redshift-data execute-statement --database dev --cluster-id mycluster-test --db-user awsuser --sql "select * from event where eventid=:id" --parameters "[{\"name\": \"id\", \"value\": \"1\"}]"

次のコマンドを実行して、前の SQL ステートメントの SQL 結果を取得します。

aws redshift-data get-statement-result --id 7529ad05-b905-4d71-9ec6-8b333836eb5a

これにより次の結果が示されます。

{ "Records": [ [ { "longValue": 1 }, { "longValue": 1 }, { "longValue": 1 }, { "longValue": 1 }, { "stringValue": "event 1" }, { "stringValue": "2022-02-22 00:00:00.0" } ] ], "ColumnMetadata": [ { "isCaseSensitive": false, "isCurrency": false, "isSigned": true, "label": "eventid", "length": 0, "name": "eventid", "nullable": 0, "precision": 10, "scale": 0, "schemaName": "public", "tableName": "event", "typeName": "int4" }, { "isCaseSensitive": false, "isCurrency": false, "isSigned": true, "label": "venueid", "length": 0, "name": "venueid", "nullable": 0, "precision": 5, "scale": 0, "schemaName": "public", "tableName": "event", "typeName": "int2" }, { "isCaseSensitive": false, "isCurrency": false, "isSigned": true, "label": "catid", "length": 0, "name": "catid", "nullable": 0, "precision": 5, "scale": 0, "schemaName": "public", "tableName": "event", "typeName": "int2" }, { "isCaseSensitive": false, "isCurrency": false, "isSigned": true, "label": "dateid", "length": 0, "name": "dateid", "nullable": 0, "precision": 5, "scale": 0, "schemaName": "public", "tableName": "event", "typeName": "int2" }, { "isCaseSensitive": true, "isCurrency": false, "isSigned": false, "label": "eventname", "length": 0, "name": "eventname", "nullable": 1, "precision": 200, "scale": 0, "schemaName": "public", "tableName": "event", "typeName": "varchar" }, { "isCaseSensitive": false, "isCurrency": false, "isSigned": false, "label": "starttime", "length": 0, "name": "starttime", "nullable": 1, "precision": 29, "scale": 6, "schemaName": "public", "tableName": "event", "typeName": "timestamp" } ], "TotalNumRows": 1 }

次の AWS CLI コマンドでは、batch-execute-statement を使用して、名前付きパラメータを共有する 2 つの SQL ステートメントをクラスターに対して実行します。SQL テキストには、名前付きパラメータ id および name があります。最初の SQL ステートメントでは id パラメータを使用し、2 番目の SQL ステートメントでは name パラメータを使用します。

aws redshift-data batch-execute-statement --db-user myuser --cluster-identifier mycluster-test --database dev --sqls "SELECT * FROM mytable WHERE id = :id" "SELECT * FROM mytable WHERE name = :name" --parameters "[{\"name\": \"id\", \"value\": \"1\"},{\"name\": \"name\", \"value\": \"Alice\"}]"

次は、レスポンスの例です。

{ "ClusterIdentifier": "mycluster-test", "CreatedAt": 1598306924.632, "Database": "dev", "DbUser": "myuser", "Id": "d9b6c0c9-0747-4bf4-b142-e8883122f766" }

次の AWS CLI コマンドでは 2 つの SQL ステートメントを実行し、両方のステートメントで同じパラメータを使用します。id という名前のパラメータは、INSERT ステートメントと SELECT ステートメントで使用されています。

aws redshift-data batch-execute-statement --db-user myuser --cluster-identifier mycluster-test --database dev --sqls "INSERT INTO mytable VALUES(:id, :name, :address)" "SELECT * FROM mytable WHERE id = :id" --parameters "[{\"name\": \"id\", \"value\": \"1\"},{\"name\": \"name\", \"value\": \"Alice\"},{\"name\": \"address\", \"value\": \"Seattle\"}]"

次は、レスポンスの例です。

{ "ClusterIdentifier": "mycluster-test", "CreatedAt": 1598306924.632, "Database": "dev", "DbUser": "myuser", "Id": "d9b6c0c9-0747-4bf4-b142-e8883122f766" }