一、背景
目前仍然很多客户的运维机使用windows操作系统,开发人员也是在windows环境上进行编码测试,甚至还有一些客户管理比较严格,禁止开发人员登录服务器进行操作。在MogDB 5.2.0版本之前,没有提供windows平台的gsql,因此在windows上执行一些批处理SQL脚本会很不方便;并且由于原本客户基于oracle的sqlplus/sqlldr开发了大量的批处理脚本,如果要改成gsql支持的语法,又存在比较大的工作量。
为了让之前客户的windows批处理脚本能无缝对接到MogDB,所以MogDB做了对sqlplus/sqlldr的语法兼容处理(注:MogDB 5.2.0版本对sqlplus的支持仅限windows版本)
二、兼容sqlplus语法
1.连接
- 支持连接串为
username/password@host:port:sid
的形式 - 支持
as sysdba
(实际是忽略) - 支持
nolog
方式启动客户端 - 支持在客户端中输入
conn
+连接串的方式连接到指定数据库 - 支持
quit
断开连接(带不带;
均可)
示例:
C:\>gsql system/oracle@192.168.163.134:26200/testdb
Warning: The client and server have different version numbers.
gsql (5.0.0.3)
Non-SSL connection (SSL connection is recommended when requiring high-security)
Type "help" for help.
testdb=> quit
C:\>
C:\>gsql sys/oracle@192.168.163.134:26200/testdb as sysdba
gsql: warning: extra command-line argument "as" ignored
gsql: warning: extra command-line argument "sysdba" ignored
Warning: The client and server have different version numbers.
gsql (5.0.0.3)
Non-SSL connection (SSL connection is recommended when requiring high-security)
Type "help" for help.
testdb=> quit;
C:\>
C:\>gsql /nolog
Type "help" for help.
!> conn system/oracle@192.168.163.134:26200/testdb
Non-SSL connection (SSL connection is recommended when requiring high-security)
You are now connected to database "testdb" as user "system" on host "192.168.163.134" at port "26200".
testdb=> select version();
version
------------------------------------------------------------------------------------------------------------------------------------------------------
(MogDB 5.2.0 build e0c9adc2) compiled at 2024-09-28 02:48:39 commit 0 last mr 1804 on x86_64-unknown-linux-gnu, compiled by g++ (GCC) 7.3.0, 64-bit
(1 row)
testdb=>
2.执行脚本
- 支持在连接串后面
@
sql文件的语法, - 支持将命令中的参数传入到sql中 (需配置环境变量
PGGLOBALVARREP=true
) - 支持在sql文件里通过start命令方式调用另一个sql文件的语法,可以带文件名后缀也可以不带
- 支持将标准错误也定向到标准输出(需配置环境变量
PGERRTOOUTPUT=true
) - 支持通过
execute
命令来执行procedure - 兼容ORACLE注释风格(需配置环境变量
PGCOMMENT=oracle
,并且配合MogDB 5.2版本GUC参数enable_oracle_comment
) - 单独输入
/
不返回报错(sqlplus中一般单独输入/
是重复执行上一条命令,但create type xx is table of yy
语法也是以斜杠结束,而MogDB是;
结束,再加/
会报错,考虑到两者的兼容性,MogDB改成了单独输入/
时,忽略这个字符)
- 支持spool语法
- set trimspool on
- set line 600
- set echo off;
- set heading off;
- set feedback off;
- spool sqltext.sql
- select xxx from xxx;
- spool off
示例:
C:\test>gsql system/oracle@192.168.163.134:26200/testdb @test_spool.sql 2
Warning: The client and server have different version numbers.
ANONYMOUS BLOCK EXECUTE
CREATE TABLE
CREATE PROCEDURE
CREATE TYPE
test_pro1
-----------
(1 row)
Target width is 600.
total time: 84 ms
C:\test>type test_spool.sql
start test_procedure
set trimspool on
set line 600
set heading off
set feedback off
set echo off
spool out1.txt
select name from test_t10 where id=&1;
spool off
quit
C:\test>type test_procedure.sql
declare
/*2024-10-18
/*comment*/
l_cnt number;
begin
select count(1) into l_cnt from user_tables where table_name=upper('test_t10');
if l_cnt>0 then
/*if exist , drop*/
execute immediate 'drop table test_t10';
end if;
end;
/
create table test_t10 (id number,name varchar2(20));
create or replace procedure test_pro1 is
begin
insert into test_t10 values (1,'Tom');
insert into test_t10 values (2,'Jerry');
end;
/
create or replace type tyt_varchar2 is table of varchar2(4000);
/
execute test_pro1;
C:\test>type out1.txt
Jerry
C:\test>
三、兼容sqlldr语法
- 支持命令行参数
userid
、control
、rows
、skip
- 支持控制文件参数
- LOAD DATA
- INFILE
- APPEND
- TRUNCATE
- INTO TABLE
- FIELDS TERMINATED BY
- OPTIONALLY ENCLOSED BY
- TRAILING NULLCOLS
- BEGINDATA
- 支持生成日志文件(
*.log
) - 支持生成错误数据文件(
*.bad
) - 支持数据本身在控制文件中 (BEGINDATA)
- 支持设置多字符分隔符
- 支持指定导入字段
- 支持设置字符串包裹符
示例:
C:\test>gs_loader userid=system/oracle@192.168.163.134:26200/postgres control=Country.ctl rows=1000 skip=1
gs_loader: version 0.1
478 Rows successfully loaded.
log file is:
Country.log
C:\test>type Country.ctl
LOAD DATA
INFILE 'Country.csv'
APPEND
INTO TABLE t_data
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
TRAILING NULLCOLS
(col1,col2,col3,col4)
C:\test>type Country.log
gs_loader: version 0.1
Control File: Country.ctl
There are no data files from args.
Table t_enummetadata
478 Rows successfully loaded.
0 Rows not loaded due to data errors.
0 Rows not loaded because all WHEN clauses were failed.
0 Rows not loaded because all fields were null.
Total logical records skipped: 1
Run began on 2024/10/18 14:59:12
Run ended on 2024/10/18 14:59:12
Elapsed time was: 0 s
C:\test>
四、和ORACLE执行的效果对比
五、总结
本文所列出的功能,在windows上的sqlplus和gsql、sqlldr和gs_loader的最终执行效果几乎完全一致。甚至如果本地没有sqlplus/sqlldr,把gsql.exe/gs_loader.exe改成sqlplus.exe/sqlldr.exe,批处理的脚本几乎不用改,可以把MogDB当成ORACLE去执行这些脚本。
当然,其实也可以看到,有一些运维常用命令在这个版本中的gsql并没有支持,比如 exit
退出客户端,conn
的完整指令 connect
,execute
的缩写 exec
。实现这些并不麻烦,只要选择了使用MogDB,后续都可能实现。
MogDB通过"像素级模仿",兼容了sqlplus/sqlldr的这部分典型用法,对于部分依赖于sqlplus/sqlldr的客户实现了windows端运维的无损切换。
无论是底层原理,还是这种周边工具的使用细节,MogDB致力打造一个让原有ORACLE用户能真正意义上无缝切换的国产数据库。
- 本文作者: DarkAthena
- 本文链接: https://www.darkathena.top/archives/mogdb-5.2.0-support-sqlplus-sqlldr-usage
- 版权声明: 本博客所有文章除特别声明外,均采用CC BY-NC-SA 3.0 许可协议。转载请注明出处