JDBC 驱动程序 API 支持

Snowflake JDBC 驱动程序是 JDBC 4 型驱动程序,支持 JDBC API 版本 1.0 中的核心 JDBC 功能。欢迎您尝试来自 API 更高版本的方法,但是 Snowflake 不保证支持这些方法。

Snowflake JDBC 驱动程序需要 Java LTS(长期支持)版本 1.8 或更高版本。该驱动程序需要 java.sql 包,该包包含在 Java 的 Standard Edition (SE) 和 Enterprise Edition (EE) 中。

该驱动程序可用于大多数支持 JDBC 的客户端工具和应用程序,以连接到数据库服务器。

本主题不记录整个 JDBC API。相反,本主题:

  • 列出了 JDBC API 支持的接口以及每个接口中支持的方法。

  • 记录 Snowflake 扩展 JDBC API 标准的区域。

  • 记录 JDBC API 标准不明确以及 Snowflake 实现的行为可能与其他系统不同的区域。

一般来说,如果调用方法失败,该方法将引发异常(例如 SQLException)。

受支持的 JDBC 接口按字母顺序列出,并与相应的 Snowflake 扩展类配对(如果适用)。

本主题内容:

对象:CallableStatement

CallableStatement 用于执行存储过程。

方法

方法名称

备注

支持的方法

getBigDecimal(int, int)

getBoolean(int)

getByte(int)

getBytes(int)

getDate(int)

getDouble(int)

getFloat(int)

getInt(int)

getLong(int)

getObject(int)

getShort(int)

getString(int)

getTime(int)

getTimestamp(int)

registerOutParameter(int, int, int)

registerOutParameter(int, int)

wasNull()

不支持的方法

无。

Snowflake 特定行为

无。

接口:SnowflakeCallableStatement

SnowflakeCallableStatement 接口包含特定于 Snowflake 的方法。当使用 Snowflake JDBC 驱动程序创建 CallableStatement 类型的对象时,例如通过调用 Connection.prepareCall() 方法,您实际上获得了一个不同的(隐藏的)Snowflake 特定类型的对象,该对象实现了 JDBC CallableStatement 接口和 SnowflakeCallableStatement 接口。要访问该对象中的 SnowflakeCallableStatement 方法,需要 :ref:` 展开 <label-JDBC_unwrapping>` 该对象。

其他方法

方法名称

描述

getQueryID()

返回此 CallableStatement 最近执行的查询的 Snowflake 查询 ID

getQueryID()
目的:

此方法返回此 CallableStatement 最近执行的查询的 Snowflake 查询 ID。如果尚未使用 callable 语句执行任何查询,则该方法返回 null。

实参:

无。

返回:

此方法以字符串形式返回 ID,其中包含 UUID。有关 UUIDs 的信息包含在 SQL 函数 UUID_STRING 的描述中。

抛出:

该方法可以抛出 SQLException

对象:Connection

Connection 对象表示与数据库服务器的连接。连接对象不仅允许用户连接到特定的数据库服务器,还允许用户创建 Statement 对象,这些对象可用于执行 SQL 语句。

方法

方法名称

备注

支持的方法

abort()

clearWarnings()

close()

特定于 Snowflake 的行为(见下文)。

commit()

createStatement()

createStatement(int, int)

createStatement(int, int, int)

getAutoCommit()

getCatalog()

getClientInfo()

getHoldability()

getMetaData()

特定于 Snowflake 的行为(见下文)。

getSchema()

getTransactionIsolation()

getTypeMap()

getWarnings()

isClosed()

isReadOnly()

isValid()

nativeSQL(String)

prepareCall(String)

prepareCall(String, boolean)

prepareCall(String, int, int)

prepareCall(String, int, int, int)

prepareStatement(String)

prepareStatement(String, int)

prepareStatement(String, int[])

prepareStatement(String, String[])

prepareStatement(String, int, int)

prepareStatement(String, int, int, int)

特定于 Snowflake 的行为(见下文)

prepareStatement(String, boolean)

setAutoCommit(boolean)

setCatalog(String)

setClientInfo(String, String)

调用此方法会导致 SQLClientInfoException

setClientInfo(Properties)

调用此方法会导致 SQLClientInfoException

setReadOnly(boolean)

setSchema(String)

不支持的方法

rollback()

setTransactionIsolation(int)

Snowflake 特定行为

  • close()

    关闭对象。对象关闭后,调用该关闭对象的几乎任何方法都会引发 SQLException。对已关闭的对象调用 close 无害,并且不会引发异常。

  • getMetaData()

    允许获取关于 JDBC 驱动程序和 Snowflake 的元数据。例如,可以了解是否支持事务。

    有关可以调用返回值的方法的更多信息,请参阅 对象:DatabaseMetaData

  • prepareStatement(String sql)

    此方法返回可用于执行 SQL 语句的 preparedStatement 对象。可以调用 preparedStatement 对象的 execute() 方法来执行该语句。该语句可以按原样执行,也可以在将值绑定到语句之后执行。

    备注

    在某些系统中,在准备语句后,可以重复执行该语句,而无需重新编译语句。一次准备,重复执行,可以节省少量的时间和资源。

    在 Snowflake 中,prepareStatement() 实际上并不编译代码。相反,PreparedStatement.execute()PreparedStatement.executeQuery()PreparedStatement.executeUpdate() 会编译并执行语句。因此,与简单地使用 Statement.execute() 相比,在执行之前准备语句并不能节省资源。

  • prepareCall(String sql)

  • prepareCall(String sql, boolean)

  • prepareCall(String sql, int, int)

  • prepareCall(String sql, int, int, int)

    与大多数 JDBC 实现一样, prepareCall 方法可用于将参数绑定到存储过程。例如,支持以下内容:

    CallableStatement stmt = testConnection.prepareCall("call read_result_set(?,?) ");
    
    Copy

    但是,在 Snowflake JDBC 驱动程序中, prepareCall 方法不支持绑定存储过程 返回值? = 语法。例如, 支持以下语句:

    CallableStatement stmt = testConnection.prepareCall("? = call read_result_set() ");  -- INVALID
    
    Copy

接口:SnowflakeConnection

SnowflakeConnection 接口包含特定于 Snowflake 的方法。当使用 Snowflake JDBC 驱动程序创建连接类型的对象时,例如通过调用 DriverManager.getConnection() 方法,您实际上获得了一个不同的(隐藏的)Snowflake 特定类型的对象,该对象实现了 JDBC 连接接口和 SnowflakeConnection 接口。要访问该对象中的 SnowflakeConnection 方法,需要 :ref:` 展开 <label-JDBC_unwrapping>` 该对象。

其他方法

这些方法是对 JDBC Connection 接口支持的方法的补充。

方法名称

描述

createResultSet(String)

给定异步启动的 SQL 语句的查询 ID,检索查询结果并在 ResultSet 对象中返回结果。

downloadStream(String, String, boolean)

从给定的内部暂存区下载文件并返回 InputStream。

getSessionID()

获取当前会话的会话 ID。

prepareStatement(String, Boolean)

重载 prepareStatement() 方法(详见下文)。

uploadStream(String, String, InputStream, String, boolean)

压缩流中的数据,并将其上传到内部暂存区的指定路径和文件名。

public ResultSet createResultSet(String queryID)
目的:

给定 异步启动的 SQL 语句 的 queryID,检索查询结果并在 ResultSet 对象中返回结果。

此方法通常可以在 SQL 语句完成后 24 小时内调用。

实参:

queryID:要获得结果的查询的查询 ID。

返回:

ResultSet。如果查询尚未完成运行,则服务器将返回“空” ResultSet。用户可以调用 resultSet.unwrap(SnowflakeResultSet.class).getStatus() 了解数据何时可用。

抛出:

此方法可以抛出 SQLException

备注:

此方法是 JDBC 标准的 Snowflake 扩展。要使用此方法,必须 展开 连接对象。

示例:
ResultSet resultSet;
resultSet = connection.unwrap(SnowflakeConnection.class).createResultSet(queryID);
Copy

有关包含对此方法的调用的更广泛的示例,请参阅 异步查询示例

public InputStream downloadStream(String stageName, String sourceFileName, boolean decompress)
目的:

此方法从给定的内部暂存区下载文件并返回输入流。

实参:

stageName:暂存区名称。

sourceFileName:暂存区中的文件路径。

decompress:如果文件压缩,则为 true。

返回:

此方法返回 InputStream。

抛出:

如果发生 SQL 错误,此方法将抛出 SQLException。

示例:

有关部分示例,请参阅 将数据文件直接从内部暂存区下载到流

public String getSessionID()
目的:

此方法返回当前会话的会话 ID。

实参:

返回:

以字符串形式返回会话 ID。

抛出:

如果发生任何 SQL 错误,例如,如果连接已关闭,则此方法将抛出 SQLException。

使用说明:

由于会话 ID 在连接打开时不会改变,因此会话 ID 被缓存在本地(而不是每次都从服务器检索)以提高性能。

public prepareStatement(String sql, Boolean skipParsing)

此方法已弃用。 skipParsing 参数不再影响方法的行为;无论 skipParsing 参数的设置如何,此方法的行为都与 prepareStatement(String sql) 方法相同。

新代码应使用方法 prepareStatement(String sql)

方便时,应将使用此方法的双实参版本的现有代码更新为使用单实参方法 prepareStatement(String sql)

public void uploadStream(String stageName, String destPrefix, InputStream inputStream, String destFileName, boolean compressData)
目的:

此方法从流压缩数据并将其上传到内部暂存区位置。数据将作为一个文件上传。此方法不进行拆分。

实参:

stageName:暂存区名称(例如 ~,或表名称或暂存区名称)。

destPrefix:将数据上传到暂存区时应使用的路径/前缀。

inputStream:将从中上传数据的输入流。

destFileName:要使用的目标文件名。

compressData:在上传流之前是否压缩数据。

返回:

无。

抛出:

如果无法压缩数据并将其从流中放入暂存区,则此方法将抛出 java.sql.SQLException

备注:

调用方负责在调用方法后释放 inputStream

示例:

有关部分示例,请参阅 将数据文件直接从流上传到内部暂存区

对象:DatabaseMetaData

DatabaseMetaData 类提供有关数据库服务器(在本例中为 Snowflake)支持的功能的信息。

方法

方法名称

备注

支持的方法

allProceduresAreCallable()

allTablesAreSelectable()

dataDefinitionCausesTransactionCommit()

dataDefinitionIgnoredInTransactions()

doesMaxRowSizeIncludeBlobs()

getCatalogs()

getCatalogSeparator()

getCatalogTerm()

getColumnPrivileges(String, String, String, String)

对于 columnNamePattern 实参,支持 通配符。对于 catalogschemaPatterntableNamePatterncolumnNamePattern 实参,支持 null。有关此方法的更多信息,请参阅 Snowflake 特定行为

getColumns(String, String, String, String)

对于 schemaPatterntableNamePatterncolumnNamePattern 实参,支持 通配符。对于 catalogschemaPatterntableNamePatterncolumnNamePattern 实参,支持 null

getCrossReference(String, String, String, String, String, String)

对于 parentCatalogparentSchemaparentTableforeignCatalogforeignSchemaforeignTable 实参,支持 null

getDatabaseProductName()

getDatabaseProductVersion()

getDefaultTransactionIsolation()

getDriverMajorVersion()

getDriverMinorVersion()

getDriverName()

getDriverVersion()

getExportedKeys(String, String, String)

对于 catalogschematable 实参,支持 null

getExtraNameCharacters()

getFunctionColumns()

对于 schemaPatternfunctionNamePatterncolumnNamePattern 实参,支持 通配符。对于 columnNamePattern 实参,支持 null

getFunctions(String, String, String)

对于 schemaPatternfunctionNamePattern 实参,支持 通配符。对于 schemaPatternfunctionNamePattern 实参,支持 null

getIdentifierQuoteString()

getImportedKeys(String, String, String)

对于 catalogschematable 实参,支持 null

getIndexInfo(String, String, String, boolean, boolean)

getMaxBinaryLiteralLength()

getMaxCatalogNameLength()

getMaxCharLiteralLength()

getMaxColumnNameLength()

getMaxColumnsInGroupBy()

getMaxColumnsInIndex()

getMaxColumnsInOrderBy()

getMaxColumnsInSelect()

getMaxColumnsInTable()

getMaxConnections()

getMaxCursorNameLength()

getMaxIndexLength()

getMaxProcedureNameLength()

getMaxRowSize()

getMaxSchemaNameLength()

getMaxStatementLength()

getMaxStatements()

getMaxTableNameLength()

getMaxTablesInSelect()

getMaxUserNameLength()

getNumericFunctions()

getPrimaryKeys(String, String, String)

对于 catalogschematable 实参,支持 null

getProcedureColumns(String, String, String, String)

对于 schemaPatternprocedureNamePatterncolumnNamePattern 实参,支持 通配符。对于 columnNamePattern 实参,支持 null

getProcedures(String, String, String)

对于 schemaPatternprocedureNamePattern 实参,支持 通配符。对于 columnNamePattern 实参,支持 null

getProcedureTerm()

getSchemas()

getSchemas(String, String)

对于 schemaPattern 实参,支持 通配符。对于 catalogNameschemaPattern 实参,支持 null

getSchemaTerm()

getSearchStringEscape()

getSQLKeywords()

getSQLStateType()

getStreams(String, String, String)

对于 orignalSchemaPatternstreamName 实参,支持 通配符。对于 originalCatalogoriginalSchemaPattern、和 streamName 实参,支持 null。有关此方法的更多信息,请参阅 Snowflake 特定行为

getStringFunctions()

getSystemFunctions()

getTablePrivileges(String, String, String)

对于 schemaPatterntableNamePattern 实参,支持 通配符。对于 catalogschemaPattern 实参,支持 null

getTables(String, String, String, String[])

对于 schemaPatterntableNamePattern 实参,支持 通配符。对于 、<label-database_meta_data_null_support>、catalog 实参,支持 schemaPattern``null ``tableNamePattern````types

getTableTypes()

getTimeDateFunctions()

getTypeInfo()

getURL()

getUserName()

isCatalogAtStart()

isReadOnly()

nullPlusNonNullIsNull()

nullsAreSortedAtEnd()

nullsAreSortedAtStart()

nullsAreSortedHigh()

nullsAreSortedLow()

storesLowerCaseIdentifiers()

storesLowerCaseQuotedIdentifiers()

storesMixedCaseIdentifiers()

storesMixedCaseQuotedIdentifiers()

storesUpperCaseIdentifiers()

storesUpperCaseQuotedIdentifiers()

supportsAlterTableWithAddColumn()

supportsAlterTableWithDropColumn()

supportsANSI92EntryLevelSQL()

supportsANSI92FullSQL()

supportsANSI92IntermediateSQL()

supportsCatalogsInDataManipulation()

supportsCatalogsInIndexDefinitions()

supportsCatalogsInPrivilegeDefinitions()

supportsCatalogsInProcedureCalls()

supportsCatalogsInTableDefinitions()

supportsColumnAliasing()

supportsConvert()

supportsConvert(int, int)

supportsCoreSQLGrammar()

supportsCorrelatedSubqueries()

supportsDataDefinitionAndDataManipulationTransactions()

supportsDataManipulationTransactionsOnly()

supportsDifferentTableCorrelationNames()

supportsExpressionsInOrderBy()

supportsExtendedSQLGrammar()

supportsFullOuterJoins()

supportsGroupBy()

supportsGroupByBeyondSelect()

supportsGroupByUnrelated()

supportsIntegrityEnhancementFacility()

supportsLikeEscapeClause()

supportsLimitedOuterJoins()

supportsMinimumSQLGrammar()

supportsMixedCaseIdentifiers()

supportsMixedCaseQuotedIdentifiers()

supportsMultipleResultSets()

supportsMultipleTransactions()

supportsNonNullableColumns()

supportsOpenCursorsAcrossCommit()

supportsOpenCursorsAcrossRollback()

supportsOpenStatementsAcrossCommit()

supportsOpenStatementsAcrossRollback()

supportsOrderByUnrelated()

supportsOuterJoins()

supportsPositionedDelete()

supportsPositionedUpdate()

supportsSchemasInDataManipulation()

supportsSchemasInIndexDefinitions()

supportsSchemasInPrivilegeDefinitions()

supportsSchemasInProcedureCalls()

supportsSchemasInTableDefinitions()

supportsSelectForUpdate()

supportsStoredProcedures()

supportsSubqueriesInComparisons()

supportsSubqueriesInExists()

supportsSubqueriesInIns()

supportsSubqueriesInQuantifieds()

supportsTableCorrelationNames()

supportsTransactionIsolationLevel(int)

supportsTransactions()

supportsUnion()

supportsUnionAll()

usesLocalFilePerTable()

usesLocalFiles()

不支持的方法

getBestRowIdentifier(String, String, String, int, boolean)

getVersionColumns(String, String, String)

Snowflake 特定行为

public ResultSet getColumnPrivileges(String, String, String, String)

此方法始终返回一个空集,因为 Snowflake 不支持列级权限。

public ResultSet getStreams(String, String, String)
目的:

此方法返回有关指定数据库和架构中包含的 的信息。

实参:
  • originalCatalog:数据库的名称。

  • orignalSchemaPattern:用于标识架构的模式(支持 通配符)。

  • streamName:流的名称(支持 通配符)。

返回:

此方法返回包含每个流的行的 ResultSet,每行包括以下各列:

  • name:流的名称。

  • database_name:包含流的架构的数据库名称。

    数据库对象(例如流)包含在架构中,而架构又包含在数据库中。

  • schema_name:包含流的架构的名称。

  • owner:拥有流的角色。

  • comment:与流关联的注释。

  • table_name:流跟踪其 DML 更新的表的名称。

  • source_type:流的源对象。可能的值包括:

    • table

    • view

    • directory table

    • external table

  • base_tables:视图的基础表。此列仅适用于视图上的流。

  • type:流的类型。目前,该函数始终返回 DELTA

  • stale:流是否在 stale_after 时间过去之前最后一次读取。如果为 TRUE,则流可能已过时。

    当流已过时,无法读取它。可以重新创建流以恢复从中读取。为了防止流过时,应该在 stale_after 时间过去之前使用该流。

  • mode:流的类型。可能的值包括:

    • APPEND_ONLY:指示流是仅追加流。

    • INSERT_ONLY:指示流仅返回插入行的信息。此值仅适用于外部表中的流。

    • DEFAULT:指示流位于表中。

抛出:

如果发生 SQL 错误,此方法将抛出 SQLException

支持 null 参数

某些 DatabaseMetaData 方法接受数据库对象名称(例如表/目录名称)的 null 值。默认情况下, null 值表示该方法不筛选该实参。例如,如果向 getColumns() 传递 schemaPattern 实参的 null 值,那么 getColumns() 将返回所有架构的值。

对于其中一些方法,可以使用以下 :doc:` 参数 </sql-reference/parameters>` 覆盖 null 实参的默认行为:

支持数据库对象名称中的通配符

某些 DatabaseMetaData 方法支持数据库对象名称(如表/目录名称)中的模式匹配通配符。支持的通配符包括:

  • %:匹配零个或多个字符的任意字符串。

  • _:匹配任意一个字符。

以下示例显示了要传递给 getColumns() 方法以获取指定数据库 (TEMPORARYDB1) 和架构 (TEMPORARYSCHEMA1) 中所有表和所有列的名称的内容:

getColumns( connection,
    "TEMPORARYDB1",      // Database name.
    "TEMPORARYSCHEMA1",  // Schema name.
    "%",                 // All table names.
    "%"                  // All column names.
    );
Copy

数据库对象名称(如表名称)通常包含下划线,例如 SHIPPING_ADDRESSES。当然,在不转义下划线的情况下搜索 SHIPPING_ADDRESSES,不仅会找到名为 SHIPPING_ADDRESSES 的表,还会找到诸如 SHIPPING2ADDRESSES 之类的表。如果要搜索 SHIPPING_ADDRESSES,但不想搜索 SHIPPING2ADDRESSES,则需要转义通配符,以指示希望将其视为字面量。要转义字符,请在字符前面加上反斜杠。

如果要将反斜杠字符本身用作字面量字符,也必须对其进行转义。例如,若要搜索名为 T_& 的表,其中下划线、与号和反斜杠是名称的字面量部分,而不是通配符或转义字符,方法调用应类似于以下内容:

getColumns(
    connection, "TEMPORARYDB1", "TEMPORARYSCHEMA1", "T\\_\\\\", "%" // All column names.
    );
Copy

上面的每个反斜杠都必须额外转义一次,因为 Java 编译器希望反斜杠被转义:

Java sees...............: T\\_\\%\\\\
SQL sees................: T\_\%\\
The actual table name is: T_%\
Copy

对象:Driver

驱动程序提供了一些方法,可用于获取与数据库的连接,以及获取有关驱动程序本身的信息。

方法

方法名称

备注

支持的方法

acceptsURL(String)

connect(String, Properties)

getMajorVersion()

getMinorVersion()

getPropertyInfo(String, Properties)

isDisableIncidents()

jdbcCompliant()

setDisableIncidents()

Snowflake 特定行为

无。

示例

以下代码片段显示了用于获取属性信息的程序的一部分:

  // Demonstrate the Driver.getPropertyInfo() method.
  public static void do_the_real_work(String connectionString) throws Exception {
    Properties properties = new Properties();
    Driver driver = DriverManager.getDriver(connectionString);
    DriverPropertyInfo[] dpinfo = driver.getPropertyInfo("", properties);
    System.out.println(dpinfo[0].description);
  }
Copy

请注意,在一般情况下,对此方法的调用应在循环中。如果检索有关属性的信息,然后设置该属性,则新设置可能会使其他属性相关,因此可能需要检索这些属性并对其进行设置。

对象:ParameterMetaData

这将提供有关 PreparedStatement 中参数的信息。

方法

方法名称

备注

支持的方法

getParameterCount()

getParameterType(int)

getParameterTypeName(int)

getPrecision(int)

getScale(int)

isNullable

不支持的方法

getParameterClassName(int)

getParameterMode()

isSigned

Snowflake 特定行为

无。

对象:PreparedStatement

PreparedStatement 接口描述了一些方法,例如,允许执行查询。

方法

方法名称

备注

支持的方法

addBatch()

特定于 Snowflake 的行为(详细信息见下文)。

clearParameters()

getParameterMetaData()

execute()

特定于 Snowflake 的行为(详细信息见下文)。

executeBatch(String)

executeLargeBatch(String)

executeLargeUpdate(String)

executeQuery()

特定于 Snowflake 的行为(详细信息见下文)。

executeUpdate()

特定于 Snowflake 的行为(详细信息见下文)。

setBigDecimal(int, BigDecimal)

setBoolean(int, boolean)

setByte(int, byte)

setBytes(int, byte[])

setDate(int, Date)

setDouble(int, double)

setFloat(int, float)

setInt(int, int)

setLong(int, long)

setNull(int, int)

setObject(int, Object, int, int)

特定于 Snowflake 的行为(详细信息见下文)。

setObject(int, Object, int)

特定于 Snowflake 的行为(详细信息见下文)。

setObject(int, Object)

setShort(int, short)

setString(int, String)

setTime(int, Time)

setTimestamp(int, Timestamp)

不支持的方法

setAsciiStream(int, InputStream, int)

setBinaryStream(int, InputStream, int)

setUnicodeStream(int, InputStream, int)

Snowflake 特定行为

  • addBatch()

    仅支持 INSERT 语句。

    addBatch 方法(与 executeBatch 结合使用),允许将多行数据作为单个 INSERT 语句的一部分插入。

    使用批处理和不使用批处理之间的区别类似于使用多行插入和单行插入之间的区别:

    INSERT INTO t1 (c1, c2) VALUES (1, 'One');   -- single row inserted.
    
    INSERT INTO t1 (c1, c2) VALUES (1, 'One'),   -- multiple rows inserted.
                                   (2, 'Two'),
                                   (3, 'Three');
    
    Copy

    插入成批的行通常比在单个 INSERT 语句中插入相同数量的行更有效。使用 AUTOCOMMIT 时(即当每个 INSERT 都是单独的事务时),优势甚至更大。

    有关使用 addBatch 的示例,请参阅 批处理插入

    备注

    可以绑定的数据大小或可以批量合并的数据大小存在上限。有关详细信息,请参阅 查询文本大小的限制

  • execute()

    此方法编译并执行创建 PreparedStatement 对象时提供的 SQL 语句。语句可以是任何类型的 SQL 语句。execute() 方法不返回 ResultSet

    此方法不返回任何内容。如果要执行查询,并且需要在语句执行时返回 ResultSet,请使用 executeQuery() 方法。

  • executeQuery()

    此方法编译并执行创建 PreparedStatement 对象时提供的 SQL 语句,返回 ResultSet

  • executeUpdate()

    此方法编译并执行创建 PreparedStatement 对象时提供的 SQL 语句。该语句必须是 DML 语句(INSERT、UPDATE、DELETE 等)或不返回任何内容的 SQL 语句(例如 DDL 语句)。

    executeUpdate() 方法返回一个整数,即如果语句是 DML 语句,则为更新的行数。如果语句未更新任何行,该函数返回 0

    如果需要执行返回 ResultSet 的 SQL 语句,请使用其他方法,例如 executeQuery()。

  • setObject()

    将时间戳变量绑定到时间戳列时,可以使用此方法指定应用于解释时间戳值的时间戳变体 (TIMESTAMP_LTZ、TIMESTAMP_NTZ、TIMESTAMP_TZ)。有关详细信息,请参阅 将变量绑定到时间戳列

接口:SnowflakePreparedStatement

SnowflakePreparedStatement 接口包含特定于 Snowflake 的方法。当使用 Snowflake JDBC 驱动程序创建 PreparedStatement 类型的对象时,例如通过调用 Connection.prepareStatement() 方法,您实际上获得了一个不同的(隐藏的)Snowflake 特定类型的对象,该对象实现了 JDBC PreparedStatement 接口和 SnowflakePreparedStatement 接口。要访问该对象中的 SnowflakePreparedStatement 方法,需要 :ref:` 展开 <label-JDBC_unwrapping>` 该对象。

其他方法

以下方法是对 PreparedStatement 接口支持的方法的补充。

方法名称

描述

executeAsyncQuery()

执行异步查询。

getQueryID()

返回此 SnowflakePreparedStatement 最近执行的查询的 Snowflake 查询 ID。

executeAsyncQuery()
目的:

此方法执行 异步查询,该查询涉及提交要执行的 SQL 语句,然后将控制权返回给调用方,而无需等待查询完成。

任何对 executeQuery() 有效的 SQL 语句也对 executeAsyncQuery() 有效。

备注

文件传输语句(如 PUT 和 GET)对 executeAsyncQuery() 有效,但行为同步。

实参:

无。

返回:

“空的” ResultSet。用户应通过调用 resultSet.unwrap(SnowflakeResultSet.class).getStatus() 轮询结果集,直到查询结果可用。

抛出:

此方法可以抛出 SQLException

备注:

此方法是 JDBC 标准的 Snowflake 扩展。要使用此方法,必须 展开 PreparedStatement 对象。

示例:
...
PreparedStatement prepStatement = connection.prepareStatement("insert into testTable values (?)");
prepStatement.setInt(1, 33);
ResultSet rs = prepStatement.executeAsyncQuery();
...
Copy

有关使用非常相似的 SnowflakeStatement.executeAsyncQuery() 方法的更广泛示例,请参阅 异步查询示例

getQueryID()
目的:

此方法返回此 SnowflakePreparedStatement 最近执行的查询的 Snowflake 查询 ID。如果尚未使用此预准备语句执行任何查询,则该方法将返回 null。

实参:

无。

返回:

该方法以字符串形式返回 ID,其中包含 UUID。

抛出:

该方法可以抛出 SQLException

备注:

此方法是 JDBC 标准的 Snowflake 扩展。要使用此方法,必须 展开 SnowflakePreparedStatement

对于 异步查询,在语句执行完成之前,查询 ID 不可用。如果在调用 executeAsyncQuery() 之后但在语句执行完成之前调用 SnowflakePreparedStatement.getQueryID(),则返回值可能是 NULL。请改为对 executeAsyncQuery() 返回的 ResultSet 对象调用 resultSet.unwrap(SnowflakeResultSet.class).getQueryID()

示例:

此部分示例演示如何调用该方法:

    // Retrieve the query ID from the PreparedStatement.
    String queryID;
    queryID = preparedStatement.unwrap(SnowflakePreparedStatement.class).getQueryID();
Copy

枚举:QueryStatus

枚举类型是特定于 Snowflake 的类型,该类型:

  • 定义表示 :ref:` 异步查询 <label-JDBC_asynchronous_query>` 状态的常量。

  • 定义返回有关执行 SQL 语句时发生的任何错误的详细信息的方法。

此枚举类型位于 net.snowflake.client.core 包中。

枚举常量

每个枚举常量表示异步查询可能的不同状态。

枚举常量

描述

RUNNING

查询仍在运行。

ABORTING

查询正在服务器端中止。

SUCCESS

查询已成功完成。

FAILED_WITH_ERROR

查询未成功完成。

QUEUED

查询排队等待执行(即尚未开始运行),通常是因为它正在等待资源。

DISCONNECTED

会话的连接已断开。查询的状态将很快更改为“FAILED_WITH_ERROR”。

RESUMING_WAREHOUSE

仓库正在启动,但查询尚未运行。

BLOCKED

该语句正在等待另一个语句所持有的锁。

NO_DATA

有关语句的数据尚不可用,通常是因为语句尚未开始执行。

方法

枚举类型定义以下方法,当查询状态为 FAILED_WITH_ERROR 时,可以使用这些方法获取有关错误的详细信息。

方法名称

描述

getErrorCode()

如果在查询执行过程中发生错误,则从服务器返回错误代码。

getErrorMessage()

如果在查询执行过程中发生错误,则从服务器返回错误消息。

getErrorCode()
目的:

如果在执行查询期间发生错误,此方法将从服务器返回错误代码。

实参:

无。

返回:

该方法返回 int 形式的错误代码。如果未发生错误,该方法将返回值 0

示例:
QueryStatus queryStatus = resultSet.unwrap(SnowflakeResultSet.class).getStatus();
if (queryStatus == queryStatus.FAILED_WITH_ERROR) {
  // Print the error code to stdout
  System.out.format("Error code: %d%n", queryStatus.getErrorCode());
}
Copy

有关包含对此方法的调用的更广泛的示例,请参阅 异步查询示例

getErrorMessage()
目的:

如果在执行查询期间发生错误,此方法将从服务器返回错误消息。

实参:

无。

返回:

该方法返回 String 形式的错误消息。如果未发生错误,该方法将返回值 No error reported

示例:
QueryStatus queryStatus = resultSet.unwrap(SnowflakeResultSet.class).getStatus();
if (queryStatus == queryStatus.FAILED_WITH_ERROR) {
  // Print the error message to stdout
  System.out.format("Error message: %s%n", queryStatus.getErrorMessage());
}
Copy

有关包含对此方法的调用的更广泛的示例,请参阅 异步查询示例

对象:ResultSet

ResultSet 接口记录了检索查询结果的方法,例如读取 SELECT 语句返回的行和列。

Snowflake ResultSet 是一个只读对象;该对象不可更新。

方法

方法名称

备注

支持的方法

close()

特定于 Snowflake 的行为(详细信息见下文)。

findColumn(String)

getBigDecimal(int, int)

getBigDecimal(String, int)

getBoolean(int)

getBoolean(String)

getByte(int)

getByte(String)

getBytes(int)

getBytes(String)

getDate(int)

特定于 Snowflake 的行为(详细信息见下文)。

getDate(int, Calendar)

特定于 Snowflake 的行为(详细信息见下文)。

getDate(String)

特定于 Snowflake 的行为(详细信息见下文)。

getDate(String, Calendar)

特定于 Snowflake 的行为(详细信息见下文)。

getDouble(int)

getDouble(String)

getFloat(int)

getFloat(String)

getInt(int)

getInt(String)

getLong(int)

getLong(String)

getMetaData()

特定于 Snowflake 的行为(详细信息见下文)。

getObject(int)

getObject(String)

getShort(int)

getShort(String)

getString(int)

getString(String)

getTime(int)

特定于 Snowflake 的行为(详细信息见下文)。

getTime(String)

特定于 Snowflake 的行为(详细信息见下文)。

getTimestamp(int)

特定于 Snowflake 的行为(详细信息见下文)。

getTimestamp(String)

特定于 Snowflake 的行为(详细信息见下文)。

next()

特定于 Snowflake 的行为(详细信息见下文)。

wasNull()

不支持的方法

clearWarnings()

getArray(int)

getArray(String)

getAsciiStream(int)

getAsciiStream(String)

getBinaryStream(int)

getBinaryStream(String)

getCursorName()

getUnicodeStream(int)

getUnicodeStream(String)

getWarnings()

Snowflake 特定行为

  • close()

    关闭对象。对象关闭后,调用该关闭对象的几乎任何方法都会引发 SQLException。对已关闭的对象调用 close 无害,并且不会引发异常。

  • getDate()getTime()getTimestamp()

    在版本 3.12.17 及更高版本的 JDBC 驱动程序中,这些方法使用会话时区(由 TIMEZONE 参数指定)。旧版本使用 JVM 的时区。

    要变更这些方法以使用 JVM 的时区,请将 JDBC_USE_SESSION_TIMEZONE 参数设置为 FALSE

  • getMetaData()

    如果 ResultSet 对象用于 异步查询,则此方法将被阻止,直到查询完成执行。在调用此方法之前,可以使用 resultSet.unwrap(SnowflakeResultSet.class).getStatus() 获取查询状态。

  • next()

    这会将结果中的下一行设置为“当前”行。对 get*() 方法的调用(如 getInt())从当前行获取值。

    如果 ResultSet 已通过调用 close 方法关闭,则后续调用 next 将返回 false,而不是引发异常。

    如果 ResultSet 对象用于 异步查询,则此方法将被阻止,直到结果可用。在调用此方法之前,可以使用 resultSet.unwrap(SnowflakeResultSet.class).getStatus() 获取查询状态。

接口:SnowflakeResultSet

SnowflakeResultSet 接口包含特定于 Snowflake 的方法。当使用 Snowflake JDBC 驱动程序创建 ResultSet 类型的对象时,例如通过调用 Statement.getResultSet() 方法,您实际上获得了一个不同的(隐藏的)Snowflake 特定类型的对象,该对象实现了 JDBC ResultSet 接口和 SnowflakeResultSet 接口。要访问该对象中的 SnowflakeResultSet 方法,需要 :ref:` 展开 <label-JDBC_unwrapping>` 该对象。

其他方法

方法名称

描述

getQueryID()

返回生成此结果集的语句的 Snowflake 查询 ID。

getStatus()

对于异步查询返回的 ResultSet,返回查询的状态。

getQueryID()
目的:

此方法返回生成此结果集的语句的 Snowflake 查询 ID。

实参:

无。

返回:

该方法以字符串形式返回 ID,其中包含 UUID。

备注:

此方法是 JDBC 标准的 Snowflake 扩展。要使用此方法,必须 展开 ResultSet

示例:
    String queryID2;
    queryID2 = resultSet.unwrap(SnowflakeResultSet.class).getQueryID();
Copy
getStatus()
目的:

对于异步查询返回的 ResultSet,例如 SnowflakeStatement.executeAsyncQuery(),此方法返回查询的状态。状态指示查询是成功完成、未成功完成还是尚未完成。

实参:

无。

返回:

QueryStatus 枚举常量

抛出:

此方法可以抛出 SQLException

备注:

此方法是 JDBC 标准的 Snowflake 扩展。要使用此方法,必须 展开 ResultSet 对象。

示例:
QueryStatus queryStatus = resultSet.unwrap(SnowflakeResultSet.class).getStatus();
Copy

有关包含对此方法的调用的更广泛的示例,请参阅 异步查询示例

对象:ResultSetMetaData

这提供了有关 ResultSet 的信息,例如 ResultSet 中的列数。

方法

方法名称

备注

支持的方法

getCatalogName(int)

特定于 Snowflake 的行为(详细信息见下文)。

getColumnCount()

getColumnDisplaySize(int)

getColumnLabel(int)

getColumnName(int)

getColumnType(int)

getColumnTypeName(int)

特定于 Snowflake 的行为(详细信息见下文)。

getPrecision(int)

getScale(int)

getSchemaName(int)

特定于 Snowflake 的行为(详细信息见下文)。

getTableName(int)

特定于 Snowflake 的行为(详细信息见下文)。

isAutoIncrement(int)

isCaseSensitive(int)

isCurrency(int)

isDefinitelyWritable(int)

isNullable(int)

isReadOnly(int)

isSearchable(int)

isSigned(int)

isWritable(int)

不支持的方法

无。

Snowflake 特定行为

  • ResultSetMetaData 类没有 close() 方法。当用户关闭从中创建 ResultSetMetaData 对象的 ResultSet 时,打开的 ResultSetMetaData 对象被隐式关闭。

  • getCatalogName()getSchemaName()getTableName()

    如果 ResultSet 对象用于 异步查询,则这些方法返回空字符串。

  • 对于 GEOGRAPHY 列,getColumnTypeName 返回 GEOGRAPHY

    请注意, getColumnTypegetColumnClassName 方法不表示列类型为 GEOGRAPHY

接口:SnowflakeResultSetMetaData

SnowflakeResultSetMetaData 接口包含特定于 Snowflake 的方法。当使用 Snowflake JDBC 驱动程序创建 ResultSetMetaData 类型的对象时,例如通过调用 ResultSet.getMetaData() 方法,您实际上获得了一个不同的(隐藏的)Snowflake 特定类型的对象,该对象实现了 JDBC ResultSetMetaData 接口和 SnowflakeResultSetMetaData 接口。要访问该对象中的 SnowflakeResultSetMetaData 方法,需要 :ref:` 展开 <label-JDBC_unwrapping>` 该对象。

其他方法

方法名称

备注

支持的方法

getColumnIndex(String columnName)

getColumnNames()

getInternalColumnType(int column)

getQueryID()

getColumnIndex(String columnName):
目的:

返回与 columnName 对应的列的索引。例如,如果名为“BirthDate”的列是表中的第三列,则 getColumnIndex(“BirthDate”)返回 2。(索引从 0 开始,而不是从 1 开始。)

实参:

要查找其索引的列的名称。

返回:

返回一个整数,其中包含与 columnName 对应的列的索引。如果 columnName 与结果集中的任何列都不匹配,则返回 -1。

抛出:

该方法可以抛出 SQLException

getColumnNames():
目的:

此函数返回结果集中所有列名的列表。

这与 ResultSetMetaData 中的函数 getColumnName(int 列)不同,后者根据索引返回单个列名。

实参:

无。

返回:

返回值的数据类型为“List<String>”。该列表包含列的名称。名称的顺序与列索引的顺序相同。

抛出:

该方法可以抛出 SQLException

getInternalColumnType(int column):
目的:

返回指定列的数据类型。

实参:

column:这表示需要其数据类型的列的索引(从 1 开始)。

返回:

返回指定列的数据类型。数据类型为整数。

抛出:

该方法可以抛出 SQLException

getQueryID()
目的:

返回应用此元数据的查询的 Snowflake 查询 ID。

实参:

无。

返回:

此方法返回为其生成此元数据的查询的查询 ID。查询 ID 是一个字符串,其中包含 UUID。有关 UUIDs 的信息包含在 SQL 函数 UUID_STRING 的描述中。

抛出:

该方法可以抛出 SQLException

对象:SnowflakeTimestampWithTimezone

SnowflakeTimestampWithTimezone 对象提供有关与 Java Timestamp 对象的时间戳关联的时区的信息。可以使用此对象直接提取时区,而不是从 Java Timestamp 字符串中解析信息。要访问此功能,必须导入以下 Java 库:

  • java.sql.Timestamp;

  • java.time.ZonedDateTime;

  • java.util.TimeZone;

方法

方法名称

备注

构造函数

SnowflakeTimestampWithTimezone(
    long seconds,
    int nanoseconds,
    TimeZone tz)
Copy
  • 自 1970 年 1 月 1 日(互联网时间)以来的秒数。

  • 小数纳秒数。

  • 时区的 ID。

SnowflakeTimestampWithTimezone(
    Timestamp ts,
    TimeZone tz)
Copy
  • 表示期望时间的 Timestamp 对象。

  • 时区的 ID。

SnowflakeTimestampWithTimezone(
    Timestamp ts)
Copy
  • 表示期望时间的 Timestamp 对象。

支持的方法

getTimezone()

特定于 Snowflake 的行为(详细信息见下文)。

toZonedDateTime()

特定于 Snowflake 的行为(详细信息见下文)。

Snowflake 特定行为

  • getTimezone()

    从时间戳返回时区。

    import java.sql.Timestamp;
    import java.time.ZonedDateTime;
    import java.util.TimeZone;
    
    public void testGetTimezone() {
        String timezone = "Australia/Sydney";
    
        // Create a timestamp from a point in time
        Long datetime = System.currentTimeMillis();
        Timestamp currentTimestamp = new Timestamp(datetime);
        SnowflakeTimestampWithTimezone ts =
            new SnowflakeTimestampWithTimezone(currentTimestamp, TimeZone.getTimeZone(timezone));
    
        // Verify timezone was set
        assertEquals(ts.getTimezone().getID(), timezone);
    }
    
    Copy
  • toZonedDateTime()

    SnowflakeTimestampWithTimezone 时间戳转换为分区的日期时间(Java ZonedDateTime 对象)。

    import java.sql.Timestamp;
    import java.time.ZonedDateTime;
    import java.util.TimeZone;
    
    public void testToZonedDateTime() {
        String timezone = "Australia/Sydney";
        String zonedDateTime = "2022-03-17T10:10:08+11:00[Australia/Sydney]";
    
        // Create a timestamp from a point in time
        Long datetime = 1647472208000L;
        Timestamp timestamp = new Timestamp(datetime);
        SnowflakeTimestampWithTimezone ts =
            new SnowflakeTimestampWithTimezone(timestamp, TimeZone.getTimeZone(timezone));
        ZonedDateTime zd = ts.toZonedDateTime();
    
        // Verify timestamp was converted to zoned datetime
        assertEquals(zd.toString(), zonedDateTime);
    }
    
    Copy

对象:Statement

Statement 对象表示 SQL 语句。语句对象允许用户执行以下任务:

  • 执行 SQL 语句。

  • 设置语句执行的超时。

  • 检索查询的结果集。

方法

方法名称

备注

支持的方法

cancel()

close()

特定于 Snowflake 的行为(详细信息见下文)。

execute(String)

executeBatch(String)

executeLargeBatch(String)

executeLargeUpdate(String)

executeQuery(String)

executeUpdate(String)

getBatchQueryID()

特定于 Snowflake 的行为(详细信息见下文)。

getMaxFieldSize()

getMaxRows()

getMoreResults()

getQueryTimeout()

getResultSet()

getUpdateCount()

特定于 Snowflake 的行为(详细信息见下文)。

setCursorName(String)

setMaxRows(int)

setQueryTimeout(int)

不支持的方法

clearWarnings()

getWarnings()

setEscapeProcessing(boolean)

setMaxFieldSize(int)

Snowflake 特定行为

  • close()

    此方法关闭对象。对象关闭后,调用该关闭对象的几乎任何方法都会引发 SQLException。对已关闭的对象调用 close 无害,并且不会引发异常。

  • getBatchQueryID()

    此方法返回此 Statement 最近执行的查询批次的 Snowflake 查询 IDs 的列表。如果尚未使用该语句执行任何查询,则该方法将返回 null。

    此方法是 JDBC 标准的 Snowflake 扩展。要使用此方法,必须 展开 该语句。例如:

        connection.setAutoCommit(false);
        statement.addBatch("SELECT 1;");
        statement.addBatch("SELECT 2;");
        statement.executeBatch();
        connection.commit();
        connection.setAutoCommit(true);
        List<String> batchQueryIDs1;
        // Since getQueryID is not standard JDBC API, we must call unwrap() to
        // use these Snowflake methods.
        batchQueryIDs1 = statement.unwrap(SnowflakeStatement.class).getBatchQueryIDs();
        int num_query_ids = batchQueryIDs1.size();
        if (num_query_ids != 2) {
          System.out.println("ERROR: wrong number of query IDs in batch 1.");
        }
        // Check that each query ID is plausible.
        for (int i = 0; i < num_query_ids; i++) {
          String qid = batchQueryIDs1.get(i);
          if (!is_plausible_query_id(qid)) {
            msg = "SEVERE WARNING: suspicious query ID in batch";
            System.out.println("msg");
            System.out.println(qid);
          }
        }
    
    Copy
  • getUpdateCount()

    此方法返回最近执行的 SQL 语句更新的行数。

    • 如果语句是 DML 语句(INSERT、UPDATE、DELETE 等),则 getUpdateCount() 返回添加、删除或变更的行数。请注意,如果未变更行,则此值可以为 0

    • 如果语句是 SELECT 语句,则 getUpdateCount() 返回 -1

    • 如果语句是 DDL 语句,则 getUpdateCount() 返回 -1

接口:SnowflakeStatement

SnowflakeStatement 接口包含特定于 Snowflake 的方法。当使用 Snowflake JDBC 驱动程序创建 Statement 类型的对象时,例如通过调用 Connection.createStatement() 方法,您实际上获得了一个不同的(隐藏的)Snowflake 特定类型的对象,该对象实现了 JDBC Statement 接口和 SnowflakeStatement 接口。要访问该对象中的 <label-JDBC_unwrapping> 方法,需要 ` 展开 SnowflakeStatement:ref:` 该对象。

其他方法

方法名称

描述

executeAsyncQuery()

执行异步查询。

getQueryID()

返回此 Statement 最近执行的查询的 Snowflake 查询 ID。

setParameter(String, Value)

设置特定于 Snowflake 的参数。

executeAsyncQuery(String)
目的:

此方法执行 异步查询,该查询涉及提交要执行的 SQL 语句,然后将控制权返回给调用方,而无需等待查询完成。

实参:

包含要执行的 SQL 命令的字符串。任何对 executeQuery() 有效的 SQL 语句也对 executeAsyncQuery() 有效。

备注

文件传输语句(如 PUT 和 GET)对 executeAsyncQuery() 有效,但行为同步。

返回:

“空的” ResultSet。用户应通过调用 resultSet.unwrap(SnowflakeResultSet.class).getStatus() 轮询结果集,直到查询结果可用。

抛出:

该方法可以抛出 SQLException

备注:

此方法是 JDBC 标准的 Snowflake 扩展。要使用此方法,必须 展开 Statement 对象。

示例:

有关包含对此方法的调用的示例,请参阅 异步查询示例

getQueryID()
目的:

此方法返回此 Statement 最近执行的查询的 Snowflake 查询 ID。

实参:

无。

返回:

此语句最近执行的查询的查询 ID。查询 ID 是一个字符串,其中包含 UUID。如果尚未使用该语句执行任何查询,则该方法将返回 null。

抛出:

该方法可以抛出 SQLException

备注:

此方法是 JDBC 标准的 Snowflake 扩展。要使用此方法,必须 展开 该语句。

对于 异步查询,在语句执行完成之前,查询 ID 不可用。如果在调用 executeAsyncQuery() 之后但在语句执行完成之前调用 SnowflakeStatement.getQueryID(),则返回值可能是 NULL。请改为对 executeAsyncQuery() 返回的 ResultSet 对象调用 resultSet.unwrap(SnowflakeResultSet.class).getQueryID()

示例:
    String queryID1;
    queryID1 = statement.unwrap(SnowflakeStatement.class).getQueryID();
Copy
setParameter(String parameter_name, <type> <value>)
目的:

SnowflakeStatement 类将 setParameter 方法作为 Snowflake 扩展提供。这允许调用方设置特定于 Snowflake 的 JDBC 参数。

该方法重载。不同的 JDBC 参数需要不同的数据类型。每个有效数据类型都存在一个方法,该方法可以作为第二个实参传递给函数。

实参:
parameter_name:

此字符串必须包含预定义的 Snowflake JDBC 参数的名称。下面列出了预定义的 JDBC 参数(及其有效值或范围):

JDBC 参数

备注

MULTI_STATEMENT_COUNT

指定语句数的整数(0 = 无限数量的语句; 1 或更高表示应执行的确切语句数)。

value:

这是要分配给指定 JDBC 参数的值。请确保数据类型与指定的 JDBC 参数兼容。

返回:

无。

抛出:

此函数可以抛出 SQLException。

备注:

此方法是 JDBC 标准的 Snowflake 扩展。要使用此方法,必须 展开 该语句。

示例:
Statement statement1;
...
// Tell Statement to expect to execute 2 statements:
statement1.unwrap(SnowflakeStatement.class).setParameter(
        "MULTI_STATEMENT_COUNT", 2);
Copy

接口:SQLException

发生错误时, JDBC 驱动程序方法会抛出 SQLException 对象,并包含有关该错误的信息。

方法名称

描述

getErrorCode()

返回特定于 Snowflake 的错误代码。

getMessage()

这将返回描述错误的字符串。

getSQLState()

返回 SQLState。

getErrorCode()
目的:

此方法返回自定义 Snowflake 错误代码。

实参:

无。

返回:

特定于 Snowflake 的错误代码。

备注:

另请参阅 getSQLState() 方法。

getMessage()
目的:

此方法返回描述错误的字符串。

实参:

无。

返回:

特定于 Snowflake 的错误消息。

getSQLState()
目的:

此方法返回一个字符串,其中包含基于错误的 5 个字符的字母数字值。

实参:

无。

返回:

特定于 Snowflake 的 SQLState。SQLState 是一个 5 个字符的字母数字字符串,表示发生的特定错误。

语言: 中文