返回首页

gbase数据、南大通用产品文档:GBase8a语法格式

更新日期:2024年09月11日

语法
./orato8a parameter_1 parameter_2 …… parameter_n
说明

parameter_1:orato8a 的参数,一个orato8a 后可以使用多个参数,参数可以使用全称
格式,也可以使用简称格式;

全称格式:--parameter_1=参数值,“=”两边不能有空格;

简称格式:-parameter_1 参数值,简写格式时,参数和参数值之间不能有空格;

执行orato8a 的用户,必须是可以访问oracle 数据库的用户。
示例

GBase 8a MPP Cluster 产品手册
4 管理员指南
文档版本953(2022-09-15)
南大通用数据技术股份有限公司
528
orato8a 工具如何从oracle 中抽取数据,在本示例中,首先登录oracle,然后写一条
查询SQL,该SQL 在库中查询表lineorder 中的10 条数据;退出oracle,使用orat
o8a 工具抽取查询SQL 的结果数据,以验证orato8a 抽取数据的功能,具体如下:
$ sqlplus /nolog
SQL*Plus: Release 11.2.0.1.0 Production on Thu Sep 26 16:37:41 2013
Copyright (c) 1982, 2009, Oracle.
All rights reserved.
SQL> conn ct1/ct1@//192.168.103.79/orcl
Connected.
SQL> CREATE TABLE lineorder_test (
2
lo_orderkey
number(18),
3
lo_linenumber
number(18)
4
);
Table created.
SQL> INSERT INTO lineorder_test (lo_orderkey,lo_linenumber) VALUES(1,1);
1 row created.
SQL> INSERT INTO lineorder_test (lo_orderkey,lo_linenumber) VALUES(1,2);
1 row created.
SQL> INSERT INTO lineorder_test (lo_orderkey,lo_linenumber) VALUES(1,3);
1 row created.
SQL> INSERT INTO lineorder_test (lo_orderkey,lo_linenumber) VALUES(2,1);
1 row created.
SQL> INSERT INTO lineorder_test (lo_orderkey,lo_linenumber) VALUES(2,2);
1 row created.
SQL> INSERT INTO lineorder_test (lo_orderkey,lo_linenumber) VALUES(2,3);
1 row created.

GBase 8a MPP Cluster 产品手册
4 管理员指南
文档版本953(2022-09-15)
南大通用数据技术股份有限公司
529
SQL> INSERT INTO lineorder_test (lo_orderkey,lo_linenumber) VALUES(2,4);
1 row created.
SQL> INSERT INTO lineorder_test (lo_orderkey,lo_linenumber) VALUES(3,1);
1 row created.
SQL> INSERT INTO lineorder_test (lo_orderkey,lo_linenumber) VALUES(3,2);
1 row created.
SQL> INSERT INTO lineorder_test (lo_orderkey,lo_linenumber) VALUES(3,3);
1 row created.
SQL> COMMIT;
COMMIT complete.
SQL> SELECT LO_ORDERKEY, LO_LINENUMBER FROM lineorder_test;
LO_ORDERKEY LO_LINENUMBER
----------- -------------
1
1
1
2
1
3
2
1
2
2
2
3
2
4
3
1
3
2
3
3
10 rows selected.
然后退出oracle,使用orato8a 抽取上面查询的数据。
$ ./orato8a --user='ct1/ct1ct1@orcl' --query="select LO_ORDERKEY, LO_LINENUMBER
FROM lineorder_test" --file='/opt/orato8a_output/lineorder.txt ' --field=";" --format=3
export columns: 2
export rows: 10
export time: 0 sec
process ok!

GBase 8a MPP Cluster 产品手册
4 管理员指南
文档版本953(2022-09-15)
南大通用数据技术股份有限公司
530
$ cat /opt/orato8a_output/lineorder.txt
1;1
1;2
1;3
2;1
2;2
2;3
2;4
3;1
3;2
3;3
导出的数据文件中的内容与在oracle 系统中查询的结果一致。

把C 或C++文件编译成共享库,分别使用如下命令:
gcc -fPIC -Wall
func.c -shared -o func.so –I
head_file_path
g++ -fPIC -Wall
func.cc -shared -o func.so –I
head_file_path
说明
head_file_path 是func.c 中用到的gbase 头文件存放路径,一般是GBase 安装目录的
include/gbase。


GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1230
使用 ON EXCEPTION 语句指定操作,这些操作是在语句块的执行期间对任何错
误或对一个或多个指定错误的列表采取的。
语法

元素
描述
限制
语法
error_data_var
SPL 变量,用于接收由
SQL 错误或由用户定义
的异常返回的字符串
必须是字符类型以接收
错误消息。必须在当前
的语句块中有效。
标识

error_number
SQL 错误号或由将被捕
获的 RAISE EXCEPTION
语句定义的号码
必须是整数类型。在当
前的语句块中必须有
效。
精确
数值
ISAM_error_var
SPL 变量,接收出现的
异常的 ISAM 错误号
同 error_number
标识

SQL_error_var
SPL 变量,接收出现的
异常的 SQL 错误号
同 ISAM_error_var
标识

用法
ON EXCEPTION 语句与 RAISE EXCEPTION 语句一起提供 SPL 的错误俘获和
错误恢复机制。ON EXCEPTION 可以在 SPL 例程执行时指定您想要捕获的错
误,并指定当前语句块中发生错误时要采取的操作。ON EXCEPTION 语句可以指
定 IN 子句中的错误号列表,或可以不包括 IN 子句。如果省略 IN 子句,则俘
获所有错误。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1231
语句块可以包括多个 ON EXCEPTION 语句。被俘获的异常可以是系统定义的也
可以是用户定义的。
ON EXCEPTION 语句的作用域是包含它的语句块,以及嵌套在语句块中的其它语
句块,除非其中之一嵌套的语句块提供了覆盖外部语句的 ON EXCEPTION 语
句。
当设陷阱捕捉到异常时,会清除错误状态。
如果您指定某个变量来接收 ISAM 错误,但不存在跟随的 ISAM 错误,则将零
(0)指定给该变量。如果指定某个变量来接收错误文本,但不存在错误文本,则
该变量存储空字符串。
触发器操作中不支持 ON EXCEPTION
当从以下调用上下文中的 SPL 例程发出时,ON EXCEPTION 语句无效:

在触发例程中

在表的触发器的 Action 子句或 Correlated Action 子句中

在视图上的 INSTEAD OF 触发器的 Action 子句中。
当 UDR 在这些上下文中包含 ON EXCEPTION ,数据库服务器忽略 ON EXCEPTION
语句。
ON EXCEPTION 语句的放置
ON EXCEPTION 语句是一个声明性语句,不是可执行语句。出于此原因,ON
EXCEPTION 必须在任何可执行语句之前并且在 SPL 中必须跟随任何 DEFINE
语句。
因为 SPL 例程的主体是语句块,所以 ON EXCEPTION 语句进程在例程的开头
出现,并应用于例程的整个代码中。
语句示例显示了 ON EXCEPTION 语句的正确放置,以致于 FOREACH 语句在发生错
误可以继续处理行。过程 X( ) 从表 A 读取客户编号,并将其插入到表 B。因为
INSERT 语句在 ON EXCEPTION 语句的作用域内,所以 INSERT 操作期间的错误会
导致执行控制转移到 FOREACH 游标的下一行,而不用终止此 FOREACH 循环。
CREATE PROCEDURE X()
DEFINE v_cust_num CHAR(20);

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1232
FOREACH cs_insert FOR SELECT cust_num INTO v_cust_num FROM A
BEGIN
ON EXCEPTION
END EXCEPTION WITH RESUME;
INSERT INTO B(cust_num) VALUES(v_cust_num);
END
END FOREACH
END PROCEDURE
下一示例中,函数 add_salesperson( ) 向表中插入一组值。如果表不存在,则
先创建该表再插入值。该函数还返回表中的总行数:
CREATE FUNCTION add_salesperson(last CHAR(15), first CHAR(15))
RETURNING INT;
DEFINE x INT;
N EXCEPTION IN (-206) -- If no table was found, create one
CREATE TABLE emp_list
(lname CHAR(15),fname CHAR(15), tele CHAR(12));
INSERT INTO emp_list VALUES -- and insert values
(last, first, '800-555-1234');
END EXCEPTION WITH RESUME;
INSERT INTO emp_list VALUES (last, first, '800-555-1234');
SELECT count(*) INTO x FROM emp_list;
RETURN x;
END FUNCTION;
当出现错误时,数据库服务器搜索捕获错误代码的最后一个 ON EXCEPTION 语
句。如果数据库服务器找不到相关 ON EXCEPTION 语句,则错误代码传回调用
上下文(SPL 例程、应用程序或交互用户),执行终止。
在前面的示例中,在指定错误 -206 的 IN 子句中需要减号(-),大多数错误代
码都是负整数。
下一示例使用了两个具有相同错误号的 ON EXCEPTION 语句,因而可以在两个嵌
套级别中捕获错误代码 691 。除了标有 { 6 } 的 DELETE 语句,所有其它
DELETE 语句都在第一个 ON EXCEPTION 语句的作用域中。标有 { 1 } 和 { 2 }
的 DELETE 语句都在内部 ON EXCEPTION 语句的作用域中:
CREATE PROCEDURE delete_cust (cnum INT)
ON EXCEPTION IN (-691) -- children exist

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1233
BEGIN -- Begin-end so no other DELETEs get caught in here.
ON EXCEPTION IN (-691)
DELETE FROM another_child WHERE num = cnum; { 1 }
DELETE FROM orders WHERE customer_num = cnum; { 2 }
END EXCEPTION -- for error -691
DELETE FROM orders WHERE customer_num = cnum; { 3 }
END
DELETE FROM cust_calls WHERE customer_num = cnum; { 4 }
DELETE FROM customer WHERE customer_num = cnum; { 5 }
END EXCEPTION
DELETE FROM customer WHERE customer_num = cnum; { 6 }
END PROCEDURE
使用 IN 子句捕获特定的异常
如果 SQL 错误代码或 ISAM 错误代码与错误号列表中的异常代码相匹配,则会
俘获错误。在错误列表中的搜索重左边开始,并在搜索到第一个匹配时停止。可
以使用没有 IN 子句的 ON EXCEPTION 语句和具有 IN 子句的一个或多个 ON
EXCEPTION 语句的组合。当出现错误时,数据库服务器搜索捕获特殊错误代码
的 ON EXCEPTION 语句的最后一个声明。
CREATE PROCEDURE ex_test()
DEFINE error_num INT;
...
ON EXCEPTION SET error_num
-- action C
END EXCEPTION
ON EXCEPTION IN (-300)
-- action B
END EXCEPTION
ON EXCEPTION IN (-210, -211, -212) SET error_num
-- action A
END EXCEPTION
在上一示例中的语句序列总结为:
1. 测试是否有错误。
2. 如果出现错误 -210 、-211 或 -212 ,则采取操作 A。
3. 如果出现错误 -300 ,则采取操作 B。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1234
4. 如果出现任何其它错误,则采取操作 C。
接收 SET 子句中的错误信息
如果使用 SET 子句,但出现异常时,SQL 错误代码和(可选地)ISAM 错误代
码被插入到在 SET 子句中指定的变量中,如果提供 error_data_var,则数据库服
务器返回的任何错误文本被放入到 error_data_var。错误文本包括类似损坏的表或
列名称的信息。
强制例程继续
ON EXCEPTION 语句的放置中的第一个示例包括 WITH RESUME 关键字,用于
指定如果 ON EXCEPTION 语句捕获错误,则 FOREACH 循环的执行在
cs_insert 游标的发出错误的行的下一行继续。如果活动集的最后一行发出了错
误,则该过程退出。在 X 过程执行完毕后,表 B 会包含表 A 中每个客户编号
的副本,在 INSERT 期间不会发生错误。
ON EXCEPTION 语句的放置中的第二个示例使用 WITH RESUME 关键字表示在
ON EXCEPTION 语句中的语句块执行后,在 SELECT COUNT(*) FROM
emp_list 语句继续执行,该语句是跟随在出现错误的行之后的行。对于此函
数,其结果是即使出现错误也计数销售人员姓名。
在出现异常后继续执行
如果省略 WITH RESUME 关键字,则在出现异常后执行的下一个语句取决于
ON EXCEPTION 语句的位置,如以下应用场合所描述的:

如果 ON EXCEPTION 语句在具有 BEGIN 和 END 关键字的语句块
中,则在对该 BEGIN ... END 块后的第一个语句(如果有)恢复执行,
即,在 ON EXCEPTION 语句的作用域后恢复。

如果 ON EXCEPTION 语句在循环(FOR 、WHILE 、FOREACH)内
部,则跳过循环的其余部分,并在循环的下一迭代时恢复执行。

如果没有语句块,而仅有 SPL 例程包含 ON EXCEPTION 语句,那么该
例程执行不带参数的 RETURN 语句,返回成功状态而不返回值。
如果在语句块执行期间出现错误,要防止无限循环,则搜索另一个 ON
EXCEPTION 语句以俘获错误不包括搜索当前的 ON EXCEPTION 语句。
相关语句

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1235
RAISE EXCEPTION