南大通用GBase 8a数据库命令设置结束符,分隔符的方法

在GBase 8a数据库里,默认采用分号作为语句的结束符,以及多个语句间的分割符,本文介绍其使用和修改方法。

修改方法

delimiter <NEWSIGN>

比如,当前分割符是逗号,要改成两个左斜杠 //。修改后,SQL语句将会把下一个分隔符之前的所有内容,作为一个SQL进行解析。

gbase> select now();
+---------------------+
| now()               |
+---------------------+
| 2021-03-09 09:49:17 |
+---------------------+
1 row in set (Elapsed: 00:00:00.00)

gbase> delimiter //
gbase> select now();
    -> //
+---------------------+
| now()               |
+---------------------+
| 2021-03-09 09:49:28 |
+---------------------+
1 row in set (Elapsed: 00:00:00.01)

gbase> delimiter ;
gbase> select now();//
+---------------------+
| now()               |
+---------------------+
| 2021-03-09 09:49:42 |
+---------------------+
1 row in set (Elapsed: 00:00:00.00)

    -> ;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your GBase server version for the right syntax to use near '//' at line 1
gbase>

样例

单个SQL

在命令行交互模式,必须输入结束符或分隔符,才会执行SQL,在开发接口,比如JDBC,ODBC里,执行单个SQL是必须要输入的。

命令行交互模式

如果采用交互模式,比如命令行客户端,则必须输入结束符,才会发送到服务器端执行,比如

gbase> select
    -> now()
    -> from
    -> dual
    ->
    ->
    ->
    -> ;
+---------------------+
| now()               |
+---------------------+
| 2021-03-09 09:41:12 |
+---------------------+
1 row in set (Elapsed: 00:00:00.34)

如果不输入结束符,则会一直等待输入。

批量模式或开发接口

比如在命令将使用-e执行,则不需要输入分隔符。当然加上分隔符也不会报错。

[gbase@gbase_rh7_001 ~]$ gccli -e"select now() from dual"
+---------------------+
| now()               |
+---------------------+
| 2021-03-09 09:44:17 |
+---------------------+
[gbase@gbase_rh7_001 ~]$ gccli -e"select now() from dual;"
+---------------------+
| now()               |
+---------------------+
| 2021-03-09 09:44:21 |
+---------------------+
[gbase@gbase_rh7_001 ~]$

多个独立SQL

多个独立的SQL各自执行,则必须要在SQL中间加上分隔符。比如

[gbase@gbase_rh7_001 ~]$ gccli -e"select now() from dual;select 1234;"
+---------------------+
| now()               |
+---------------------+
| 2021-03-09 09:46:02 |
+---------------------+
+------+
| 1234 |
+------+
| 1234 |
+------+
[gbase@gbase_rh7_001 ~]$

如上2个SQL各自执行,分别输出结果,没有任何关联。

关联SQL(自定义函数和存储过程)

此时需要一个新的分隔符,来表示2个分隔符之间的SQL,是一个整体。

delimiter //
XXXXXX;
XXXXXXXXX
XXXXXXXXXXXXXXX
XXXX //

一个存储过程的样例请参考 GBase 8a集群存储过程样例,动态存储过程