返回首页

gbase数据、南大通用产品文档:GBase8sSELECT 语句中的 SPL 例程

更新日期:2024年09月11日

本章前面的示例显示由列名、运算符和 SQL 函数组成的 SELECT 语句表达式。本章提供
了包含 SPL 例程调用的表达式。
SPL 例程包含特定的存储过程语言
(SPL)
语句和 SQL 语句。
有关 SPL 例程的更多信息,
请参阅创建和使用 SPL 例程。
GBase 8s 允许用 C 和 Java™ 编写外部例程。有关更多信息,请参阅《GBase 8s 用户定义
的例程和数据类型开发者指南》 。
当您在投影列表中包含 SPL 例程表达式时,该 SPL 例程必须是返回单个值(一行一列)
的例程。例如:仅当 test_func() 返回单个值时,以下语句才有效:
SELECT col_a, test_func(col_b) FROM tab1
WHERE col_c = "Davis";
当您在 SELECT 语句的 Projection 子句中包含 SPL 例程表达式时,该 SPL 例程必须是
返回单个值(一行一列)的例程。例如:仅当 test_func() 返回单个值时,数据库服务器返
回一个错误消息。returns more than one value, the database server returns an error message.
SPL 例程通过允许您对选择的每行执行子查询来扩展可用函数的范围。
例如,假设您现有客户号、客户的姓和客户已下订单数的列表。下列查询查询了检索此信
息的一种方法。customer 表具有 customer_num 和lname 列,但没有每个客户已下订单数的
记录。可以编写 get_orders 例程,该例程查询每个 customer_num 的 orders 表并返回相应订
单的数目(标记为 n_orders)。
图: 查询

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司 - 110 -

SELECT customer_num, lname, get_orders(customer_num) n_orders
FROM customer;
该结果显示了此 SPL 例程的输出。
图: 查询结果
customer_num lname n_orders

101 Pauli 1
102 Sadler 9
103 Currie 9
104 Higgins 4

123 Hanlon 1
124 Putnum 1
125 Henry 0
126 Neelie 1
127 Satifer 1
128 Lessor 0
使用 SPL 例程来封装查询中经常执行的操作。例如:以下查询中的条件包括例
程 conv_price,该例程将库存商品的单击转换为不同的货币并添加任何进口关税。
图: 查询
SELECT stock_num, manu_code, description FROM stock
WHERE conv_price(unit_price, ex_rate = 1.50,
tariff = 50.00) < 1000;

功能描述
SAVEPOINT 用于在当前事务里建立一个新的保存点。
保存点是事务中的一个特殊记号,
它允许将那些在它建立后执行的命令全部回滚,
把事
务的状态恢复到保存点所在的时刻。
注意事项
使用ROLLBACK TO SAVEPOINT 回滚到一个保存点。
使用RELEASE SAVEPOINT 删
除一个保存点,但是保留该保存点建立后执行的命令的效果。
保存点只能在一个事务块里面建立。在一个事务里面可以定义多个保存点。
由于节点故障或者通信故障引起的节点线程或进程退出导致的报错,以及由于COPY
FROM 操作中源数据与目标表的表结构不一致导致的报错,均不能正常回滚到保存点之前,
而是整个事务回滚。

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
1226
SQL 标准要求,使用savepoint 建立一个同名保存点时,需要自动删除前面那个同名保
存点。在GBase 8c 数据库里,我们将保留旧的保存点,但是在回滚或者释放的时候,只使
用最近的那个。释放了新的保存点将导致旧的再次成为ROLLBACK TO SAVEPOINT 和
RELEASE SAVEPOINT 可以访问的保存点。除此之外,SAVEPOINT 是完全符合SQL 标准
的。
语法格式
SAVEPOINT savepoint_name;
参数说明

savepoint_name
新建保存点的名称。
示例
--创建一个新表。
gbase=#CREATE TABLE table1(a int);
--开启事务。
gbase=#START TRANSACTION;
--插入数据。
gbase=#INSERT INTO table1 VALUES (1);
--建立保存点。
gbase=#SAVEPOINT my_savepoint;
--插入数据。
gbase=#INSERT INTO table1 VALUES (2);
--回滚保存点。
gbase=#ROLLBACK TO SAVEPOINT my_savepoint;
--插入数据。
gbase=#INSERT INTO table1 VALUES (3);
--提交事务。

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
1227
gbase=#COMMIT;
--查询表的内容,会同时看到1 和3,不能看到2,因为2 被回滚。
gbase=#SELECT * FROM table1;
--删除表。
gbase=#DROP TABLE table1;
--创建一个新表。
gbase=#CREATE TABLE table2(a int);
--开启事务。
gbase=#START TRANSACTION;
--插入数据。
gbase=#INSERT INTO table2 VALUES (3);
--建立保存点。
gbase=#SAVEPOINT my_savepoint;
--插入数据。
gbase=#INSERT INTO table2 VALUES (4);
--回滚保存点。
gbase=#RELEASE SAVEPOINT my_savepoint;
--提交事务。
gbase=#COMMIT;
--查询表的内容,会同时看到3 和4。
gbase=#SELECT * FROM table2;
--删除表。
gbase=#DROP TABLE table2;
相关命令
RELEASE SAVEPOINT,ROLLBACK TO SAVEPOINT

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

对于GBase JDBC ,JDBC URL 的格式如下,方括号([, ])里的项是可选的:
jdbc:gbase://[host][,failoverhost...][:port]/[database][?propertyName1][=propertyValue1][&propertyNa
me2][=propertyValue2]...
如果没有指定主机名,
那么缺省值为
“localhost”

如果没有指定端口,
缺省为
“5258”


GBase UP 产品手册 6 应用开发指南
文档版本04(2021-04-21) 南大通用数据技术股份有限公司 1003
这也是GBase 服务器的缺省端口号。
jdbc:gbase://[host:port],[host:port].../[database][?propertyName1][=propertyValue1][&propertyName2]
[=propertyValue2]...
如果没有指定数据库,这个连接将没有'当前'数据库。这种情况下,用户需要在连
接实例上调用setCatalog()方法,或者在SQL 中使用数据库名完整指定表名(即
'SELECT dbname.tablename.colname FROM dbname.tablename...')。不指定连接使用
的数据库,
只用在建立的连接需要使用多个库的工具时才有用,
如GUI 数据库管理
器。

示例:
Class.forName("com.gbase.jdbc.Driver");
java.sql.Connection con = DriverManager.getConnection("jdbc:gbase:///", "user", "password");
Statement st = con.createStatement();
ResultSet rs = st.executQuery(select test.testTbale.* from test.testTbale);
或者
Class.forName("com.gbase.jdbc.Driver");
java.sql.Connection con = DriverManager.getConnection("jdbc:gbase:///", "user", "password");
con.setCatalog("test");
Statement st = con.createStatement();
ResultSet rs = st.executQuery(select * from testTbale);
该示例查询了test 数据库中的testTbale 表的全部列数据。
GBase JDBC 支持故障切换。这允许驱动程序切换到“从”主机并继续执行只读的
查询。仅当连接处在autoCommit(true)状态时,才会发生故障切换,因为当一个事
务正在进行时,无法保障可靠的故障切换。大多数应用服务器和连接池会在事务/
连接结束后把autoCommit 置为true。
故障切换功能具有如下行为方式:

如果URL 属性
“autoReconnect”
为false:
故障切换只会发生在连接初始化时,
当驱动程序确定第一个主机再次可用时,将返回。

如果URL 属性“autoReconnect”为true: 当驱动程序确定连接已经失败(在进
行任何查询之前)时会发生故障切换,
当驱动程序确定第一台主机再次可用
(在
使用queriesBeforeRetryMaster 查询之后)时,将返回第一台主机。

在任何一种情况下,当你连接到经过故障切换的服务器时,会将连接设置为只
读状态,
因此,
对于会更改数据的查询来说,
将抛出异常
(这种查询GBase server
不会处理)。
属性配置定义了GBase JDBC 将会如何连接到一个GBase server 上。除非有其它说
明,否则可以为DataSource 对象和Connection 对象设置属性。
配置属性可以通过下列任意一种方式来设置:

GBase UP 产品手册 6 应用开发指南
文档版本04(2021-04-21) 南大通用数据技术股份有限公司 1004

在java.sql.DataSource 的GBase 实例上使用set*()方法:
com.gbase.jdbc.jdbc2.optional.GBaseDataSource
com.gbase.jdbc.jdbc2.optional.GBaseConnectionPoolDataSource


java.util.Properties
实例中,作为一个键/ 值对传给
DriverManager.getConnection() 或 Driver.connect()

在赋给java.sql.DriverManager.getConnection() 、java.sql.Driver.connect() 或
javax.sql.DataSource's setURL()方法的 GBase 实例的URL 中,作为一个JDBC
URL 变量。
示例:
Class.forName("com.gbase.jdbc.Driver");
GBaseDataSource ds = new GBaseDataSource();
ds.setUrl("jdbc:gbase://localhost:5258/test");
ds.setUser("user");
ds.setPassword("password");
java.sql.Connection con = ds.getConnection();
Statement st = con.createStatement();
ResultSet rs = st.executQuery(select c_custkey from customer);
说明
如果用户用来配置一个JDBC URL 的方法是基于XML 的,
那么用户需要使用XML 特征字
符& 来分开配置参数,“&”是XML 的保留字符。
使用GBase JDBC 驱动创建连接时可以设定的属性如下表格所示:
表 6-3 创建连接时可以设定的属性
名称
定义
默认值
连接/验证
user
连接时使用的用户

password
连接时使用的密码

socketFactory
驱动程序用于创建到服务器的socket 连接的类
名。
这个类必须执行com.gbase.jdbc.SocketFactory
接口且必须有公共无参数的构造函数。
com.gbase.jdbc.
Standard
SocketFactory
connectTimeout
socket 连接的超时(单位毫秒),如果是0 表示
没有超时。在JDK-1.4 或更新版本下才能使用。
默认为0。
0
(通过socket 连接
进行读写操作时这
两个参数才起作
用。如果不设置,
网络突然断开时,
读数据会处在等待

GBase UP 产品手册 6 应用开发指南
文档版本04(2021-04-21) 南大通用数据技术股份有限公司 1005
名称
定义
默认值
状态。)
socketTimeout
网络socket 操作的超时(默认为0,意味着无超
时)
0
useConfigs
在解析URL 或这接受用户指定的属性之前,
加载
使用逗号分割的配置属性。这些配置在参数配置
文档中有解释。
根据配置文件初始
化参数
propertiesTransform


com.gbase.jdbc.ConnectionPropertiesTransform 的
实施实例,在尝试连接前,驱动用来修改传递进
来的URL 属性。
parseURL 方法会建
立该对象修改参数
useCompression
在和服务器通信时是否使用
zlib 压缩
(true/false),默认为false。
false
IsCheckProperty
创建连接前是否验证url 参数的合法性,如果参
数名称不正确,将直接报错退出。
true
vcName
设置虚拟集群名称。如果集群支持虚拟集群,必
须通过该参数指定默认的虚拟集群名称

高可靠性和集群
resourceId
全局独一无二的资源号,用来标识数据源或数据
库连接可以连接到的资源机器。

failoverEnable
8a 集群使用,创建连接时,如果集群当前集群节
点不可用,是否自动路由到下一个可用的节点。
默认为false;
false
hostList
8a 集群使用,当failoverEnable=true 的情况下生
效。记录集群中节点的IP 以逗号分隔。
例:集群三个节点