返回首页

gbase数据、南大通用产品文档:GBase8s从现有代码创建不透明类型

更新日期:2024年09月11日

前面的主题描述了用于创建不包含现有 Java™ 类的新的不透明类型的方法。从现有 Java
代码创建不透明类型时,请指定不透明类型中包含的 SQL 名称、JAR 文件 SQL 名称、
支持的 UDR(如果有)和任何其他不支持的 UDR。
(有关 SQL 名称的解释,请参阅SQL
名称。)还可以指定长度、对齐方式、隐式和显式强制转换。
要从现有的代码创建不透明类型。请使用以下方法:

UDTMetaData.setSQLName() 指定 SQL 语句中引用的不透明类型的 SQL 名称

对于不透明类型中支持的 UDR 使用 UDTMetaData.setSupportUDR()
支持的 UDR 为输入/输出、发送/接收等等。

对于不透明类型中不支持的 UDR 使用 UDTMetaData.setUDR()

UDTMetaData.setJarFileSQLName() 指定 JAR 文件的 SQL 名称

UDTMetaData.setImplicitCast() 或 UDTMetaData.setExplicitCast() 指定强制转换

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


如果不透明类型是固定长度的,
使用 UDTMetaData.setLength()
(驱动程序缺省为可
变长度)

UDTMetaData.setAlignment() 指定不透明类型所对齐的字节边界(仅当您不希望数
据库服务器默认 4 字节边界时)

UDTManager.createJar() 创建 JAR(.jar)文件(如果没有)

UDTManager.createUDT() 创建不透明类型
另外,
setXXXCast() 、
setSupportUDR() 和 setUDR() 方法仅用于从现有代码创建不透明类型:

public void setImplicitCast(int ifxtype, String methodsqlname)
throws SQLException
public void setExplicitCast(int ifxtype, String methodsqlname)
throws SQLException
public void setSupportUDR(Method method, String sqlname, int type)
throws SQLException
public void setUDR(Method method, String sqlname)
throws SQLException
setXXXCast() 方法
setXXXCast() 方法指定显式或隐式将不透明类型转换为指定的数据类型。
ifxtype 参数是类 com.gbasedbt.lang.IfxTypes 的类型代码。数据库服务器中的 ifxtype 参数和
SQL 类型之间的数据类型映射在映射转换类型中进行了详细说明。methodsqlname 参数是
实现此转换的 Java™ 方法的 SQL 名称。
以下示例使用 SQL 名称 circle2_input 设置由 Java 方法实现的隐式转换:
setImplicitCast(com.gbasedbt.lang.IfxTypes.IFX_TYPE_LVARCHAR,
"circle2_input");
以下示例使用 SQL 名称 circle_output 设置由 Java 方法实现的显式转换:
setExplicitCast(com.gbasedbt.lang.IfxTypes.IFX_TYPE_LVARCHAR,
"circle2_output");
以下示例设置一个显式转换,将 circle2 不透明类型转换为整数:
setExplicitCast(com.gbasedbt.lang.IfxTypes.IFX_TYPE_INT,
"circle2_to_int");
setSupportUDR() 和 setUDR() 方法
setSupportUDR() 方法在现有 Java™ 类中指定 Java 方法,该类将被注册为不透明类型支持
的 UDR。
method 参数指定 java.lang.reflect.Method 中的一个对象,
将其注册为数据库服务中不透明类
型的 Java 支持 UDR。支持的 UDR 为输入、输出、发送、接收等等。(有关更多信息,
请参阅 GBase 8s 用户定义的例程和数据类型开发者指南 。)

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

sqlname 参数指定方法的 SQL 名。有关更多信息,请参阅 SQL 名称。
type 参数指定支持的 UDR 的类型。如下所示:
UDTMetaData.INPUT
UDTMetaData.OUTPUT
UDTMetaData.SEND
UDTMetaData.RECEIVE
UDTMetaData.IMPORT
UDTMetaData.EXPORT
UDTMetaData.BINARYIMPORT
UDTMetaData.BINARYEXPORT
有关如何从现有代码创建不透明类型的操作步骤,请参阅从现有 Java 类创建不透明类型。

提示: 不必注册 SQLData 接口中方法。例如,您不需注册 SQLData.getSQLTypeName() 、
SQLData.readSQL() 或 SQLData.writeSQL()。
要指定其他 UDR,使用创建 UDR 中描述的 setUDR()。

函数说明
以下函数执行日期计算:

DATE_ADD(date,INTERVAL expr type),加法操作;

DATE_SUB(date,INTERVAL expr type),减法操作。

参数说明

date 是一个DATETIME 或DATE 值,指定一个日期的开始。expr 是一个表达
式,用来指定从起始日期添加或减去的时间间隔值;

INTERVAL 关键字和类型修饰符大小写不敏感;

expr 是一个字符串,对于负值的时间间隔,它可以以一个“-”开头。

type 为关键词,它指示了表达式被解释的方式。
表 5-133 相关的type 和expr 参数说明
type 值
期望的expr 格式
MICROSECOND
MICROSECONDS
SECOND
SECONDS
MINUTE
MINUTES
HOUR
HOURS
DAY
DAYS
WEEK
WEEKS
MONTH
MONTHS
QUARTER
QUARTERS
YEAR
YEARS
SECOND_MICROSECOND
'SECONDS.MICROSECONDS'
MINUTE_MICROSECOND
'MINUTES.MICROSECONDS'
MINUTE_SECOND
'MINUTES:SECONDS'
HOUR_MICROSECOND
'HOURS.MICROSECONDS'

GBase UP 产品手册 5 数据库管理指南
文档版本04(2021-04-21) 南大通用数据技术股份有限公司 857
type 值
期望的expr 格式
HOUR_SECOND
'HOURS:MINUTES:SECONDS'
HOUR_MINUTE
'HOURS:MINUTES'
DAY_MICROSECOND
'DAYS.MICROSECONDS'
DAY_SECOND
'DAYS HOURS:MINUTES:SECONDS'
DAY_MINUTE
'DAYS HOURS:MINUTES'
DAY_HOUR
'DAYS HOURS'
YEAR_MONTH
'YEARS-MONTHS'
说明

在expr 的格式中,GBase UP 允许任何字符作为定界符。表中所显示的是建议的定界
字符。如果date 参数是一个DATE 值,并且计算的间隔仅仅有YEAR、MONTH 和
DAY 部分(没有时间部分),那么返回值也是一个DATE 值。否则返回值是一个
DATETIME 值;

如果表达式另一边是DATE 或DATETIME 类型,那么INTERVAL expr type 允许出现
在“+”的任何一边。对于“-”来说,INTERVAL expr type 值只能出现在右边,因为
从一个时间间隔减去一个DATE 或DATETIME 值没有意义。
注意
不同引擎支持的参数情况不同, 例如,HIVE 引擎不支持该函数。

8a 支持type 具体信息请参见“5.4.6.5.12 DATE_ADD(),DATE_S
UB”。
示例
示例1
将“2010-08-30 23:59:59”加1 秒。
gbase> SELECT '2010-08-30 23:59:59' + INTERVAL 1 SECOND FROM t;
+--------------------------------------------+
| '2010-08-30 23:59:59' + INTERVAL 1 SECOND |
+--------------------------------------------+
| 2010-08-31 00:00:00 |
+--------------------------------------------+
1 row in set
示例2
使用DATE_ADD()函数,将“2010-08-30 23:59:59”加一秒,执行结果与示例1 相

GBase UP 产品手册 5 数据库管理指南
文档版本04(2021-04-21) 南大通用数据技术股份有限公司 858
同。
gbase> SELECT DATE_ADD('2010-08-30 23:59:59',INTERVAL 1 SECOND) FROM t;
+---------------------------------------------------+
| DATE_ADD('2010-08-30 23:59:59',INTERVAL 1 SECOND) |
+---------------------------------------------------+
| 2010-08-31 00:00:00 |
+---------------------------------------------------+
1 row in set
示例3
将“2010-12-31 23:59:59”加一天。
gbase> SELECT INTERVAL 1 DAY + '2010-12-31 23:59:59' FROM t;
+----------------------------------------+
| INTERVAL 1 DAY + '2010-12-31 23:59:59' |
+----------------------------------------+
| 2011-01-01 23:59:59 |
+----------------------------------------+
1 row in set
示例4
使用DATE_ADD()函数,将“2010-12-31 23:59:59”加一天,执行结果与示例3 相
同。
gbase> SELECT DATE_ADD('2010-12-31 23:59:59',INTERVAL 1 DAY) FROM t;
+------------------------------------------------+
| DATE_ADD('2010-12-31 23:59:59',INTERVAL 1 DAY) |
+------------------------------------------------+
| 2011-01-01 23:59:59 |
+------------------------------------------------+
1 row in set
示例5
DATE_ADD()函数,type 类型为“MINUTE_SECOND”。
gbase> SELECT DATE_ADD('2010-12-31 23:59:59', INTERVAL '1:1' MINUTE_SECOND) FROM t;
+---------------------------------------------------------------+
| DATE_ADD('2010-12-31 23:59:59', INTERVAL '1:1' MINUTE_SECOND) |
+---------------------------------------------------------------+
| 2011-01-01 00:01:00 |
+---------------------------------------------------------------+
1 row in set

GBase UP 产品手册 5 数据库管理指南
文档版本04(2021-04-21) 南大通用数据技术股份有限公司 859
示例6
DATE_SUB()函数,type 类型为“DAY_SECOND”。
gbase> SELECT DATE_SUB('2010-01-01 00:00:00', INTERVAL '1 1:1:1' DAY_SECOND) FROM t;
+----------------------------------------------------------------+
| DATE_SUB('2010-01-01 00:00:00', INTERVAL '1 1:1:1' DAY_SECOND) |
+----------------------------------------------------------------+
| 2009-12-30 22:58:59 |
+----------------------------------------------------------------+
1 row in set
示例7
DATE_ADD()函数,type 类型为“DAY_HOUR”。
gbase> SELECT DATE_ADD('2010-01-01 00:00:00', INTERVAL '-1 10' DAY_HOUR) FROM t;
+------------------------------------------------------------+
| DATE_ADD('2010-01-01 00:00:00', INTERVAL '-1 10' DAY_HOUR) |
+------------------------------------------------------------+
| 2009-12-30 14:00:00 |
+------------------------------------------------------------+
1 row in set

示例8
DATE_ADD()函数,type 类型为“DAY_HOUR”。
gbase> SELECT DATE_ADD('2010-01-01 00:00:00', INTERVAL '-1 -10' DAY_HOUR) FROM t;
+-------------------------------------------------------------+
| DATE_ADD('2010-01-01 00:00:00', INTERVAL '-1 -10' DAY_HOUR) |
+-------------------------------------------------------------+
| 2009-12-30 14:00:00 |
+-------------------------------------------------------------+
1 row in set
说明
因为“-1”是减去一天,
所以小时“-10”,
也是进行减法,
这个操作,
取决于最前面的操作符号。

下面示例里的写法,等价于示例7 的计算。
示例9
DATE_SUB()函数,type 类型为“DAY”。
gbase> SELECT DATE_SUB('2010-01-02', INTERVAL 31 DAY) FROM t;

GBase UP 产品手册 5 数据库管理指南
文档版本04(2021-04-21) 南大通用数据技术股份有限公司 860
+-----------------------------------------+
| DATE_SUB('2010-01-02', INTERVAL 31 DAY) |
+-----------------------------------------+
| 2009-12-02 |
+-----------------------------------------+
1 row in set
示例10
DATE_ADD()函数,type 类型为“SECOND_MICROSECOND”。
gbase> SELECT DATE_ADD('2010-08-31 23:59:59.000002',INTERVAL '1.999999'
SECOND_MICROSECOND) AS DATE_ADD FROM t;
+----------------------------+
| DATE_ADD |
+----------------------------+
| 2010-09-01 00:00:01.000001 |
+----------------------------+
1 row in set
说明

如果用户指定了一个过短的间隔值(没有包括type 关键词所期望的所有间隔部分),
GBase UP 假设用户遗漏了间隔值的最左边部分;

例如,如果指定一个type 为DAY_SECOND,那么expr 的值预期应当具有天、小时、
分钟和秒部分。如果用户指定的值像“1:10”这样的格式,GBase UP 假设天和小时部
分被遗漏了,
指定的值代表分钟和秒。
也就是说,
“1:10”
DAY_SECOND 等价于
“1:10”
MINUTE_SECOND。这类似于GBase UP 解释TIME 值为经过的时间而不是一天的时
刻;

如果用户从一个日期类型中加或减一个包含时间的值,结果会自动调节然后转换成日
期类型。
示例11
在“2010-01-30”上加1 天。
gbase> SELECT DATE_ADD('2010-08-30', INTERVAL 1 DAY) FROM t;
+----------------------------------------+
| DATE_ADD('2010-08-30', INTERVAL 1 DAY) |
+----------------------------------------+
| 2010-08-31 |
+----------------------------------------+
1 row in set
示例12

GBase UP 产品手册 5 数据库管理指南
文档版本04(2021-04-21) 南大通用数据技术股份有限公司 861
在日期类型中加1 个小时,返回结果转换为“日期+时间”类型。
gbase> SELECT DATE_ADD('2010-01-01', INTERVAL 1 HOUR) FROM t;
+-----------------------------------------+
| DATE_ADD('2010-01-01', INTERVAL 1 HOUR) |
+-----------------------------------------+
| 2010-01-01 01:00:00 |
+-----------------------------------------+
1 row in set
说明

如果用户使用了不正确的日期,返回结果将是NULL。

如果用户增加MONTH、YEAR_MONTH 或YEAR,并且结果日期的天比新月份的最
大天数还大,那么它将被调整到新月份的最大天数。
示例13
在“2010-01-30”上加1 月。
gbase> SELECT DATE_ADD('2010-01-30', INTERVAL 1 MONTH) FROM t;
+------------------------------------------+
| DATE_ADD('2010-01-30', INTERVAL 1 MONTH) |
+------------------------------------------+
| 2010-02-28 |
+------------------------------------------+
1 row in set

功能说明
事件触发器,提供了关于触发程序的信息,必须有super 权限才能查看该表。
表结构说明
表5- 240 表结构信息说明:





GBase 8a MPP Cluster 产品手册
5 数据库管理指南
文档版本953(2022-04-10)
南大通用数据技术股份有限公司
1484
TRIGGER_CATALOG
触发器登记目录,NULL
TRIGGER_VC
触发器所在虚拟集群名
TRIGGER_SCHEMA
触发器所在数据库名
TRIGGER_NAME
触发器名称
EVENT_MANIPULATION
触发器事件类型[INSERT|DELETE|UPDATE]
EVENT_OBJECT_CATALOG
触发器相关表登记目录,NULL
EVENT_OBJECT_SCHEMA
触发器相关表所在数据库
EVENT_OBJECT_TABLE
触发器相关表名
ACTION_ORDER
触发器在同一个表中所有类似的触发器顺序位
置,恒为0,因为同一个表不可能有超过一个具



EVENT_MANIPULATION

ACTION_TIMING 的触发器
ACTION_CONDITION
恒为NULL
ACTION_STATEMENT
触发器主体,即触发器被触发时的执行状态,
使用UTF-8 编码
ACTION_ORIENTATION
值恒为"ROW"
ACTION_TIMING
触发器在触发事件前还是后被触发,
[BEFORE|AFTER]
ACTION_REFERENCE_OLD_TA
BLE
恒为NULL
ACTION_REFERENCE_NEW_TA
BLE
恒为NULL
ACTION_REFERENCE_OLD_RO
W
旧的列鉴别器[OLD]
ACTION_REFERENCE_NEW_RO
W
新的列鉴别器[NEW]
CREATED
创建时间
SQL_MODE
sql 的执行模式
DEFINER
创建触发器的用户
CHARACTER_SET_CLIENT
创建时session 使用的字符集
COLLATION_CONNECTION
创建时session 使用的校验集
DATABASE_COLLATION
相关数据库的校验集