返回首页

gbase数据、南大通用产品文档:GBase8sSET DATASKIP 语句

更新日期:2024年09月11日

在事务处理期间,使用 SET DATASKIP 语句来控制数据库服务器是否跳过不可
用的 dbspace。
此语句是对 SQL 的 ANSI/ISO 标准的扩展。
语法

元素
描述
限制
语法
dbspace 跳过的 dbspace 的名称 在执行时刻必须存在
标识符
用法
SET DATASKIP 允许您在运行时重置 Dataskip 特性,在处理事务的过程中,其
控制数据库服务器是否跳过不可用的 dbspace(例如,由于介质失败)。
在 GBase 8s ESQL/C 中,如果跳过 dbspace,则将警告标志
sqlca.sqlwarn.sqlwarn6 设置为 W。另请参阅 GBase 8s ESQL/C 程序员手册。
在 GBase 8s 中,此语句仅适用于那些跨 dbspace 或分区分片的表。它既不适用
于 blobspace 也不适用于 sbspac。
指定不包括 dbspace 的 SET DATASKIP ON,指导数据库服务器跳过在不可用的
分片列表中的任何 dbspace。您可使用 onstat -d 或 -D 选项来确定 dbspace 是否
关闭。
当您指定 SET DATASKIP ON dbspace 时,你正在指导数据库服务器跳过指定的
dbspace,如果它是不可用的话。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 985
如果您指定 SET DATASKIP OFF,则禁用 Dataskip 特性。如果您指定 SET
DATASKIP DEFAULT,则数据库服务器使用在 ONCONFIG 文件中 DATASKIP
配置参数中指定的设置。
示例
下例跳过当前会话的 dbsp1:
SET DATASKIP ON dbsp1;
下例将 DATASKIP 的值设置为在 onconfig 中指定的值:
SET DATASKIP DEFAULT;
下例关闭 DATASKIP 以便于使用所有 dbspace。
SET DATASKIP OFF;
当不可跳过 dbspace 时的情况
在某些条件下,数据库服务器不可跳过 dbspace。下列列表概述这些条件:

引用的约束检查
当您想要删除父行时,子行也必须可用于删除,且必须在可用的分片中存
在。
当您想要插入新的子行时,必须在可用的分片中找到父行。

更新
当您执行一个将记录从一个分片移到另一分片的更新时,两个分片必须都
是可用的。

插入
当您试图在基于表达式的分片策略中插入记录且该 dbspace 不可用时,
返回错误。
当您试图在基于轮转法分片策略中插入记录时,且 dbspace 关闭,数据
库服务器将这些行插入到任何可用的 dbspace 内。
当没有 dbspace 可用时,返回错误。

索引
当您执行影响索引的更新时,比如当您插入或删除行,或更新索引了的
列,该索引必须是可用的。
当您试图创建索引时,您想要使用的 dbspace 必须是可用的。

序列键

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 986
使用第一个分片内部地存储当前的序列键。除了当第一个分片不再可用并
需要新的序列键值时之外,这是对您不可见的,其可发生在 INSERT 语
句期间。

时间/日期函数

age(timestamp, timestamp)
描述:将两个参数相减,并以年、月、日作为返回值。若相减值为负,则函数返回亦为
负。两个参数类型必须相同,可以都带timezone,或都不带timezone。
返回值类型:interval
示例:
gbase=# SELECT age(timestamp '2001-04-10', timestamp '1957-06-13');
age
-------------------------
43 years 9 mons 27 days
(1 row)

age(timestamp)
描述:当前时间和参数相减,入参可以带或者不带timezone。
返回值类型:interval
示例:
gbase=# SELECT age(timestamp '1957-06-13');
age
-------------------------

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
182
64 years 11 mons 4 days
(1 row)

clock_timestamp()
描述:实时时钟的当前时间戳。
返回值类型:timestamp with time zone
示例:
gbase=# SELECT clock_timestamp();
clock_timestamp
-------------------------------
2022-05-17 16:34:14.629575+08
(1 row)

current_date
描述:当前时间。
返回值类型:date
示例:
gbase=# SELECT current_date;
date
------------
2022-05-17
(1 row)

current_time
描述:当前时间。
返回值类型:time with time zone
示例:
gbase=# SELECT current_time;
timetz
--------------------
16:35:00.099149+08
(1 row)

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
183

current_timestamp
描述:当前日期及时间。
返回值类型:timestamp with time zone
示例:
gbase=# SELECT current_timestamp;
pg_systimestamp
-------------------------------
2022-05-17 16:35:08.018834+08
(1 row)

date_part(text, timestamp)
描述:获取日期/时间值中子域的值,例如年或者小时的值。等效于extract(field from
timestamp)。
timestamp 类型:abstime、date、interval、reltime、time with time zone、time without time
zone、timestamp with time zone、timestamp without time zone。
返回值类型:date
示例:
gbase=# SELECT date_part('hour', timestamp '2001-02-16 20:38:40');
date_part
-----------
20
(1 row)

date_part(text, interval)
描述:获取日期/时间值中子域的值。获取月份值时,如果月份值大于12,则取与
12 的模。等效于extract(field from timestamp)。
返回值类型:double precision
示例:
gbase=# SELECT date_part('month', interval '2 years 3 months');

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
184
date_part
-----------
3
(1 row)

date_trunc(text, timestamp)
描述:截取到参数text 指定的精度。
返回值类型:interval、timestamp with time zone、timestamp without time zone
示例:
gbase=# SELECT date_trunc('hour', timestamp '2001-02-16 20:38:40');
date_trunc
---------------------
2001-02-16 20:00:00
(1 row)

trunc(timestamp)
描述:默认按天截取。示例:
gbase=# SELECT trunc(timestamp '2001-02-16 20:38:40');
trunc
---------------------
2001-02-16 00:00:00
(1 row)

trunc(arg1, arg2)
描述:截取到arg2 指定的精度。
arg1 类型:interval、timestamp with time zone、timestamp without time zone
arg2 类型:text
返回值类型:interval、timestamp with time zone、timestamp without time zone
示例:
gbase=# SELECT trunc(timestamp '2001-02-16 20:38:40', 'hour');
trunc
---------------------
2001-02-16 20:00:00

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
185
(1 row)

daterange(arg1, arg2)
描述:获取时间边界信息。arg1 和arg2 的类型为date。
返回值类型:daterange
示例:
gbase=# select daterange('2000-05-06','2000-08-08');
daterange
-------------------------
[2000-05-06,2000-08-08)
(1 row)

daterange(arg1, arg2, text)
描述:获取时间边界信息。arg1 和arg2 的类型为date,text 类型为text。返回值类型:
daterange
示例:
gbase=# select daterange('2000-05-06','2000-08-08','[]');
daterange
-------------------------
[2000-05-06,2000-08-09)
(1 row)

extract(field from timestamp)
描述:获取小时的值。
返回值类型:double precision
示例:
gbase=# SELECT extract(hour from timestamp '2001-02-16 20:38:40');
date_part
-----------
20
(1 row)

extract(field from interval)

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
186
描述:获取月份的值。如果大于12,则取与12 的模。返回值类型:double precision
示例:
gbase=# SELECT extract(month from interval '2 years 3 months');
date_part
-----------
3
(1 row)

isfinite(date)
描述:测试是否为有效日期。返回值类型:Boolean
示例:
gbase=# SELECT isfinite(date '2001-02-16');
isfinite
----------
t
(1 row)

isfinite(timestamp)
描述:测试判断是否为有效时间。返回值类型:Boolean
示例:
gbase=# SELECT isfinite(timestamp '2001-02-16 21:28:30');
isfinite
----------
t
(1 row)

isfinite(interval)
描述:测试是否为有效区间。返回值类型:Boolean
示例:
gbase=# SELECT isfinite(interval '4 hours');
isfinite
----------
t
(1 row)

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
187

justify_days(interval)
描述:将时间间隔以月(30 天为一月)为单位。返回值类型:interval
示例:
gbase=# SELECT justify_days(interval '35 days');
justify_days
--------------
1 mon 5 days
(1 row)

justify_hours(interval)
描述:将时间间隔以天(24 小时为一天)为单位。返回值类型:interval
示例:
gbase=# SELECT JUSTIFY_HOURS(INTERVAL '27 HOURS');
justify_hours
----------------
1 day 03:00:00
(1 row)

justify_interval(interval)
描述:结合justify_days 和justify_hours,调整interval。返回值类型:interval
示例:
gbase=# SELECT JUSTIFY_INTERVAL(INTERVAL '1 MON -1 HOUR');
justify_interval
------------------
29 days 23:00:00
(1 row)

localtime
描述:当前时间。
返回值类型:time
示例:
gbase=# SELECT localtime AS RESULT;

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
188
result
-----------------
16:39:21.245672
(1 row)

localtimestamp
描述:当前日期及时间。返回值类型:timestamp 示例:
gbase=# SELECT localtimestamp;
timestamp
----------------------------
2022-05-17 16:39:41.292909
(1 row)

now()
描述:当前日期及时间。
返回值类型:timestamp with time zone
示例:
gbase=# SELECT now();
now
-------------------------------
2022-05-17 16:47:22.123899+08
(1 row)

timenow
描述:当前日期及时间。
返回值类型:timestamp with time zone
示例:
gbase=# select timenow();
timenow
------------------------
2022-05-17 16:55:05+08
(1 row)

numtodsinterval(num, interval_unit)

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
189
描述:将数字转换为interval 类型。num 为numeric 类型数字,interval_unit 为固定格式
字符串('DAY' | 'HOUR' | 'MINUTE' | 'SECOND')

可以通过设置参数IntervalStyle 为a,兼容该函数interval 输出格式。
示例:
gbase=# SELECT numtodsinterval(100, 'HOUR');
numtodsinterval
-----------------
100:00:00
(1 row)
gbase=# SET intervalstyle = a;
SET
gbase=# SELECT numtodsinterval(100, 'HOUR');
numtodsinterval
-------------------------------
+000000004 04:00:00.000000000
(1 row)

pg_sleep(seconds)
描述:服务器线程延迟时间,单位为秒。
返回值类型:void
示例:
gbase=# SELECT pg_sleep(10);
pg_sleep
----------
(1 row)

statement_timestamp()
描述:当前日期及时间。
返回值类型:timestamp with time zone
示例:
gbase=# SELECT statement_timestamp();
statement_timestamp
-------------------------------

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
190
2022-05-17 16:56:15.024107+08
(1 row)

sysdate
描述:当前日期及时间。
返回值类型:timestamp
示例:
gbase=# SELECT sysdate;
sysdate
---------------------
2022-05-17 16:56:35
(1 row)

timeofday()
描述:当前日期及时间(像clock_timestamp,但是返回时为text)

返回值类型:text
示例:
gbase=# SELECT timeofday();
timeofday
-------------------------------------
Tue May 17 16:56:58.381310 2022 CST
(1 row)

transaction_timestamp()
描述:当前日期及时间,与current_timestamp 等效。
返回值类型:timestamp with time zone
示例:
gbase=# SELECT transaction_timestamp();
transaction_timestamp
-------------------------------
2022-05-17 16:57:15.156131+08
(1 row)

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
191

add_months(d,n)
描述:用于计算时间点d 再加上n 个月的时间。返回值类型:timestamp
示例:
gbase=# SELECT add_months(to_date('2017-5-29', 'yyyy-mm-dd'), 11) FROM
sys_dummy;
add_months
---------------------
2018-04-29 00:00:00
(1 row)

last_day(d)
描述:用于计算时间点d 当月最后一天的时间。返回值类型:timestamp
示例:
gbase=# select last_day(to_date('2017-01-01', 'YYYY-MM-DD')) AS cal_result;
cal_result
---------------------
2017-01-31 00:00:00
(1 row)

next_day(x,y)
描述:用于计算时间点x 开始的下一个星期几(y)的时间。返回值类型:timestamp
示例:
gbase=# select next_day(timestamp '2017-05-25 00:00:00','Sunday')AS cal_result;
cal_result
---------------------
2017-05-28 00:00:00
(1 row)

tinterval(abstime, abstime)
描述:用两个绝对时间创建时间间隔。
返回值类型:tinterval
示例:

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
192
gbase=# call tinterval(abstime 'May 10, 1947 23:59:12', abstime 'Mon May 1
00:30:30 1995');
tinterval
-----------------------------------------------------
["1947-05-10 23:59:12+09" "1995-05-01 00:30:30+08"]
(1 row)

tintervalend(tinterval)
描述:返回tinteval 的结束时间。
返回值类型:abstime
示例:
gbase=# select tintervalend('["Sep 4, 1983 23:59:12" "Oct4, 1983 23:59:12"]');
tintervalend
------------------------
1983-10-04 23:59:12+08
(1 row)

tintervalrel(tinterval)
描述:计算并返回tinterval 的相对时间。
返回值类型:reltime
示例:
gbase=# select tintervalrel('["Sep 4, 1983 23:59:12" "Oct4, 1983 23:59:12"]');
tintervalrel
--------------
0-1
(1 row)

tz_offset
描述:将时区别名转换为以UTC 为标准的OFFSET。
返回值类型:varchar
示例:
gbase=# select tz_offset('US/Eastern');
tz_offset

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
193
-----------
-04:00:00
(1 row)

smalldatetime_ge
描述:判断是否第一个参数大于等于第二个参数。
参数:smalldatetime, smalldatetime
返回值类型:boolean

smalldatetime_cmp
描述:对比smalldatetime 是否相等。
参数:smalldatetime,
smalldatetime
返回值类型:integer

smalldatetime_eq
描述:对比smalldatetime 是否相等。
参数:smalldatetime,
smalldatetime
返回值类型:boolean。

smalldatetime_gt
描述:判断是否第一个参数大于第二个参数。
参数:smalldatetime, smalldatetime
返回值类型:boolean

smalldatetime_hash
描述:计算timestamp 对应的哈希值。
参数:smalldatetime
返回值类型:integer

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
194

smalldatetime_in
描述:输入timestamp。
参数:cstring, oid, integer
返回值类型:smalldatetime

smalldatetime_larger
描述:返回较大的timestamp。
参数:smalldatetime, smalldatetime
返回值类型:smalldatetime

smalldatetime_le
描述:判断是否第一个参数小于等于第二个参数。
参数:smalldatetime, smalldatetime
返回值类型:boolean

smalldatetime_lt
描述:判断是否第一个参数小于第二个参数。
参数:smalldatetime, smalldatetime
返回值类型:boolean

smalldatetime_ne
描述:比较两个timestamp 是否不相等。
参数:smalldatetime, smalldatetime
返回值类型:boolean

smalldatetime_out
描述:timestamp 转换为外部形式。

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
195
参数:smalldatetime
返回值类型:cstring

smalldatetime_send
描述:timestamp 转换为二进制格式。
参数:smalldatetime
返回值类型:bytea

smalldatetime_smaller
描述:返回较小的一个smalldatetime。
参数:smalldatetime, smalldatetime
返回值类型:smalldatetime

smalldatetime_to_abstime
描述:smalldatetime 转换为abstime。
参数:smalldatetime
返回值类型:abstime

smalldatetime_to_time
描述:smalldatetime 转换为time。
参数:smalldatetime
返回值类型:time without time zone

smalldatetime_to_timestamp
描述:smalldatetime 转换为timestamp。
参数:smalldatetime
返回值类型:timestamp without time zone

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
196

smalldatetime_to_timestamptz
描述:smalldatetime 转换为timestamptz。
参数:smalldatetime
返回值类型:timestamp with time zone

smalldatetime_to_varchar2
描述:smalldatetime 转换为varchar2。
参数:smalldatetime
返回值类型:character varying
获取当前时间有多种方式,请根据实际业务从场景选择合适的接口:
(1)
以下接口按照当前事务的开始时刻返回值:
CURRENT_DATE CURRENT_TIME CURRENT_TIMESTAMP CURRENT_TIME(precision)
CURRENT_TIMESTAMP(precision) LOCALTIME LOCALTIMESTAMP LOCALTIME(precision)
LOCALTIMESTAMP(precision)
其中CURRENT_TIME 和CURRENT_TIMESTAMP 传递带有时区的值;LOCALTIME
和LOCALTIMESTAMP 传递的值不带时区。CURRENT_TIME、CURRENT_TIMESTAMP、
LOCALTIME 和
LOCALTIMESTAMP 可以有选择地接受一个精度参数,该精度导致结果
的秒域被园整为指定小数位。如果没有精度参数,结果将被给予所能得到的全部精度。
因为这些函数全部都按照当前事务的开始时刻返回结果,
所以它们的值在事务运行的整
个期间内都不改变。我们认为这是一个特性:目的是为了允许一个事务在“当前”时间上有
一致的概念,这样在同一个事务里的多个修改可以保持同样的时间戳。
(2)
以下接口返回当前语句开始时间:
transaction_timestamp() statement_timestamp() now()
其中transaction_timestamp()等价于CURRENT_TIMESTAMP,但是其命名清楚地反映
了它的返回值。statement_timestamp()返回当前语句的开始时刻(更准确的说是收到客户端

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
197
最后一条命令的时间)
。statement_timestamp()和transaction_timestamp()在
一个事务的第一
条命令期间返回值相同,但是在随后的命令中却不一定相同。now() 等效于
transaction_timestamp()。
a.
以下接口返回函数被调用时的真实当前时间:
clock_timestamp() timeofday()
clock_timestamp()返回真正的当前时间,因此它的值甚至在同一条SQL 命令中都会变
化。timeofday()和clock_timestamp()相似,timeofday()也返回真实的当前时
间,但是它的
结果是一个格式化的text 串,而不是timestamp with time zone 值。
表5-6 显示了可以用于截断日期和时间值的模板。
表5-6 用于日期/时间截断的模式
类别
模式
描述
微秒
MICROSECON
截断日期/时间,精确到微秒
(000000 - 999999)
US
USEC
USECOND
毫秒
MILLISECON
截断日期/时间,精确到毫秒
(000 - 999)
MS
MSEC
MSECOND

S
截断日期/时间,
精确到秒
(00
- 59)
SEC
SECOND
分钟
M
截断日期/时间,精确到分钟
(00 - 59)
MI

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
198
千年
MIL
截断日期/时间,精确到千年
(本千年的第一天)
MILLENNIA
MILLENNIUM


如果使用jdbc 进行ssl 数据传输,
前提是必须server 支持,
必须先开启server
端的ssl 功能。

开启集群步骤如下(可参考集群手册,以下只给出开启步骤)

1)生成ssl 文件(直接在linux 下执行即可)
openssl genrsa 2048 > ca-key.pem
openssl req -sha1 -new -x509 -nodes -days 3650 -key ca-key.pem > ca-cert.pem
openssl req -sha1 -newkey rsa:2048 -days 730 -nodes -keyout server-key.pem > server-req.pem
openssl rsa -in server-key.pem -out server-key.pem
openssl x509 -sha1 -req -in server-req.pem -days 730 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > server-cert.pem
openssl req -sha1 -newkey rsa:2048 -days 730 -nodes -keyout client-key.pem > client-req.pem
openssl rsa -in client-key.pem -out client-key.pem
openssl x509 -sha1 -req -in client-req.pem -days 730 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > client-cert.pem
此步骤可能出现提示,直接忽略即可
2) 拷贝三个文件到某个目录下,在gcluster*.cnf下设置如下内容
ssl-ca=/usr/local/myssl/ca-cert.pem
ssl-cert=/usr/local/myssl/server-cert.pem
ssl-key=/usr/local/myssl/server-key.pem

GBase 8a 程序员手册JDBC 篇
南大通用数据技术股份有限公司

- 175 -

3) 重启集群然后通过show variables like '%SSL%'查看是否开启ssl功能。
如下为开启:

show variables like '%ssl%';
+---------------+----------------------------------+
| Variable_name | Value |
+---------------+----------------------------------+
| have_openssl | YES |
| have_ssl | YES |
| ssl_ca | /usr/local/myssl/ca-cert.pem |
| ssl_capath | |
| ssl_cert | /usr/local/myssl/server-cert.pem |
| ssl_cipher | |
| ssl_key | /usr/local/myssl/server-key.pem |
+---------------+----------------------------------+


经过前面三步集群已经开启ssl功能,针对jdbc按照如下使用步骤
1)生成jdbc连接用密钥
keytool -import -alias GBaseCACert -file ca-cert.pem -keystore truststore
说明:ca-cert.pem为生成ssl文件时生成的文件,执行该步骤后会提示输入认
证,即密码,比如输入password1(jdbc会用到)
openssl x509 -outform DER -in client-cert.pem -out client.cert
keytool -import -file client.cert -keystore keystore -alias GBaseClientCertificate
说明:client.cert为生成ssl文件时生成的文件,执行该步骤后会提示输入认
证,即密码,比如输入password1,(jdbc会用到)
2)上述步骤会生成两个文件truststore,keystore,将这两个文件拷贝到jdbc
可以访问的路径下
3) 按照如下样例编写代码
String url = "jdbc:gbase://192.168.8.27:5258/gbase?user=root&useSSL=true&requireSSL=true";
String trustStorePath = "D:\\JDBCTest\\src\\test-certs\\truststore";



String keyStorePath = "D:\\JDBCTest\\src\\test-certs\\keystore";



System.setProperty("javax.net.ssl.keyStore", keyStorePath);



System.setProperty("javax.net.ssl.keyStorePassword", "password1");



System.setProperty("javax.net.ssl.trustStore", trustStorePath);



System.setProperty("javax.net.ssl.trustStorePassword", "password1");

GBase 8a 程序员手册JDBC 篇


- 176 -

南大通用数据技术股份有限公司



Connection conn = DriverManager.getConnection(url);



Statement st = conn.createStatement();



ResultSet rs = st.executeQuery("show status like '%SSL%'");



while(rs.next()){




System.out.println(rs.getString(1)+"-----"+rs.getString(2));



}
以上就是使用jdbc ssl功能步骤,注意黄色背景设置