返回首页

gbase数据、南大通用产品文档:GBase8c

更新日期:2024年09月11日

Python APL. ...t
40
南 大 通 用 数 据 技 术 股 份 有 限 公 司
m

GBASE"’
GBase 8e V5
挂 术 自 皮 节
1 产
品 简 介
1.
1 发
展 历 程
GBASE「
厚 积 蕴 发
门 无 通 阮

年 户 一

(GBase 8a MPP Cluster
B B

百黄焘^【!′翦 ^翼鏖绮赘藿蜇薯_

X e

大 通 用 自 2010
年 起 涉 足 分 布 式 数 据 库 领
域 , 厚
积 薄 发 , 十 年 磨 一 剑 , 推 出 基 于
openGauss3.
0 版 本 的 多 模 多 态 分 布 式 数 据 库 GBase 8c。

日期问题的最好解决办法是限制用户输入无效日期,该方法可以在客户端
或服务器端任何一方实现。
1) 客户端实现:
.NET
Framework 为应用程序提供了日期控件,当应用程序需要输入日期时
使用日期控件完成输入。
2) 服务器端实现:
日期数据进入数据库时都可通过存储过程完成,无效日期的限制在存储过
程中完成。


GBase 8s JDBC Driver 程序员指南
南大通用数据技术股份有限公司
- 70 -
CallableStatement 方法以 C 函数和 Java™ 用户定义的例程(UDR)来处理 OUT 参数。两
个 registerOutParameter() 方法将 OUT 参数的数据类型指定给驱动程序。一系
列 getXXX() 方法检索 OUT 参数。
JDBC CallableStatement 接口为检索 OUT 参数提供方法。
随同 GBase 8s,对于 BINARY OUT 参数,OUT 参数例程使得 JDBC 客户机可用有效的
blob 描述符和数据。使用 GBase 8s JDBC Driver Version 3.0 及后来的版本中的接收方法,
可使用服务器提供的这些 OUT 参数描述符和数据。
在 GBase 8s 与 JDBC 之间交换描述符和数据,这与现有的机制相一致,为 JDBC 的结果
集方法交换数据,诸如通过 SQLI 协议方法来传递 blob 描述符和数据。
(SPL UDR 是支
持 BINARY OUT 参数的唯一 UDR 类型。)
要了解背景信息,请参阅下列资料:

对于 GBase 8s 数据库中的使用,GBase 8s 用户定义的例程和数据类型开发者指
南 提供关于 opaque 类型和用户定义的例程(UDR)的介绍性和背景信息。

对于在数据库服务器中的使用,
J/Foundation 开发者指南 描述如何编写 Java UDR。


GBase 8s SQL 指南:教程 描述如何编写存储过程语言(SPL)例程。

GBase 8s DataBlade API 程序员指南 描述如何编写外部 C 例程。
GBase 8s 数据库服务器将 OUT 参数返回至 GBase 8s JDBC Driver。GBase 8s 支持多 OUT
参数。
要获取如何使用 OUT 参数的示例,请参阅 CallOut1.java、CallOut2.java、
CallOut3.java 和 CallOut4.java 示例程序,其位于安装 GBase 8s JDBC Driver 的 demo 目录
的 basic 子目录中。
服务器和驱动程序约束和限制
服务器约束
此主题描述 GBase 8s 服务器的约束。它还描述对 JDBC 驱动程序及其约束进行的改善。
不可指定 INOUT 参数。
要获取更多关于 UDR 的信息,请参阅 GBase 8s 用户定义的例程和数据类型开发者指
南 和 J/Foundation 开发者指南。
驱动程序改善
CallableStatement 对象为所有数据库服务器提供了一种以标准方式调用和执行 UDR 的方
式。将执行这些 UDR 的结果作为结果集或作为 OUT 参数返回。
下列为创建用户定义的函数 myudr 的程序,带有两个 OUT 参数和一个 IN 参数,然后,
执行 myudr() 函数。该示例要求对多 OUT 参数的服务器侧支持。要获取关于 UDR 的更
多信息,
请参阅 GBase 8s 用户定义的例程和数据类型开发者指南 和 J/Foundation 开发者指
南。

GBase 8s JDBC Driver 程序员指南
南大通用数据技术股份有限公司
- 71 -
import java.sql.*;
public class myudr {

public myudr() {
}

public static void main(String args[]) {
Connection myConn = null;
try {
Class.forName("com.gbasedbt.jdbc.Driver");
myConn = DriverManager.getConnection(
"jdbc:gbasedbt-sqli:MYSYSTEM:18551/testDB:"
+"GBASEDBTSERVER=patriot1;user=USERID;"
+"password=MYPASSWORD");
}
catch (ClassNotFoundException e) {
System.out.println(
"problem with loading Ifx Driver\n" + e.getMessage());
}
catch (SQLException e) {
System.out.println(
"problem with connecting to db\n" + e.getMessage());
}
try {
Statement stmt = myConn.createStatement();
stmt.execute("DROP FUNCTION myudr");
}
catch (SQLException e){
}
try
{
Statement stmt = myConn.createStatement();

stmt.execute(
"CREATE FUNCTION myudr(OUT arg1 int, arg2 int, OUT arg3 int)"
+" RETURNS boolean; LET arg1 = arg2; LET arg3 = arg2 * 2;"
+"RETURN 't'; END FUNCTION;");
}

GBase 8s JDBC Driver 程序员指南
南大通用数据技术股份有限公司
- 72 -
catch (SQLException e) {
System.out.println(
"problem with creating function\n" + e.getMessage());
}

Connection conn = myConn;

try
{
String command = "{? = call myudr(?, ?, ?)}";
CallableStatement cstmt = conn.prepareCall (command);

// Register arg1 OUT parameter
cstmt.registerOutParameter(1, Types.INTEGER);

// Pass in value for IN parameter
cstmt.setInt(2, 4);

// Register arg3 OUT parameter
cstmt.registerOutParameter(3, Types.INTEGER);

// Execute myudr
ResultSet rs = cstmt.executeQuery();

// executeQuery returns values via a resultSet
while (rs.next())
{
// get value returned by myudr
boolean b = rs.getBoolean(1);
System.out.println("return value from myudr = " + b);
}

// Retrieve OUT parameters from myudr
int i = cstmt.getInt(1);
System.out.println("arg1 OUT parameter value = " + i);

int k = cstmt.getInt(3);
System.out.println("arg3 OUT parameter value = " + k);

GBase 8s JDBC Driver 程序员指南
南大通用数据技术股份有限公司
- 73 -

rs.close();
cstmt.close();
conn.close();
}
catch (SQLException e)
{
System.out.println("SQLException: " + e.getMessage());
System.out.println("ErrorCode: " + e.getErrorCode());
e.printStackTrace();
}
}
}
- - -
.../j2sdk1.4.0/bin/java ... myudr
return value from myudr = true
arg1 OUT parameter value = 4
arg3 OUT parameter value = 8
驱动程序约束和限制
GBase 8s JDBC Driver 有下列关于 OUT 参数的要求和限制:

CallableStatement.getMetaData() 方法返回 NULL,
直到已执行了 executeQuery() 方法
为止。在已调用了 executeQuery() 之后,ResultSetMetaData 对象仅包含返回值的信
息,不包含 OUT 参数。

必须通过使用 setXXX() 方法来指定所有 IN 参数。在 SQL 语句中不可使用文字。
例如,下列语句产生不可靠的结果:
CallableStatement cstmt = myConn.prepareCall("{callmyFunction(25, ?)}");
相反,请使用未指定文字参数的语句:
CallableStatement cstmt = myConn.prepareCall("{callmyFunction(?, ?)}");
为两个参数调用 setXXX() 方法。

请不要关闭 CallableStatement.executeQuery() 方法返回的 ResultSet,直到您已通过
使用 getXXX() 方法检索了 OUT 参数为止。

在 SQL 语句中,不可将 OUT 参数强制转型为不同类型。例如,忽略下列强制转
型:
CallableStatement cstmt = myConn.prepareCall("{callfoo(?::lvarchar, ?)}";

setMaxRows() 和 registerOutParameter() 方法同时取 java.sql.Types 值作为参数。
有一
些从 java.sql.Types 值到 GBase 8s 类型的一对多映射。

GBase 8s JDBC Driver 程序员指南
南大通用数据技术股份有限公司
- 74 -
此外,有些 GBase 8s 类型不映射到 java.sql.Types 值。
对 setMaxRows() 和 registerOutParameter() 的扩展修复了这些问题。请参阅IN 和
OUT 参数类型映射。
这些约束适用于处理 C、SPL 或 Java™ UDR 的 JDBC 应用程序。
IN 和 OUT 参数类型映射
如果驱动程序找不到相匹配的 GBase 8s 类型,或发现映射不明确( 多个相匹配的 GBase
8s 类型),则由 registerOutParameter(int, int)、registerOutParameter(int, int, int) 或 setNull(int,
int) 方法抛出异常。
下表展示映射 CallableStatement 接口使用。
星号
(*)
指示映射不明确。
java.sql.Types
com.gbasedbt.lang.IfxTypes
Array*
IFX_TYPE_LIST
IFX_TYPE_MULTISET
IFX_TYPE_SET
Bigint
IFX_TYPE_INT8
Binary
IFX_TYPE_BYTE
Bit
不受支持
Blob
IFX_TYPE_BLOB
Char
IFX_TYPE_CHAR (n)
Clob
IFX_TYPE_CLOB
Date
IFX_TYPE_DATE
Decimal
IFX_TYPE_DECIMAL
Distinct*
依赖于基础类型
Double
IFX_TYPE_FLOAT
Float
IFX_TYPE_FLOAT1
Integer
IFX_TYPE_INT
Java_Object*
IFX_TYPE_UDTVAR
IFX_TYPE_UDTFIX
Long
IFX_TYPE_BIGINT
IFX_TYPE_BIGSERIAL
Longvarbinary* IFX_TYPE_BYTE

GBase 8s JDBC Driver 程序员指南
南大通用数据技术股份有限公司
- 75 -
java.sql.Types
com.gbasedbt.lang.IfxTypes
IFX_TYPE_BLOB
Longvarchar*
IFX_TYPE_TEXT
IFX_TYPE_CLOB
IFX_TYPE_LVARCHAR
Null
不受支持
Numeric
IFX_TYPE_DECMIAL
Other
不受支持
Real
IFX_TYPE_SMFLOAT
Ref
不受支持
Smallint
IFX_TYPE_SMINT
Struct
IFX_TYPE_ROW
Time
IFX_TYPE_DTIME (hour to second)
Timestamp
IFX_TYPE_DTIME
(year
to
fraction(5))
Tinyint
IFX_TYPE_SMINT
Varbinary
IFX_TYPE_BYTE
Varchar
IFX_TYPE_VCHAR (n)
Nothing*
IFX_TYPE_BOOL
1 此映射符合 JDBC。
为了与较早版本相兼容,
通过将 IFX_SET_FLOAT_AS_SMFLOAT 连
接属性设置为 1,
可将 JDBC FLOAT 数据类型映射至GBase 8s SMALLFLOAT 数据类型。

要避免映射不明确,请使用下列在 IfmxCallableStatement 接口中定义的
对 CallableStatement 的扩展:
public void IfxRegisterOutParameter(int parameterIndex,
int ifxType) throws SQLException;

public void IfxRegisterOutParameter(int parameterIndex,
int ifxType, String name) throws SQLException;

public void IfxRegisterOutParameter(int parameterIndex,
int ifxType, int scale) throws SQLException;

GBase 8s JDBC Driver 程序员指南
南大通用数据技术股份有限公司
- 76 -

public void IfxSetNull(int i, int ifxType) throws SQLException;

public void IfxSetNull(int i, int ifxType, String name) throws
SQLException;
在 IfxTypes 类 中罗列 ifxType 参数的可能的值。
JDBC 客户机可用 GBase 8s 有效的 BLOB 描述符和数据,来支持 SPL UDR 的二进制
OUT 参数。
GBase 8s JDBC Driver Version 3.0 或后来版本可接收服务器提供的 OUT 参数描述符和数
据,并在 Java™ 应用程序中使用它。
对于任何通过方法 getParameterType (ParameterMetaData) 检索的任何 JDBC 二进制类型
(BINARY、VARBINARY、LONGVARBINARY),单个正确的返回值为 -4,其
与 java.sql.Type.LONGVARBINARY 数据类型相关联。这反映了一个事实,就是将所有
JDBC 二进制类型映射至同一GBase 8s SQL 数据类型 BYTE。