作者:杨涛涛
资深数据库专家,专研 MySQL 十余年。擅长 MySQL、PostgreSQL、MongoDB 等开源数据库相关的备份恢复、SQL 调优、监控运维、高可用架构设计等。目前任职于爱可生,为各大运营商及银行金融企业提供 MySQL 相关技术支持、MySQL 相关课程培训等工作。
本文来源:原创投稿
今天遇到一个 OceanBase 数据库下 Oracle 租户的 PLSQL 分隔符问题,特来分享下。
我在 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>
竟然顺利执行成功了。
<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)
那正确的写法应该是改变默认分隔符为//: 改分隔符后的函数创建成功。
<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)