本文介绍,使用GBase 8s数据库过程中,遇到SQL执行报错,怎么排查问题,常用的几种方法如下:
方法一:如果执行SQL语句失败,会有报错信息,比如:
“-201 A syntax error has occurred.”
“-206 The specified table is not in the database.”
这些问题比较直观,可以直接看出原因,举例:
--示例1,206错误,表t1不存在
> select * from t1;
206: The specified table (t1) is not in the database.
111: ISAM error: no record found.
Error in line 1
Near character position 16
--示例2,201语法错误,错误位置“Near character position 10”,可以发现是“from”写成了“fro”
> select * fro t1;
201: A syntax error has occurred.
Error in line 1
Near character position 10方法二:finderr工具,查询报错信息详情
##语法规则 finderr error_number
##示例1
finderr 201
##示例2
finderr 206
方法三:onmode工具
如果上述方法还不能定位问题,另一个收集信息的方法:onmode -I(控制诊断信息收集)
使用onmode -I开始和停止诊断信息的收集 |
开启:遇到错误时,执行onmode -I iserrno(iserrno:要收集诊断信息的错误编号)选项启动收集收集诊断信息。 |
关闭:执行onmode -I(不需要附加其他参数),即停止诊断信息的收集 |
--示例:创建存储过程成功,调用存储过程时报错,不好定位问题
create database test with log;
set environment sqlmode 'oracle';
--创建存储过程
create or replace procedure pro1 as
sqlstr varchar(100);
begin
sqlstr := 'create create table t1(id int)';
execute immediate sqlstr;
end;
/
--调用
call pro1();
如上图所示,procedure创建成功了,但是调用时报错,此时用前两种方法不能定位问题。
这里用方法三解决问题:执行onmode -I 201,201为上图报错语句的错误号,并再次调用pro1。

执行完上述操作,进到数据库实例安装路径下的tmp目录中,cd $GBASEDBTDIR/tmp,会看到af前缀文件。

查看af文件,可以搜索onstat -g sql,会看到当时错误的语句以及“Last parsed SQL statement”。
由此定位到问题语句“create create table t1(id int)”

找到上述SQL,可以单独执行这句,发现又是语法错误,出现两次“create”关键字。

问题解决。
本文只是提供一些思路,解决问题的方法很多,不仅限于此。




