Transmission d'instructions SQL à un entrepôt de données Amazon Redshift - Amazon Redshift

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Transmission d'instructions SQL à un entrepôt de données Amazon Redshift

Les exemples présentés dans cette page présentent différentes manières de transmettre une instruction SQL à votre entrepôt de données.

Exécuter une instruction SQL

Pour exécuter une instruction SQL, utilisez la aws redshift-data execute-statement AWS CLI commande.

La AWS CLI commande suivante exécute une instruction SQL sur un cluster et renvoie un identifiant pour récupérer les résultats. Cet exemple utilise la méthode AWS Secrets Manager d'authentification.

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

Voici un exemple de réponse.

{ "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" }

La AWS CLI commande suivante exécute une instruction SQL sur un cluster et renvoie un identifiant pour récupérer les résultats. Cet exemple utilise la méthode d’authentification par informations d’identification temporaires.

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

Voici un exemple de réponse.

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

La AWS CLI commande suivante exécute une instruction SQL sur un groupe de travail sans serveur et renvoie un identifiant pour récupérer les résultats. Cet exemple utilise la méthode d’authentification par informations d’identification temporaires.

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

Voici un exemple de réponse.

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

La AWS CLI commande suivante exécute une instruction SQL sur un cluster et renvoie un identifiant pour récupérer les résultats. Cet exemple utilise la méthode AWS Secrets Manager d'authentification et un jeton d'idempuissance.

aws redshift-data execute-statement --secret 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

Voici un exemple de réponse.

{ "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" }

Exécuter une instruction SQL avec des paramètres

Pour exécuter une instruction SQL, utilisez la aws redshift-data execute-statement AWS CLI commande.

La AWS CLI commande suivante exécute une instruction SQL sur un cluster et renvoie un identifiant pour récupérer les résultats. Cet exemple utilise la méthode AWS Secrets Manager d'authentification. Le texte SQL a un paramètre nommé distance. Dans ce cas, la distance utilisée dans le prédicat est 5. Dans une instruction SELECT, les paramètres nommés pour les noms de colonnes ne peuvent être utilisés que dans le prédicat. Les valeurs des paramètres nommés pour l’instruction SQL sont spécifiées dans l’option parameters.

aws redshift-data execute-statement --secret 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

Voici un exemple de réponse.

{ "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" }

L’exemple de requête suivant utilise la table EVENT de l’exemple de base de données. Pour plus d’informations, consultez Table EVENT dans le Manuel du développeur de bases de données Amazon Redshift.

Si la table EVENT n’existe pas encore dans votre base de données, vous pouvez en créer une à l’aide de l’API de données comme suit :

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)"

L’instruction suivante insère une ligne dans la table 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\"}]"

L’instruction suivante insère une deuxième ligne dans la table EVENT. Cet exemple illustre ce scénario :

  • Le paramètre nommé id est utilisé quatre fois dans le texte SQL.

  • La conversion de type implicite est appliquée automatiquement lors de l’insertion d’un paramètre starttime.

  • La colonne venueid est convertie en type de données SMALLINT.

  • Les chaînes de caractères qui représentent le type de données DATE sont implicitement converties en type de données TIMESTAMP.

  • Les commentaires peuvent être utilisés dans le texte 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\"}]"

Voici les deux lignes insérées :

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

La commande suivante utilise un paramètre nommé dans une clause WHERE pour récupérer la ligne où eventid est 1.

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\"}]"

Exécutez l’instruction suivante pour obtenir les résultats SQL de l’instruction SQL précédente :

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

Fournit les résultats suivants :

{ "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 }

Exécuter plusieurs instructions SQL

Pour exécuter plusieurs instructions SQL avec une seule commande, utilisez la aws redshift-data batch-execute-statement AWS CLI commande.

La AWS CLI commande suivante exécute trois instructions SQL sur un cluster et renvoie un identifiant pour récupérer les résultats. Cet exemple utilise la méthode d’authentification par informations d’identification temporaires.

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"

Voici un exemple de réponse.

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