华为云用户手册

  • 参数 表1 SQLBindCol参数 关键字 参数说明 StatementHandle 语句句柄。 ColumnNumber 要绑定结果集的列号。起始列号为0,以递增的顺序计算列号,第0列是书签列。若未设置书签页,则起始列号为1。 TargetType 缓冲区中C数据类型的标识符。 TargetValuePtr 输出参数:指向与列绑定的数据缓冲区的指针。SQLFetch函数返回这个缓冲区中的数据。如果此参数为一个空指针,则StrLen_or_IndPtr是一个有效值。 BufferLength TargetValuePtr指向缓冲区的长度,以字节为单位。 StrLen_or_IndPtr 输出参数:缓冲区的长度或指示器指针。若为空值,则未使用任何长度或指示器值。
  • 参数 表1 SQLAllocHandle参数 关键字 参数说明 HandleType 由SQLAllocHandle分配的句柄类型。必须为下列值之一: SQL_HANDLE_ENV(环境句柄) SQL_HANDLE_DBC(连接句柄) SQL_HANDLE_STMT(语句句柄) SQL_HANDLE_DESC(描述句柄) 申请句柄顺序为,先申请环境句柄,再申请连接句柄,最后申请语句句柄,后申请的句柄都要依赖它前面申请的句柄。 InputHandle 将要分配的新句柄的类型。 如果HandleType为SQL_HANDLE_ENV,则这个值为SQL_NULL_HANDLE。 如果HandleType为SQL_HANDLE_DBC,则这一定是一个环境句柄。 如果HandleType为SQL_HANDLE_STMT或SQL_HANDLE_DESC,则它一定是一个连接句柄。 OutputHandlePtr 输出参数:一个缓冲区的指针,此缓冲区以新分配的数据结构存放返回的句柄。
  • 注意事项 当分配的句柄并非环境句柄时,如果SQLAllocHandle返回的值为SQL_ERROR,则它会将OutputHandlePtr的值设置为SQL_NULL_HDBC、SQL_NULL_HSTMT或SQL_NULL_HDESC。之后,通过调用带有适当参数的SQLGetDiagRec,其中HandleType和Handle被设置为IntputHandle的值,可得到相关的SQLSTATE值,通过SQLSTATE值可以查出调用此函数的具体信息。
  • ODBC接口参考 ODBC接口是一套提供给用户的API函数,本节将对部分常用接口做具体描述,若涉及其他接口可参考msdn(网址:https://msdn.microsoft.com/en-us/library/windows/desktop/ms714177(v=vs.85).aspx)中ODBC Programmer's Reference项的相关内容。 SQLAllocEnv SQLAllocConnect SQLAllocHandle SQLAllocStmt SQLBindCol SQLBindParameter SQLColAttribute SQLConnect SQLDisconnect SQLExecDirect SQLExecute SQLFetch SQLFreeStmt SQLFreeConnect SQLFreeHandle SQLFreeEnv SQLPrepare SQLGetData SQLGetDiagRec SQLSetConnectAttr SQLSetEnvAttr SQLSetStmtAttr 父主题: 基于ODBC开发
  • 关闭连接 ODBC关闭数据库连接,释放资源相关API如表1所示。 表1 相关API说明 功能 API 断开与数据源的连接 SQLDisconnect 释放句柄资源 SQLFreeHandle:释放句柄资源,可替代如下函数: SQLFreeEnv:释放环境句柄 SQLFreeConnect:释放连接句柄 SQLFreeStmt:释放语句句柄 示例如下(完整示例请参考获取和处理数据库中的数据): // 断开数据源连接并释放句柄资源。 SQLFreeHandle(SQL_HANDLE_STMT,V_OD_hstmt); SQLDisconnect(V_OD_hdbc); SQLFreeHandle(SQL_HANDLE_DBC,V_OD_hdbc); SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env); 父主题: 开发步骤
  • 处理结果集 ODBC处理结果集是从数据库中获取数据并将其提供给应用程序进行处理,作用包括但不限于:检索数据、数据展示、数据处理、数据传输和业务逻辑实现等。 ODBC提供处理结果集的相关API如表1所示。 表1 相关API说明 功能 API 绑定缓冲区到结果集的列中 SQLBindCol 结果集中取行集 SQLFetch 返回结果集中某一列的数据 SQLGetData 获取结果集中列的描述信息 SQLColAttribute 查看最近一次操作错误信息 SQLGetDiagRec 示例如下(完整示例请参考获取和处理数据库中的数据): // 在执行完成SQL语句后,获取结果集某一列的属性。 SQLColAttribute(V_OD_hstmt,1,SQL_DESC_TYPE,typename,100,NULL,NULL); printf("SQLColAtrribute %s\n",typename); // 绑定结果集。 SQLBindCol(V_OD_hstmt,1,SQL_C_SLONG, (SQLPOINTER)&V_OD_buffer,150, (SQLLEN *)&V_OD_err); // 通过SQLFetch取结果集中数据。 V_OD_erg=SQLFetch(V_OD_hstmt); // 通过SQLGetData获取并返回数据。 while(V_OD_erg != SQL_NO_DATA) { SQLGetData(V_OD_hstmt,1,SQL_C_SLONG,(SQLPOINTER)&V_OD_id,0,NULL); printf("SQLGetData ----ID = %d\n",V_OD_id); V_OD_erg=SQLFetch(V_OD_hstmt); }; printf("Done !\n"); 父主题: 开发步骤
  • 执行SQL语句 为了帮助用户实现与数据库的交互,ODBC提供执行SQL语句的相关API如表1所示。 表1 相关API说明 功能 API 设置语句属性 SQLSetStmtAttr 为执行SQL语句做准备 SQLPrepare 执行一条准备好的SQL语句 SQLExecute 绑定SQL语句的参数标志和缓冲区 SQLBindParameter 直接执行SQL语句 SQLExecDirect ODBC为应用程序与数据库的中心层,负责把应用程序发出的SQL指令传到数据库当中,自身并不解析SQL语法。故在应用程序中写入带有保密信息的SQL语句时(如明文密码),保密信息会被暴露在驱动日志中。 数据库中收到的一次执行请求(不在事务块中),如果含有多条语句,将会被打包成一个事务,如果其中有一个语句失败,那么整个请求都将会被回滚。 示例如下(完整示例请参考获取和处理数据库中的数据): // 设置语句属性。 SQLSetStmtAttr(V_OD_hstmt, SQL_ATTR_QUERY_TIMEOUT, (SQLPOINTER *)3, 0); // 申请语句句柄。 SQLAllocHandle(SQL_HANDLE_STMT, V_OD_hdbc, &V_OD_hstmt); // 直接执行SQL语句。 SQLExecDirect(V_OD_hstmt, "drop table IF EXISTS customer_t1", SQL_NTS); SQLExecDirect(V_OD_hstmt, "CREATE TABLE customer_t1(c_customer_sk INTEGER, c_customer_name VARCHAR(32));", SQL_NTS); SQLExecDirect(V_OD_hstmt, "insert into customer_t1 values(25, 'li')", SQL_NTS); // 准备执行。 SQLPrepare(V_OD_hstmt, "insert into customer_t1 values(?)", SQL_NTS); // 绑定参数。 SQLBindParameter(V_OD_hstmt,1, SQL_PA RAM _INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &value, 0, NULL); // 执行准备好的语句。 SQLExecute(V_OD_hstmt); SQLExecDirect(V_OD_hstmt, "select c_customer_sk from customer_t1", SQL_NTS); 父主题: 开发步骤
  • 连接数据库涉及的API 在测试连接数据库成功后,ODBC API提供了一组函数来连接数据库,如表1所示。 表1 相关API说明 功能 API 申请句柄资源 SQLAllocHandle:申请句柄资源,可替代如下函数: SQLAllocEnv:申请环境句柄 SQLAllocConnect:申请连接句柄 SQLAllocStmt:申请语句句柄 设置环境属性 SQLSetEnvAttr 设置连接属性 SQLSetConnectAttr 连接数据库 SQLConnect 以开发源程序DBtest.c为例(完整示例请参考获取和处理数据库中的数据): 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 // DBtest.c (compile with: libodbc.so) // 程序头文件和全局变量请参考完整示例 // 申请环境句柄。 V_OD_erg = SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&V_OD_Env); if ((V_OD_erg != SQL_SUC CES S) && (V_OD_erg != SQL_SUCCESS_WITH_INFO)) { printf("Error AllocHandle\n"); exit(0); } // 设置版本信息(环境属性)。 SQLSetEnvAttr(V_OD_Env, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0); // 申请连接句柄 。 V_OD_erg = SQLAllocHandle(SQL_HANDLE_DBC, V_OD_Env, &V_OD_hdbc); if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO)) { SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env); exit(0); } // 获取用户名和用户密码。 char *userName; userName = getenv("EXAMPLE_USERNAME_ENV"); char *password; password = getenv("EXAMPLE_PASSWORD_ENV"); // 设置连接属性。 SQLSetConnectAttr(V_OD_hdbc, SQL_ATTR_AUTOCOMMIT,(SQLPOINTER *)SQL_AUTOCOMMIT_ON, 0); // 连接数据库,这里的userName与password分别表示连接数据库的用户名和用户密码。 // 如果odbc.ini文件中已经配置了用户名密码,那么这里可以留空("");但是不建议这么做,因为一旦odbc.ini权限管理不善,将导致数据库用户密码泄露。 V_OD_erg = SQLConnect(V_OD_hdbc, (SQLCHAR*) "MPPODBC", SQL_NTS, (SQLCHAR*) userName, SQL_NTS, (SQLCHAR*) password, SQL_NTS); if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO)) { printf("Error SQLConnect %d\n",V_OD_erg); SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env); exit(0); } printf("Connected !\n"); 父主题: 连接数据库
  • 常见问题处理 connect to server failed: no such file or directory 此问题可能的原因: 配置了错误的/不可达的数据库地址,或者端口 请检查数据源配置中的Server及Port配置项。 服务器侦听不正确 如果确认Server及Port配置正确,请根据“操作步骤”中数据库服务器的相关配置,确保数据库侦听了合适的网卡及端口。 防火墙及网闸设备 请确认防火墙设置,将数据库的通信端口添加到可信端口中。 如果有网闸设备,请确认相关的设置。 The password-stored method is not supported. 此问题可能原因: 数据源中未配置sslmode配置项,请调整此项至allow或以上级别,允许SSL连接,此选项的更多说明,请参见表1。 authentication method 10 not supported. 使用开源客户端碰到此问题,可能原因: 数据库中存储的口令校验只存储了SHA256格式哈希,而开源客户端只识别MD5校验,双方校验方法不匹配报错。 数据库并不存储用户口令,只存储用户口令的哈希码。 当用户更新用户口令或者新建用户时,数据库会同时存储两种格式的哈希码,这时将兼容开源的认证协议。 但是当旧版本升级到新版本时,由于哈希的不可逆性,所以数据库无法还原用户口令,进而生成新格式的哈希,所以仍然只保留了SHA256格式的哈希,导致仍然无法使用MD5做口令认证。 MD5加密算法安全性低,存在安全风险,建议使用更安全的加密算法。 要解决该问题,可以更新用户口令(参见ALTER USER);或者新建一个用户(参见CREATE USER),赋予同等权限,使用新用户连接数据库。 unsupported frontend protocol 3.51: server supports 1.0 to 3.0 目标数据库版本过低,或者目标数据库为开源数据库。请使用对应版本的数据库驱动连接目标数据库。 FATAL: GSS authentication method is not allowed because XXXX user password is not disabled. 目标DN的pg_hba.conf里配置了当前客户端IP使用"gss"方式来做认证,该认证算法不支持用作客户端的身份认证,请修改到"sha256"后再试。
  • 常见问题处理 [UnixODBC][Driver Manager]Can't open lib 'xxx/xxx/psqlodbcw.so' : file not found. 此问题的可能原因: odbcinst.ini文件中配置的路径不正确 确认方法:执行ls命令查询错误信息中的路径,以确保该psqlodbcw.so文件存在,同时具有执行权限。 psqlodbcw.so的依赖库不存在,或者不在系统环境变量中 确认方法:执行ldd查询误信息中的路径,如果是缺少libodbc.so.1等UnixODBC的库,那么按照“操作步骤”中的方法重新配置UnixODBC,并确保它的安装路径下的lib目录添加到了LD_LIBRARY_PATH中;如果是缺少其他库,请将ODBC驱动包中的lib目录添加到LD_LIBRARY_PATH中。如果缺少其他标准库,请自行安装。 [UnixODBC]connect to server failed: no such file or directory 此问题可能的原因: 配置了错误的/不可达的数据库地址,或者端口 请检查数据源配置中的Servername及Port配置项。 服务器侦听不正确 如果确认Servername及Port配置正确,请根据“操作步骤”中数据库服务器的相关配置,确保数据库侦听了合适的网卡及端口。 防火墙及网闸设备 请确认防火墙设置,将数据库的通信端口添加到可信端口中。 如果有网闸设备,请确认相关的设置。 [unixODBC]The password-stored method is not supported. 此问题可能原因: 数据源中未配置sslmode配置项。 解决办法: 请配置该选项至allow或以上选项。此配置的更多信息,请参见表3。 Server common name "xxxx" does not match host name "xxxxx" 此问题的原因: 使用了SSL加密的“verify-full”选项,驱动程序会验证证书中的主机名与实际部署数据库的主机名是否一致。 解决办法: 碰到此问题可以使用“verify-ca”选项,不再校验主机名;或者重新生成一套与数据库所在主机名相同的CA证书。 Driver's SQLAllocHandle on SQL_HANDLE_DBC failed 此问题的可能原因: 可执行文件(比如UnixODBC的isql,以下都以isql为例)与数据库驱动(psqlodbcw.so)依赖于不同的odbc的库版本:libodbc.so.1或者libodbc.so.2。此问题可以通过如下方式确认: ldd `which isql` | grep odbc ldd psqlodbcw.so | grep odbc 这时,如果输出的libodbc.so最后的后缀数字不同或者指向不同的磁盘物理文件,那么基本就可以断定是此问题。isql与psqlodbcw.so都会要求加载libodbc.so,这时如果它们加载的是不同的物理文件,便会导致两套完全同名的函数列表,同时出现在同一个可见域里(UnixODBC的libodbc.so.*的函数导出列表完全一致),产生冲突,无法加载数据库驱动。 解决办法: 确定一个要使用的UnixODBC,然后卸载另外一个(比如卸载库版本号为.so.2的UnixODBC),然后将剩下的.so.1的库,新建一个同名但是后缀为.so.2的软链接,便可解决此问题。 FATAL: Forbid remote connection with trust method! 由于安全原因,数据库主节点禁止数据库内部其他节点无认证接入。 如果要在数据库内部访问数据库主节点,请将ODBC程序部署在数据库主节点所在机器,服务器地址使用"127.0.0.1"。建议业务系统单独部署在数据库外部,否则可能会影响数据库运行性能。 [unixODBC][Driver Manager]Invalid attribute value 有可能是unixODBC的版本并非推荐版本,建议通过“odbcinst --version”命令排查环境中的unixODBC版本。 authentication method 10 not supported. 使用开源客户端碰到此问题,可能原因: 数据库中存储的口令校验只存储了SHA256格式哈希,而开源客户端只识别MD5校验,双方校验方法不匹配报错。 数据库并不存储用户口令,只存储用户口令的哈希码。 当用户更新用户口令或者新建用户时,数据库会同时存储两种格式的哈希码,这时将兼容开源的认证协议。 但是当旧版本升级到新版本时,由于哈希的不可逆性,所以数据库无法还原用户口令,进而生成新格式的哈希,所以仍然只保留了SHA256格式的哈希,导致仍然无法使用MD5做口令认证。 MD5加密算法安全性低,存在安全风险,建议使用更安全的加密算法。 要解决该问题,可以更新用户口令(参见ALTER USER);或者新建一个用户(参见CREATE USER),赋予同等权限,使用新用户连接数据库。 unsupported frontend protocol 3.51: server supports 1.0 to 3.0 目标数据库版本过低,或者目标数据库为开源数据库。 请使用对应版本的数据库驱动连接目标数据库。 FATAL: GSS authentication method is not allowed because XXXX user password is not disabled. 目标数据库主节点的pg_hba.conf里配置了当前客户端IP使用"gss"方式来做认证,该认证算法不支持用作客户端的身份认证,请修改到"sha256"后再试。 isql:error while loading shared libraries:xxx 环境缺少该动态库,需要自行安装对应的库。
  • 操作步骤 安装unixODBC(默认unixODBC源码包已在环境准备中获取)。如果机器上已经安装了其他版本的unixODBC,可以直接覆盖安装。 以unixODBC-2.3.7版本为例,在客户端执行如下命令安装unixODBC。 tar zxvf unixODBC-2.3.7.tar.gz cd unixODBC-2.3.7 ./configure --enable-gui=no #如果要在ARM服务器上编译,请追加一个configure参数: --build=aarch64-unknown-linux-gnu make #安装可能需要root权限 make install 目前不支持unixODBC-2.2.1版本。 默认安装到“/usr/local”目录下,生成数据源文件到 “/usr/local/etc”目录下,库文件生成在“/usr/local/lib”目录。 通过编译带有--enable-fastvalidate=yes选项的unixODBC来获得更高性能。但此选项可能会导致向ODBC API传递无效句柄的应用程序发生故障,而不是返回SQL_INVALID_HANDLE错误。 替换客户端 GaussDB 驱动程序。 将GaussDB-Kernel-数据库版本号-操作系统版本号-64bit-Odbc.tar.gz解压。解压后会得到两个文件夹:lib与odbc,在odbc文件夹中还会有一个lib文件夹。将解压后得到的/lib文件夹与/odbc/lib文件夹中的所有动态库都复制到“/usr/local/lib”目录下。 配置数据源。 配置ODBC驱动文件。 在“/usr/local/etc/odbcinst.ini”文件中追加以下内容。 [GaussMPP] Driver64=/usr/local/lib/psqlodbcw.so setup=/usr/local/lib/psqlodbcw.so odbcinst.ini文件中的配置参数说明如表1所示。 表1 odbcinst.ini文件配置参数 参数 描述 示例 [DriverName] 驱动器名称,对应数据源DSN中的驱动名。 [DRIVER_N] Driver64 驱动动态库的路径。 Driver64=/usr/local/lib/psqlodbcw.so setup 驱动安装路径,与Driver64中动态库的路径一致。 setup=/usr/local/lib/psqlodbcw.so 配置数据源文件。 在“/usr/local/etc/odbc.ini”文件中追加以下内容。 [MPPODBC] Driver=GaussMPP Servername=127.0.0.1 #数据库Server IP Database=postgres #数据库名 Username=omm #数据库用户名 Password= #数据库用户密码 Port=8000 #数据库侦听端口 Sslmode=allow odbc.ini文件配置参数说明如表2所示。 表2 odbc.ini文件配置参数 参数 描述 示例 [DSN] 数据源的名称。 [MPPODBC] Driver 驱动名,对应odbcinst.ini中的DriverName。 Driver=DRIVER_N Servername 服务器的IP地址。可配置多个IP地址。 Servername=127.0.0.1 Database 要连接的数据库的名称。 Database=postgres Username 数据库用户名称。 Username=omm Password 数据库用户密码。 说明: ODBC驱动本身已经对内存密码进行过清理,以保证用户密码在连接后不会再在内存中保留。 但是如果配置了此参数,由于UnixODBC对数据源文件等进行缓存,可能导致密码长期保留在内存中。 推荐在应用程序连接时,将密码传递给相应API,而非写在数据源配置文件中。同时连接成功后,应当及时清理保存密码的内存段。 须知: 配置文件中填写密码时,需要遵循http规则: 字符应当采用URL编码规范,如"!"应写作"%21","%"应写作"%25",因此应当注意特殊处理%。 "+"会被替换为空格" "。 Password=******** Port 服务器的端口号。 Port=8000 Sslmode 开启SSL模式 说明: 关于Sslmode的选项的允许值,具体信息如表3所示。 Sslmode=allow Debug 是否启用调试模式。 取值范围:0 ~ INT_MAX 设置为0时表示不开启。 设置为大于0时表示将会打印gsqlodbc驱动的mylog,日志生成目录为/tmp/。 默认值为0。 Debug=1 UseServerSidePrepare 是否开启数据库端扩展查询协议。 取值范围:0,1 取值为0表示不开启。 取值为1表示开启。 默认值为1。 UseServerSidePrepare=1 UseBatchProtocol 是否开启批量查询协议(打开可提高DML性能)。 取值范围:0,1 取值为0时,不使用批量查询协议(主要用于与早期数据库版本通信兼容)。 取值为1,并且数据库support_batch_bind参数存在且为on时,将打开批量查询协议。 默认值为1。 UseBatchProtocol=1 ForExtensionConnector 此开关控制着savepoint是否发送,savepoint相关问题可以注意此开关, 取值范围:0,1 取值为0时表示发送savepoint。 取值为1时表示不发送savepoint。 默认值为1。 ForExtensionConnector=1 ConnectionExtraInfo GUC参数connection_info中显示驱动部署路径和进程属主用户的开关。 取值范围:0,1 取值为0时表示不打开此开关。 取值为1时表示打开此开关。 默认值为0。 说明: 默认值为0。当设置为1时,ODBC驱动会将当前驱动的部署路径、进程属主用户上报到数据库中,记录在connection_info参数里;同时可以在PG_STAT_ACTIVITY中查询到。 ConnectionExtraInfo=1 BoolAsChar 是否将布尔值作为字符处理。 取值范围:0,1 取值为0时表示Bools值将会映射为SQL_BIT。 取值为1时表示Bools值将会映射为SQL_CHAR。 默认值为1。 BoolsAsChar = 1 RowVersioning 是否在更新一行数据时,允许应用检测数据有没有被其他用户进行修改。 取值范围:0,1 取值为0时表示不允许应用检测。 取值为1时表示允许应用检测。 默认值为0。 RowVersioning=1 ShowSystemTables 是否将默认系统表格视为普通SQL表格。 取值范围:0,1 取值为0时驱动不会将默认系统表格视为普通SQL表格。 取值为1时驱动将默认系统表格视为普通SQL表格。 默认值为0。 ShowSystemTables=1 TcpUserTimeout 在支持TCP_USER_TIMEOUT套接字选项的操作系统上,指定传输的数据在TCP连接被强制关闭之前可以保持未确认状态的最大时长。 取值范围:0 ~ INT_MAX 默认值为0。 说明: 0表示使用系统缺省。通过Unix域套接字做的连接忽略这个参数。单位为毫秒。 TcpUserTimeout=5000 其中关于Sslmode的选项的允许值,具体信息见下表: 表3 Sslmode的可选项及其描述 Sslmode 是否会启用SSL加密 描述 disable 否 不使用SSL安全连接。 allow 可能 如果数据库服务器要求使用,则可以使用SSL安全加密连接,但不验证数据库服务器的真实性。 prefer 可能 如果数据库支持,那么建议使用SSL安全加密连接,但不验证数据库服务器的真实性。 require 是 必须使用SSL安全连接,但是只做了 数据加密 ,而并不验证数据库服务器的真实性。 verify-ca 是 必须使用SSL安全连接,并且验证数据库是否具有可信证书机构签发的证书。 verify-full 是 必须使用SSL安全连接,在verify-ca的验证范围之外,同时验证数据库所在主机的主机名是否与证书内容一致。GaussDB不支持此模式。 用户通过ODBC连接GaussDB服务器时,可以通过开启SSL加密客户端和服务器之间的通讯。在使用SSL时,默认用户已经获取了服务端和客户端所需要的证书和私钥文件,关于证书等文件的获取请参考Openssl相关文档和命令。 在客户端配置环境变量。 vim ~/.bashrc 在配置文件中追加以下内容。 export LD_LIBRARY_PATH=/usr/local/lib/:$LD_LIBRARY_PATH export OD BCS YSINI=/usr/local/etc export ODBCINI=/usr/local/etc/odbc.ini 执行如下命令使设置生效。 source ~/.bashrc 测试连接。 安装后/usr/bin下面会存放生成的二进制,可执行isql -v MPPODBC(数据源名称)命令。 如果显示如下信息,表明配置正确,连接成功。 +---------------------------------------+ | Connected! | | | | sql-statement | | help [tablename] | | quit | | | +---------------------------------------+ 若显示ERROR信息,则表明配置错误。请检查上述配置步骤是否正确执行。 目前通过ODBC连接数据库时,会如下设置内核参数: SET extra_float_digits = 2; SET DateStyle = 'ISO'; 这些参数可能会导致ODBC客户端的行为与gsql客户端的行为不一致,例如,Date数据显示方式、浮点数精度表示。如果实际期望和这些配置不符,建议在ODBC应用代码中显式设定这些参数。
  • 获取源码包、ODBC包以及依赖库 基于ODBC开发所需的包,依赖库和头文件以及其获取方式如表1所示。 表1 ODBC应用程序开发环境准备 所需资源 获取方式 unixODBC源码包 unixODBC源码包获取参考地址:https://www.unixodbc.org/unixODBC-2.3.7.tar.gz。 MD5文件下载地址:https://www.unixodbc.org/unixODBC-2.3.7.tar.gz.md5。 下载后需使用MD5文件对unixODBC源码包进行完整性校验(查看MD5值,对比MD5值是否与源码包一致)。 Linux系统下的ODBC包以及依赖库 从发布包中获取,包名为GaussDB-Kernel-数据库版本号-操作系统版本号-64bit-Odbc.tar.gz。Linux环境下,开发应用程序要用到unixODBC提供的头文件(sql.h、sqlext.h等)和库libodbc.so。这些头文件和库可从unixODBC-2.3.7的源码包中获得。 Windows系统下的ODBC包以及依赖库 从发布包中获取,包名为GaussDB-Kernel_数据库版本号_Windows_X86_Odbc.tar.gz(32位)和GaussDB-Kernel-数据库版本号-Windows-X64-Odbc.tar.gz(64位)。Windows环境下,开发应用程序用到的相关头文件和库文件由系统自带。 父主题: 开发步骤
  • 常用方法 表1 LogicalCreateSlotBuilder常用方法 方法名 返回值类型 描述 throws withSlotName(String slotName) T 指定复制槽名。 - withOutputPlugin(String outputPlugin) ChainedLogicalCreateSlotBuilder 插件名称,当前支持mppdb_decoding。 - make() void 在数据库中创建具有指定参数的插槽。 SQLException self() ChainedLogicalCreateSlotBuilder - -
  • ChainedStreamBuilder的继承关系 ChainedStreamBuilder是逻辑复制的接口,实现类是ReplicationStreamBuilder,该类位于com.huawei.opengauss.jdbc.replication.fluent Package中,该类的声明如下: public class ReplicationStreamBuilder implements ChainedStreamBuilder
  • 常用方法 表1 PGReplicationConnection常用方法 方法名 返回值类型 描述 throws close() void 结束逻辑复制,并释放资源。 SQLException forceUpdateStatus() void 强制将上次接收、刷新和应用的 LSN 状态发送到后端。 SQLException getLastAppliedLSN() LogSequenceNumber 获取上次主机日志回放的LSN。 - getLastFlushedLSN() LogSequenceNumber 获取上次主机刷新的LSN,即当前逻辑解码推进的LSN。 - getLastReceiveLSN() LogSequenceNumber 获取上次接收的LSN。 - isClosed() boolean 复制流是否关闭。 - read() ByteBuffer 从后端读取下一条WAL记录。如果读取不到,该方法阻塞I/O读。 SQLException readPending() ByteBuffer 从后端读取下一条WAL记录。如果读取不到,该方法不阻塞I/O读。 SQLException setAppliedLSN(LogSequenceNumber applied) void 设置应用的LSN。 - setFlushedLSN(LogSequenceNumber flushed) void 设置刷新的LSN,在下次更新时发送至后端,用于推进服务端LSN。 -
  • PGReplicationStream的继承关系 PGReplicationStream是逻辑复制的接口,实现类是V3PGReplicationStream,该类位于com.huawei.opengauss.jdbc.core.v3.replication Package中,该类的声明如下: public class V3PGReplicationStream implements PGReplicationStream
  • PGReplicationConnection的继承关系 PGReplicationConnection是逻辑复制的接口,实现类是PGReplicationConnectionImpl,该类位于com.huawei.opengauss.jdbc.replication Package中,该类的声明如下: public class PGReplicationConnection implements PGReplicationConnection
  • 常用方法 表1 PGReplicationConnection常用方法 方法名 返回值类型 描述 throws createReplicationSlot() ChainedCreateReplicationSlotBuilder 用于创建逻辑复制槽。 - dropReplicationSlot(String slotName) void 用于删除逻辑复制槽。 SQLException,IOException replicationStream() ChainedStreamBuilder 用户开启逻辑复制。 -
  • 常用方法 表1 CopyManager常用方法 方法名 返回值类型 描述 throws copyIn(String sql) CopyIn - SQLException copyIn(String sql, InputStream from) long 使用COPY FROM STDIN从InputStream中快速向数据库中的表加载数据。 SQLException,IOException copyIn(String sql, InputStream from, int bufferSize) long 使用COPY FROM STDIN从InputStream中快速向数据库中的表加载指定长度的数据。 SQLException,IOException copyIn(String sql, Reader from) long 使用COPY FROM STDIN从Reader中快速向数据库中的表加载数据。 SQLException,IOException copyIn(String sql, Reader from, int bufferSize) long 使用COPY FROM STDIN从Reader中快速向数据库中的表加载指定长度的数据。 SQLException,IOException copyOut(String sql) CopyOut - SQLException copyOut(String sql, OutputStream to) long 将一个COPY TO STDOUT的结果集从数据库发送到OutputStream类中。 SQLException,IOException copyOut(String sql, Writer to) long 将一个COPY TO STDOUT的结果集从数据库发送到Writer类中。 SQLException,IOException
  • javax.naming.Context javax.naming.Context是连接配置的上下文接口。 表1 对javax.naming.Context的支持情况 方法名 返回值类型 支持JDBC 4 bind(Name name, Object obj) void Yes bind(String name, Object obj) void Yes lookup(Name name) Object Yes lookup(String name) Object Yes rebind(Name name, Object obj) void Yes rebind(String name, Object obj) void Yes rename(Name oldName, Name newName) void Yes rename(String oldName, String newName) void Yes unbind(Name name) void Yes unbind(String name) void Yes 父主题: JDBC接口参考
  • javax.sql.PooledConnection javax.sql.PooledConnection是由连接池创建的连接接口。 表1 对javax.sql.PooledConnection的支持情况 方法名 返回值类型 支持JDBC 4 addConnectionEventListener (ConnectionEventListener listener) void Yes close() void Yes getConnection() Connection Yes removeConnectionEventListener (ConnectionEventListener listener) void Yes 父主题: JDBC接口参考
  • javax.sql.DataSource javax.sql.DataSource是数据源接口。 表1 对javax.sql.DataSource接口的支持情况 方法名 返回值类型 支持JDBC 4 getConneciton() Connection Yes getConnection(String username,String password) Connection Yes getLoginTimeout() int Yes getLogWriter() PrintWriter Yes setLoginTimeout(int seconds) void Yes setLogWriter(PrintWriter out) void Yes 父主题: JDBC接口参考
  • javax.sql.ConnectionPoolDataSource javax.sql.ConnectionPoolDataSource是数据源连接池接口。 表1 对javax.sql.ConnectionPoolDataSource的支持情况 方法名 返回值类型 支持JDBC 4 getPooledConnection() PooledConnection Yes getPooledConnection(String user,String password) PooledConnection Yes 父主题: JDBC接口参考
  • java.sql.Statement java.sql.Statement是SQL语句接口。 表1 对java.sql.Statement的支持情况 方法名 返回值类型 支持JDBC 4 addBatch(String sql) void Yes clearBatch() void Yes clearWarnings() void Yes close() void Yes closeOnCompletion() void Yes execute(String sql) boolean Yes execute(String sql, int autoGeneratedKeys) boolean Yes execute(String sql, int[] columnIndexes) boolean Yes execute(String sql, String[] columnNames) boolean Yes executeBatch() boolean Yes executeQuery(String sql) ResultSet Yes executeUpdate(String sql) int Yes executeUpdate(String sql, int autoGeneratedKeys) int Yes executeUpdate(String sql, int[] columnIndexes) int Yes executeUpdate(String sql, String[] columnNames) int Yes getConnection() Connection Yes getFetchDirection() int Yes getFetchSize() int Yes getGeneratedKeys() ResultSet Yes getMaxFieldSize() int Yes getMaxRows() int Yes getMoreResults() boolean Yes getMoreResults(int current) boolean Yes getResultSet() ResultSet Yes getResultSetConcurrency() int Yes getResultSetHoldability() int Yes getResultSetType() int Yes getQueryTimeout() int Yes getUpdateCount() int Yes getWarnings() SQLWarning Yes isClosed() boolean Yes isCloseOnCompletion() boolean Yes isPoolable() boolean Yes setCursorName(String name) void Yes setEscapeProcessing(boolean enable) void Yes setFetchDirection(int direction) void Yes setMaxFieldSize(int max) void Yes setMaxRows(int max) void Yes setPoolable(boolean poolable) void Yes setQueryTimeout(int seconds) void Yes setFetchSize(int rows) void Yes cancel() void Yes executeLargeUpdate(String sql) long No getLargeUpdateCount() long No executeLargeBatch() long No executeLargeUpdate(String sql, int autoGeneratedKeys) long No executeLargeUpdate(String sql, int[] columnIndexes) long No executeLargeUpdate(String sql, String[] columnNames) long No 通过setFetchSize可以减少结果集在客户端的内存占用情况。它的原理是通过将结果集打包成游标,然后分段处理,所以会加大数据库与客户端的通信量,但会有性能损耗。 由于数据库游标是事务内有效,所以,在设置setFetchSize的同时,需要将连接设置为非自动提交模式,setAutoCommit(false)。同时在业务数据需要持久化到数据库中时,在连接上执行提交操作。 LargeUpdate相关方法必须在JDBC4.2及以上版本使用。 父主题: JDBC接口参考
  • java.sql.ResultSetMetaData java.sql.ResultSetMetaData是对ResultSet对象相关信息的具体描述。 表1 对java.sql.ResultSetMetaData的支持情况 方法名 返回值类型 支持JDBC 4 getCatalogName(int column) String Yes getColumnClassName(int column) String Yes getColumnCount() int Yes getColumnDisplaySize(int column) int Yes getColumnLabel(int column) String Yes getColumnName(int column) String Yes getColumnType(int column) int Yes getColumnTypeName(int column) String Yes getPrecision(int column) int Yes getScale(int column) int Yes getSchemaName(int column) String Yes getTableName(int column) String Yes isAutoIncrement(int column) boolean Yes isCaseSensitive(int column) boolean Yes isCurrency(int column) boolean Yes isDefinitelyWritable(int column) boolean Yes isNullable(int column) int Yes isReadOnly(int column) boolean Yes isSearchable(int column) boolean Yes isSigned(int column) boolean Yes isWritable(int column) boolean Yes uppercaseAttributeName为true时,下面接口会将查询结果转为大写,可转换范围为26个英文字母。 public String getColumnName(int column) public String getColumnLabel(int column) 父主题: JDBC接口参考
  • java.sql.PreparedStatement java.sql.PreparedStatement是预处理语句接口。 表1 对java.sql.PreparedStatement的支持情况 方法名 返回值类型 支持JDBC 4 clearParameters() void Yes execute() boolean Yes executeQuery() ResultSet Yes excuteUpdate() int Yes executeLargeUpdate() long No getMetaData() ResultSetMetaData Yes getParameterMetaData() ParameterMetaData Yes setArray(int parameterIndex, Array x) void Yes setAsciiStream(int parameterIndex, InputStream x, int length) void Yes setBinaryStream(int parameterIndex, InputStream x) void Yes setBinaryStream(int parameterIndex, InputStream x, int length) void Yes setBinaryStream(int parameterIndex, InputStream x, long length) void Yes setBlob(int parameterIndex, InputStream inputStream) void Yes setBlob(int parameterIndex, InputStream inputStream, long length) void Yes setBlob(int parameterIndex, Blob x) void Yes setCharacterStream(int parameterIndex, Reader reader) void Yes setCharacterStream(int parameterIndex, Reader reader, int length) void Yes setClob(int parameterIndex, Reader reader) void Yes setClob(int parameterIndex, Reader reader, long length) void Yes setClob(int parameterIndex, Clob x) void Yes setDate(int parameterIndex, Date x, Calendar cal) void Yes setNull(int parameterIndex, int sqlType) void Yes setNull(int parameterIndex, int sqlType, String typeName) void Yes setObject(int parameterIndex, Object x) void Yes setObject(int parameterIndex, Object x, int targetSqlType) void Yes setObject(int parameterIndex, Object x, int targetSqlType, int scaleOrLength) void Yes setSQLXML(int parameterIndex, SQLXML xmlObject) void Yes setTime(int parameterIndex, Time x) void Yes setTime(int parameterIndex, Time x, Calendar cal) void Yes setTimestamp(int parameterIndex, Timestamp x) void Yes setTimestamp(int parameterIndex, Timestamp x, Calendar cal) void Yes setUnicodeStream(int parameterIndex, InputStream x, int length) void Yes setURL(int parameterIndex, URL x) void Yes setBoolean(int parameterIndex, boolean x) void Yes setBigDecimal(int parameterIndex, BigDecimal x) void Yes setByte(int parameterIndex, byte x) void Yes setBytes(int parameterIndex, byte[] x) void Yes setDate(int parameterIndex, Date x) void Yes setDouble(int parameterIndex, double x) void Yes setFloat(int parameterIndex, float x) void Yes setInt(int parameterIndex, int x) void Yes setLong(int parameterIndex, long x) void Yes setShort(int parameterIndex, short x) void Yes setString(int parameterIndex, String x) void Yes setNString(int parameterIndex, String x) void Yes addBatch() void Yes executeBatch() int[] Yes addBatch()、execute()必须在clearBatch()之后才能执行。 调用executeBatch()方法并不会清除batch。用户必须显式使用clearBatch()清除 。 在添加了一个batch的绑定变量后,用户若想重用这些值(再次添加一个batch),无需再次使用set*()方法 。 以下方法是从java.sql.Statement继承而来:close,execute,executeQuery,executeUpdate,getConnection,getResultSet,getUpdateCount,isClosed,setMaxRows, setFetchSize。 executeLargeUpdate()方法必须在JDBC4.2及以上版本使用。 父主题: JDBC接口参考
  • java.sql.Driver java.sql.Driver是数据库驱动接口。 表1 对java.sql.Driver的支持情况 方法名 返回值类型 支持JDBC 4 acceptsURL(String url) boolean Yes connect(String url, Properties info) Connection Yes jdbcCompliant() boolean Yes getMajorVersion() int Yes getMinorVersion() int Yes getParentLogger() Logger Yes getPropertyInfo(String url, Properties info) DriverPropertyInfo[] Yes 父主题: JDBC接口参考
  • java.sql.DatabaseMetaData java.sql.DatabaseMetaData是数据库对象定义接口。 表1 对java.sql.DatabaseMetaData的支持情况 方法名 返回值类型 支持JDBC 4 allProceduresAreCallable() boolean Yes allTablesAreSelectable() boolean Yes autoCommitFailureClosesAllResultSets() boolean Yes dataDefinitionCausesTransactionCommit() boolean Yes dataDefinitionIgnoredInTransactions() boolean Yes deletesAreDetected(int type) boolean Yes doesMaxRowSizeIncludeBlobs() boolean Yes generatedKeyAlwaysReturned() boolean Yes getBestRowIdentifier(String catalog, String schema, String table, int scope, boolean nullable) ResultSet Yes getCatalogs() ResultSet Yes getCatalogSeparator() String Yes getCatalogTerm() String Yes getClientInfoProperties() ResultSet Yes getColumnPrivileges(String catalog, String schema, String table, String columnNamePattern) ResultSet Yes getConnection() Connection Yes getCrossReference(String parentCatalog, String parentSchema, String parentTable, String foreignCatalog, String foreignSchema, String foreignTable) ResultSet Yes getDefaultTransactionIsolation() int Yes getExportedKeys(String catalog, String schema, String table) ResultSet Yes getExtraNameCharacters() String Yes getFunctionColumns(String catalog, String schemaPattern, String functionNamePattern, String columnNamePattern) ResultSet Yes getFunctions(String catalog, String schemaPattern, String functionNamePattern) ResultSet Yes getIdentifierQuoteString() String Yes getImportedKeys(String catalog, String schema, String table) ResultSet Yes getIndexInfo(String catalog, String schema, String table, boolean unique, boolean approximate) ResultSet Yes getMaxBinaryLiteralLength() int Yes getMaxCatalogNameLength() int Yes getMaxCharLiteralLength() int Yes getMaxColumnNameLength() int Yes getMaxColumnsInGroupBy() int Yes getMaxColumnsInIndex() int Yes getMaxColumnsInOrderBy() int Yes getMaxColumnsInSelect() int Yes getMaxColumnsInTable() int Yes getMaxConnections() int Yes getMaxCursorNameLength() int Yes getMaxIndexLength() int Yes getMaxLogicalLobSize() default long Yes getMaxProcedureNameLength() int Yes getMaxRowSize() int Yes getMaxSchemaNameLength() int Yes getMaxStatementLength() int Yes getMaxStatements() int Yes getMaxTableNameLength() int Yes getMaxTablesInSelect() int Yes getMaxUserNameLength() int Yes getNumericFunctions() String Yes getPrimaryKeys(String catalog, String schema, String table) ResultSet Yes getPartitionTablePrimaryKeys(String catalog, String schema, String table) ResultSet Yes getProcedureColumns(String catalog, String schemaPattern, String procedureNamePattern, String columnNamePattern) ResultSet Yes getProcedures(String catalog, String schemaPattern, String procedureNamePattern) ResultSet Yes getProcedureTerm() String Yes getSchemas() ResultSet Yes getSchemas(String catalog, String schemaPattern) ResultSet Yes getSchemaTerm() String Yes getSearchStringEscape() String Yes getSQLKeywords() String Yes getSQLStateType() int Yes getStringFunctions() String Yes getSystemFunctions() String Yes getTablePrivileges(String catalog, String schemaPattern, String tableNamePattern) ResultSet Yes getTimeDateFunctions() String Yes getTypeInfo() ResultSet Yes getUDTs(String catalog, String schemaPattern, String typeNamePattern, int[] types) ResultSet Yes getURL() String Yes getVersionColumns(String catalog, String schema, String table) ResultSet Yes insertsAreDetected(int type) boolean Yes locatorsUpdateCopy() boolean Yes othersDeletesAreVisible(int type) boolean Yes othersInsertsAreVisible(int type) boolean Yes othersUpdatesAreVisible(int type) boolean Yes ownDeletesAreVisible(int type) boolean Yes ownInsertsAreVisible(int type) boolean Yes ownUpdatesAreVisible(int type) boolean Yes storesLowerCaseIdentifiers() boolean Yes storesMixedCaseIdentifiers() boolean Yes storesUpperCaseIdentifiers() boolean Yes supportsBatchUpdates() boolean Yes supportsCatalogsInDataManipulation() boolean Yes supportsCatalogsInIndexDefinitions() boolean Yes supportsCatalogsInPrivilegeDefinitions() boolean Yes supportsCatalogsInProcedureCalls() boolean Yes supportsCatalogsInTableDefinitions() boolean Yes supportsCorrelatedSubqueries() boolean Yes supportsDataDefinitionAndDataManipulationTransactions() boolean Yes supportsDataManipulationTransactionsOnly() boolean Yes supportsGetGeneratedKeys() boolean Yes supportsMixedCaseIdentifiers() boolean Yes supportsMultipleOpenResults() boolean Yes supportsNamedParameters() boolean Yes supportsOpenCursorsAcrossCommit() boolean Yes supportsOpenCursorsAcrossRollback() boolean Yes supportsOpenStatementsAcrossCommit() boolean Yes supportsOpenStatementsAcrossRollback() boolean Yes supportsPositionedDelete() boolean Yes supportsPositionedUpdate() boolean Yes supportsRefCursors() boolean Yes supportsResultSetConcurrency(int type, int concurrency) boolean Yes supportsResultSetType(int type) boolean Yes supportsSchemasInIndexDefinitions() boolean Yes supportsSchemasInPrivilegeDefinitions() boolean Yes supportsSchemasInProcedureCalls() boolean Yes supportsSchemasInTableDefinitions() boolean Yes supportsSelectForUpdate() boolean Yes supportsStatementPooling() boolean Yes supportsStoredFunctionsUsingCallSyntax() boolean Yes supportsStoredProcedures() boolean Yes supportsSubqueriesInComparisons() boolean Yes supportsSubqueriesInExists() boolean Yes supportsSubqueriesInIns() boolean Yes supportsSubqueriesInQuantifieds() boolean Yes supportsTransactionIsolationLevel(int level) boolean Yes supportsTransactions() boolean Yes supportsUnion() boolean Yes supportsUnionAll() boolean Yes updatesAreDetected(int type) boolean Yes getTables(String catalog, String schemaPattern, String tableNamePattern, String[] types) ResultSet Yes getColumns(String catalog, String schemaPattern, String tableNamePattern, String columnNamePattern) ResultSet Yes getTableTypes() ResultSet Yes getUserName() String Yes isReadOnly() boolean Yes nullsAreSortedHigh() boolean Yes nullsAreSortedLow() boolean Yes nullsAreSortedAtStart() boolean Yes nullsAreSortedAtEnd() boolean Yes getDatabaseProductName() String Yes getDatabaseProductVersion() String Yes getDriverName() String Yes getDriverVersion() String Yes getDriverMajorVersion() int Yes getDriverMinorVersion() int Yes usesLocalFiles() boolean Yes usesLocalFilePerTable() boolean Yes supportsMixedCaseIdentifiers() boolean Yes storesUpperCaseIdentifiers() boolean Yes storesLowerCaseIdentifiers() boolean Yes supportsMixedCaseQuotedIdentifiers() boolean Yes storesUpperCaseQuotedIdentifiers() boolean Yes storesLowerCaseQuotedIdentifiers() boolean Yes storesMixedCaseQuotedIdentifiers() boolean Yes supportsAlterTableWithAddColumn() boolean Yes supportsAlterTableWithDropColumn() boolean Yes supportsColumnAliasing() boolean Yes nullPlusNonNullIsNull() boolean Yes supportsConvert() boolean Yes supportsConvert(int fromType, int toType) boolean Yes supportsTableCorrelationNames() boolean Yes supportsDifferentTableCorrelationNames() boolean Yes supportsExpressionsInOrderBy() boolean Yes supportsOrderByUnrelated() boolean Yes supportsGroupBy() boolean Yes supportsGroupByUnrelated() boolean Yes supportsGroupByBeyondSelect() boolean Yes supportsLikeEscapeClause() boolean Yes supportsMultipleResultSets() boolean Yes supportsMultipleTransactions() boolean Yes supportsNonNullableColumns() boolean Yes supportsMinimumSQLGrammar() boolean Yes supportsCoreSQLGrammar() boolean Yes supportsExtendedSQLGrammar() boolean Yes supportsANSI92EntryLevelSQL() boolean Yes supportsANSI92IntermediateSQL() boolean Yes supportsANSI92FullSQL() boolean Yes supportsIntegrityEnhancementFacility() boolean Yes supportsOuterJoins() boolean Yes supportsFullOuterJoins() boolean Yes supportsLimitedOuterJoins() boolean Yes isCatalogAtStart() boolean Yes supportsSchemasInDataManipulation() boolean Yes supportsSavepoints() boolean Yes supportsResultSetHoldability(int holdability) boolean Yes getResultSetHoldability() int Yes getDatabaseMajorVersion() int Yes getDatabaseMinorVersion() int Yes getJDBCMajorVersion() int Yes getJDBCMinorVersion() int Yes uppercaseAttributeName为true时,以下接口会将查询结果转为大写,可转换范围与java中的toUpperCase方法一致。 public ResultSet getProcedures(String catalog, String schemaPattern, String procedureNamePattern) public ResultSet getProcedureColumns(String catalog, String schemaPattern, String procedureNamePattern, String columnNamePattern) public ResultSet getTables(String catalog, String schemaPattern, String tableNamePattern, String[] types) public ResultSet getSchemas(String catalog, String schemaPattern) public ResultSet getColumns(String catalog, String schemaPattern, String tableNamePattern, String columnNamePattern) public ResultSet getColumnPrivileges(String catalog, String schema, String table, String columnNamePattern) public ResultSet getTablePrivileges(String catalog, String schemaPattern, String tableNamePattern) public ResultSet getBestRowIdentifier(String catalog, String schema, String table, int scope, boolean nullable) public ResultSet getPrimaryKeys(String catalog, String schema, String table) protected ResultSet getImportedExportedKeys(String primaryCatalog, String primarySchema, String primaryTable, String foreignCatalog, String foreignSchema, String foreignTable) public ResultSet getIndexInfo(String catalog, String schema, String tableName, boolean unique, boolean approximate) public ResultSet getUDTs(String catalog, String schemaPattern, String typeNamePattern, int[] types) public ResultSet getFunctions(String catalog, String schemaPattern, String functionNamePattern) getPartitionTablePrimaryKeys(String catalog, String schema, String table)接口用于获取分区表含全局索引的主键列,使用示例如下: PgDatabaseMetaData dbmd = (PgDatabaseMetaData)conn.getMetaData(); dbmd.getPartitionTablePrimaryKeys("catalogName", "schemaName", "tableName"); 父主题: JDBC接口参考
  • JDBC接口参考 JDBC接口是一套提供给用户的API方法,本节将对部分常用接口做具体描述,若涉及其他接口可参考JDK1.8(软件包)/JDBC4.0中相关内容。 java.sql.Connection java.sql.CallableStatement java.sql.DatabaseMetaData java.sql.Driver java.sql.PreparedStatement java.sql.ResultSet java.sql.ResultSetMetaData java.sql.Statement javax.sql.ConnectionPoolDataSource javax.sql.DataSource javax.sql.PooledConnection javax.naming.Context javax.naming.spi.InitialContextFactory CopyManager PGReplicationConnection PGReplicationStream ChainedStreamBuilder ChainedCommonStreamBuilder 父主题: 基于JDBC开发
  • 从MY迁移数据 下面示例演示如何通过CopyManager从MY向GaussDB进行数据迁移。 代码运行的前提条件: 根据实际情况添加opengaussjdbc.jar包(例如用户使用IDE执行代码,则需要在本地IDE添加opengaussjdbc.jar包)。 MY和 GaussDB数据库 分别创建migration_table表。MY数据库的migration_table表预先插入数据。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 // 认证用的用户名和密码直接写到代码中有很大的安全风险,建议在配置文件或者环境变量中存放(密码应密文存放,使用时解密),确保安全; // 本示例以用户名和密码保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量(环境变量名称请根据自身情况进行设置)EXAMPLE_USERNAME_ENV和EXAMPLE_PASSWORD_ENV。 // $ip、$port、database需要用户自行修改。 import java.io.StringReader; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import com.huawei.opengauss.jdbc.copy.CopyManager; import com.huawei.opengauss.jdbc.core.BaseConnection; public class Migration{ public static void main(String[] args) { String url = new String("jdbc:opengauss://$ip:$port/database"); //数据库URL String user = System.getenv("EXAMPLE_USERNAME_ENV"); //GaussDB用户名 String pass = System.getenv("EXAMPLE_PASSWORD_ENV"); //GaussDB密码 String tablename = new String("migration_table"); //定义表信息 String delimiter = new String("|"); //定义分隔符 String encoding = new String("UTF8"); //定义字符集 String driver = "com.huawei.opengauss.jdbc.Driver"; StringBuffer buffer = new StringBuffer(); //定义存放格式化数据的缓存 try { //获取源数据库查询结果集 ResultSet rs = getDataSet(); //遍历结果集,逐行获取记录 //将每条记录中各字段值,按指定分隔符分割,由换行符结束,拼成一个字符串 //把拼成的字符串,添加到缓存buffer while (rs.next()) { buffer.append(rs.getString(1) + delimiter + rs.getString(2) + delimiter + rs.getString(3) + delimiter + rs.getString(4) + "\n"); } rs.close(); try { //以非加密方式连接数据库 Class.forName(driver); Connection conn = DriverManager.getConnection(url, user, pass); BaseConnection baseConn = (BaseConnection) conn; baseConn.setAutoCommit(false); //初始化表信息 String sql = "Copy " + tablename + " from STDIN DELIMITER " + "'" + delimiter + "'" + " ENCODING " + "'" + encoding + "'"; //提交缓存buffer中的数据 CopyManager cp = new CopyManager(baseConn); StringReader reader = new StringReader(buffer.toString()); cp.copyIn(sql, reader); baseConn.commit(); reader.close(); baseConn.close(); } catch (ClassNotFoundException e) { e.printStackTrace(System.out); } catch (SQLException e) { e.printStackTrace(System.out); } } catch (Exception e) { e.printStackTrace(); } } //******************************** // 从源数据库返回查询结果集 //********************************* private static ResultSet getDataSet() { ResultSet rs = null; try { Class.forName("com.mysql.jdbc.Driver").newInstance(); String userName = System.getenv("EXAMPLE_USERNAME_ENV"); String password = System.getenv("EXAMPLE_PASSWORD_ENV"); Connection conn = DriverManager.getConnection("jdbc:mysql://$ip:$port/database?useSSL=false&allowPublicKeyRetrieval=true", userName, password); Statement stmt = conn.createStatement(); rs = stmt.executeQuery("select * from migration_table"); } catch (SQLException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } return rs; } } 上述示例的运行结果为:迁移后,GaussDB数据库的migration_table表和MY的migration_table表的数据一致。 父主题: 典型应用开发示例
共100000条