提交执行 SQL 语句的请求

本主题说明如何向 SQL API 提交请求。

本主题内容:

要提交 SQL 语句以供执行,请向 /api/v2/statements/ 端点发送一个 POST 请求。有关详细信息,请参阅 POST /api/v2/statements

POST /api/v2/statements HTTP/1.1
(request body)
Copy

设置请求

在请求 URL,可以将查询参数设置为:

对于 请求正文,设置以下字段:

  • statement 字段设置为要执行的 SQL 语句。例如:

    {
      "statement": "select * from my_table",
      ...
    }
    
    Copy

    如果要在单个请求中提交多个语句,请在语句之间使用分号 (;)。有关详细信息,请参阅 在单个请求中提交多个 SQL 语句

  • 如果在语句中包含绑定变量(? 占位符),请将 bindings 字段设置为指定每个变量的相应 Snowflake 数据类型和值的对象。

    有关详细信息,请参阅 在语句中使用绑定变量

  • 要指定要使用的仓库、数据库、架构和角色,请设置 warehousedatabaseschemarole 字段。

    这些字段中的值区分大小写。

    如果省略这些字段, SQL API 将使用用户的相应属性值(即 :doc:` 用户的 DEFAULT_WAREHOUSEDEFAULT_NAMESPACEDEFAULT_ROLE 属性 </sql-reference/sql/alter-user>` )。

  • 要设置语句执行的超时,请将 timeout 字段设置为要等待的最大秒数。如果未设置 timeout 字段,则使用 STATEMENT_TIMEOUT_IN_SECONDS 参数指定的超时。

请求示例

例如,以下 curl 命令发送要执行的 SQL 语句。该示例使用文件 request-body.json 指定请求的正文。

curl -i -X POST \
    -H "Content-Type: application/json" \
    -H "Authorization: Bearer <jwt>" \
    -H "Accept: application/json" \
    -H "User-Agent: myApplicationName/1.0" \
    -H "X-Snowflake-Authorization-Token-Type: KEYPAIR_JWT" \
    -d "@request-body.json" \
    "https://<account_identifier>.snowflakecomputing.cn/api/v2/statements"
Copy

其中:

在此示例中, request-body.json 包含 请求的正文

{
  "statement": "select * from T where c1=?",
  "timeout": 60,
  "database": "TESTDB",
  "schema": "TESTSCHEMA",
  "warehouse": "TESTWH",
  "role": "TESTROLE",
  "bindings": {
    "1": {
      "type": "FIXED",
      "value": "123"
    }
  }
}
Copy

在上面示例的请求正文中:

  • statement 字段指定要执行的 SQL 语句。

    该语句包括一个 :ref:` 绑定变量 <label-sql_api_bind_variables>` ("cl=?" 中的问号),其计算结果为 bindings 字段中指定的第一个绑定 ("1")。

  • timeout 字段指定服务器允许 60 秒的时间执行语句。

  • databaseschemawarehouserole 字段指定在执行语句时应使用的 TESTDB 数据库、TESTSCHEMA 架构、TESTWH 仓库和 TESTROLE 角色。

在语句中使用绑定变量

如果要在语句中使用绑定变量(? 占位符),请使用 bindings 字段指定应插入的值。

将此字段设置为指定每个绑定变量的 Snowflake 数据类型 和值的 JSON 对象。

...
"statement": "select * from T where c1=?",
...
"bindings": {
  "1": {
    "type": "FIXED",
    "value": "123"
  }
},
...
Copy

选择与要绑定的值的类型相对应的绑定类型。例如,如果值是表示日期的 :emph:` 字符串 ` (例如 2021-04-15),并且要将该值插入到 DATE 列中,请使用 TEXT 绑定类型。

下表指定可用于绑定到此预览版本的不同 Snowflake 数据类型type 字段值。

  • 左侧的第一列指定可以使用的绑定类型。

  • 其余列指定计划插入数据的列的 Snowflake 数据类型。

  • 每个单元格指定可用于绑定类型的值类型,以将数据插入到特定 Snowflake 数据类型的列中。

    如果绑定类型和 Snowflake 数据类型的单元格为空,则不能使用指定的绑定类型将数据插入到该 Snowflake 数据类型的列中。

不同 Snowflake 数据类型支持的绑定类型

Snowflake 数据类型

INT / NUMBER

FLOAT

VARCHAR

BINARY

BOOLEAN

DATE

TIME

TIMESTAMP_TZ

TIMESTAMP_LTZ

TIMESTAMP_NTZ

绑定 . 类型

FIXED

整数

整数

整数

0 (false)/非零 (true)

REAL

整数

整数或浮点数

整数或浮点数

0/非 0

TEXT

整数

整数或浮点数

任何文本

十六进制

"true"/ "false"

请参阅下面的备注

请参阅下面的备注

请参阅下面的备注

请参阅下面的备注

请参阅下面的备注

BINARY

十六进制

BOOLEAN

true/false,0/1

true/false

DATE

纪元 (ms)

纪元 (ms)

纪元 (ms)

纪元 (ms)

纪元 (ms)

TIME

纪元 (nano)

纪元 (nano)

TIMESTAMP_TZ

纪元 (nano)

纪元 (nano)

纪元 (nano)

纪元 (nano)

TIMESTAMP_LTZ

纪元 (nano)

纪元 (nano)

纪元 (nano)

纪元 (nano)

纪元 (nano)

纪元 (nano)

TIMESTAMP_NTZ

纪元 (nano)

纪元 (nano)

纪元 (nano)

纪元 (nano)

纪元 (nano)

纪元 (nano)

请注意以下事项:

  • 绑定变量的值必须是字符串(例如,值 1.0 为 "1.0" )。

  • 使用 DATE 绑定类型时,请指定自纪元以来的 毫秒 数。

  • 使用 TIME 或 TIMESTAMP* 绑定类型时,请指定自纪元以来的 纳秒 数。

  • 使用 TIMESTAMP_TZ 绑定类型时,请指定自纪元以来的 纳秒 数,后跟一个空格和时区偏移量(以分钟为单位)(例如 1616173619000000000 960)。

  • 使用 TEXT 绑定类型时:

    • 若要将数据插入到 DATE 列中,可以使用 AUTO 检测支持的任何 日期格式

    • 若要将数据插入到 TIME 列中,可以使用 AUTO 检测支持的任何 时间格式

    • 若要将数据插入到 TIMEZONE* 列中,可以使用 AUTO 检测支持的任何 日期时间格式

如果该值的格式不受 Snowflake 支持,则 API 返回错误:

{
  code: "100037",
  message: "<bind type> value '<value>' is not recognized",
  sqlState: "22018",
  statementHandle: "<ID>"
}
Copy

备注

Snowflake 目前不支持多语句 SQL 请求中的变量绑定。

提交并发请求

Snowflake SQL API 支持向服务器发送并发请求。API 的并发限制由 Snowflake 强制执行的并发限制确定。

根据当前服务器负载,可能会收到 HTTP 429 错误,该错误指示服务器当前接收的请求过多。

要确保应用程序正确处理 429 错误,请将并发请求包装在重试逻辑中。

重新提交执行 SQL 语句的请求

在某些情况下,可能不清楚 Snowflake 是否在 API 请求中执行了 SQL 语句(例如,由于网络错误或超时)。可以选择再次向 Snowflake 重新提交相同的请求,以防 Snowflake 未执行该语句。

但是,如果 Snowflake 已在初始请求中执行了该语句,并且再次重新提交该请求,则该语句将执行两次。对于某些类型的请求,重复执行相同的语句可能会产生意想不到的后果(例如,将重复的数据插入到表中)。

要防止 Snowflake 在重新提交请求时两次执行相同的语句,可以使用请求 ID 将请求与其他请求区分开来。如果在初始请求中指定相同的请求 ID 以及重新提交的请求中的 retry=true 参数,则在语句已成功执行时,Snowflake 不会再次执行该语句。

要指定请求 ID,请生成一个 通用唯一标识符 (UUID) (link removed)。然后,可以在 requestId 查询参数中包含此标识符。还必须将 retry=true 参数指定为请求的一部分,如以下示例所示。

POST /api/v2/statements?requestId=ea7b46ed-bdc1-8c32-d593-764fcad64e83&retry=true HTTP/1.1
Copy

如果 Snowflake 无法处理请求,可以使用相同的请求 ID 再次提交相同的请求。使用相同的请求 ID 会向服务器指示您再次提交相同的请求。

备注

retry=true 参数增加了处理 SQL 语句的开销,因为 Snowflake 必须扫描并匹配语句历史记录中的语句。仅当需要重试语句时,才使用此参数。

语言: 中文