关于oceanbase:故障分析-OceanBase-一则函数报错问题分享

11次阅读

共计 2349 个字符,预计需要花费 6 分钟才能阅读完成。

作者:杨涛涛

资深数据库专家,专研 MySQL 十余年。善于 MySQL、PostgreSQL、MongoDB 等开源数据库相干的备份复原、SQL 调优、监控运维、高可用架构设计等。目前任职于爱可生,为各大运营商及银行金融企业提供 MySQL 相干技术支持、MySQL 相干课程培训等工作。

本文起源:原创投稿

* 爱可生开源社区出品,原创内容未经受权不得随便应用,转载请分割小编并注明起源。


明天遇到一个 OceanBase 数据库下 Oracle 租户的 PLSQL 分隔符问题,特来分享下。

我的初衷是对 Oracle 租户下的一张表造点随机数据,写好了 INSERT 语句,却提醒没有函数 dbms_random.value。于是查阅 OceanBase 官网文档,发现须要导入零碎包 dbms_random!dbms_random 零碎包寄存在 OceanBase 装置目录下的 admin 子目录里,蕴含两个 SQL 文件,一个是包的申明 SQL:dbms_random.sql;另一个是包的定义 SQL:dbms_random_body.sql。

我在 obclient 下导入这两个 SQL 文件,间接报语法错误。官网给的 SQL 文件怎么可能有语法错误呢?预计是我没有齐全依照文档来标准操作而导致的问题。

最终我把报错的中央提取进去,整顿成如下简略函数:

 create or replace function tt return number is
 v1 number;
 v2 number;
 begin
   v1 := 10;
   v2 := sqrt(-2 * ln(v1)/v1);
   return v2;
 end;
 /

间接执行这个函数,也是报同样的谬误。

<mysql:5.6.25:SYS> create or replace function tt return number is
    ->  v1 number;
    ->  v2 number;
    ->  begin
    ->    v1 := 10;
    ->    v2 := sqrt(-2 * ln(v1)/v1);
ORA-00900: You have an error in your SQL syntax; check the manual that corresponds to your OceanBase version for the right syntax to use near 'sqlrt(2 * ln(v1)' at line 6
ORA-00900: You have an error in your SQL syntax; check the manual that corresponds to your OceanBase version for the right syntax to use near 'v1)' at line 1
<mysql:5.6.25:SYS>   return v2;
ORA-00900: You have an error in your SQL syntax; check the manual that corresponds to your OceanBase version for the right syntax to use near 'return v2' at line 1
<mysql:5.6.25:SYS> end;
ORA-00900: You have an error in your SQL syntax; check the manual that corresponds to your OceanBase version for the right syntax to use near 'end' at line 1
<mysql:5.6.25:SYS> /
    -> ;
ORA-00900: You have an error in your SQL syntax; check the manual that corresponds to your OceanBase version for the right syntax to use near '/' at line 1
<mysql:5.6.25:SYS>

于是我把这个函数在我本地的 Oracle 环境中执行,一切正常:看来是 OceanBase 本身的环境问题。

create or replace function tt return number is
 v1 number;
 v2 number;
 begin
   v1 := 10;
   v2 := sqrt(-2 * ln(v1)/v1);
   return v2;
 end;
  2    3    4    5    6    7    8    9   /

Function created.

Elapsed: 00:00:00.02
YTT@helowin> 

这个函数写的非常简单,求一个给定参数的平方根。刚开始我认为函数写的有问题,于是我把函数改为这样:

v2 := sqrt(-2 * ln(v1));

居然顺利执行胜利了。

<mysql:5.6.25:SYS>  create or replace function tt return number is
    ->  v1 number;
    ->  v2 number;
    ->  begin
    ->    v1 := 10;
    ->    v2 := sqrt(-2 * ln(v1));
    ->    return v2;
    ->  end;
    ->  /
Query OK, 0 rows affected (0.050 sec)

直到最初通过和 Oracle 环境的比照,我才发现是 PLSQL 分隔符的问题。OceanBase 的 Oracle 租户里默认 PLSQL 的分隔符是 /,刚好和除法 / 抵触,这样遇到除法符号就认为是函数定义完结,所以报语法错误。

那正确的写法应该是扭转默认分隔符为 //: 改分隔符后的函数创立胜利。

<mysql:5.6.25:SYS>delimiter //
<mysql:5.6.25:SYS>  create or replace function tt return number is
    ->  v1 number;
    ->  v2 number;
    ->  begin
    ->    v1 := 10;
    ->    v2 := sqrt(-2 * ln(v1)/v1);
    ->    return v2;
    ->  end;
    ->  //
Query OK, 0 rows affected (0.114 sec)

特此分享给应用 OceanBase 的同学。

正文完
 0