一直以来,SQL*Plus 都是 Oracle 数据库的标准命令行工具。不过,现在 Oracle 推出了一个新的命令行接口接口工具:Oracle SQL Developer Command Line(SQLcl)。
SQLcl 是一个基于 Java 的免费工具,定位是 SQLPlus 的继承者。SQLcl 支持交互式或者批量执行 SQL和 PL/SQL,提供了行内编辑、语句补全、命令历史等丰富的功能,同时可以调用 SQLPlus 脚本。
主要特性
- 内置编辑器,在 SQLcl 提示符下交互式编辑多行语句和脚本。
- 命令历史,支持循环存储 100 个历史命令/脚本。
- 命令补全,使用 TAB 键自动补全对象名称或关键字。
- 新增命令,增加了 SQL*Plus 中不支持的 CTAS、DLL、Repeat、ALIAS、SCRIPT、FORMAT 等许多新的命令。
- 客户端脚本,通过 javascript 操作查询结果、创建动态命令、执行会话交互等等。
- SQL*Plus 支持,支持 SQL*Plus 环境设置、命令以及功能。
安装 SQLcl
SQLcl 基于 Java,只需要有 JRE,不需要安装 Oracle 客户端。我们可以登录 Oracle OTN 直接下载 SQLcl 工具。下载完成后解压即可,bin 目录中包含了 Windows 下的可执行文件 sql.exe 和 Unix/Linux 下的命令工具 sql。
连接数据库
SQLcl 连接数据库的方式与 SQL*Plus 类似,支持 EZConnect、TNS、LDAP、TWO_TASK 等,注意提前配置好 Java 环境。以下是 Windows 环境下使用 EZConnect 连接数据库的示例:
C:\Users\tony>java -version
java version "1.8.0_211"
Java(TM) SE Runtime Environment (build 1.8.0_211-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.211-b12, mixed mode)
C:\Users\tony>D:\Applications\sqlcl\bin\sql.exe tony/[email protected]:1521/orcl
SQLcl: 发行版 19.1 Production, 发行日期 星期二 六月 11 10:41:41 2019
版权所有 (c) 1982, 2019, Oracle。保留所有权利。
Last Successful login time: 星期二 6月 11 2019 10:41:42 +08:00
已连接到:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
SQL> SELECT user FROM dual;
USER
--------------------------------------------------------------------------------
TONY
使用介绍
SQLcl 的使用与 SQL*Plus 非常类似,但是增加了许多新的功能,接下来我们简单介绍其中几个主要的特性。
查看帮助
登录之后,使用HELP
命令或者?
查看 SQLcl 提供的命令帮助。
其中高亮的部分是 SQLcl 新增加的命令。然后查看某个具体的命令,例如CTAS
:
SQL> help ctas;
CTAS
ctas table new_table
使用 DBMS_METADATA 可以提取现有表的 DDL,
然后修改为 create table as select * from
该命令基于已有的表,创建一个生成新表的 DDL 语句,但不执行该语句。
内置编辑器
对于 SQL*Plus 而言,编辑文件或者 SQL 缓存区时需要调用外部的编辑器。SQLcl 为此提供了内置的编辑器,使用DEFINE _EDITOR
进行设置:
SQL> define _EDITOR;
DEFINE _EDITOR = "notepad" (CHAR)
SQL> define _EDITOR="inline";
SQL> define _EDITOR;
DEFINE _EDITOR = "inline" (CHAR)
内置编辑器支持以下快捷方式:
- Ctrl+R - 运行当前缓冲区中的语句
- Ctrl+W - 光标移动到缓冲区顶部
- Ctrl+S - 光标移动到缓冲区底部
- Ctrl+A - 光标移动到行首
- Ctrl+E - 光标移动到行尾
正在编辑的当前行会显示一个星号(*),同时也可以使用箭头控制光标的移动,使用删除键和回退键删除内容。
命令历史
使用 SQL*Plus 时,无法访问已经执行过的历史命令,除非安装 rlwrap。SQLcl 解决了这个问题,查看一下HISTORY
命令的帮助:
SQL> help history;
HISTORY
---------
history [<index> | FULL | USAGE | SCRIPT | TIME | CLEAR (SESSION)?]
SQL>history full
1 select 1 from dual;
2 select 2
> from dual;
3 select 3 from dual
> where 1=1;
SQL>history usage
1 (2) select 1 from dual;
2 (11) select 2 from dual;
3 (2) select 3 from dual where 1=1;
SQL>history script
select 1 from dual;
select 2 from dual;
select 3 from dual where 1=1;
SQL>history 3
1 select 3 from dual
2* where 1=1;
SQL>his time
1 clear
2 cl bre
3 (00.201) select 1 from dual
命令帮助给出了参数和示例。列出某个历史命令后,输入斜线(/)即可运行该命令。该功能具有以下特点:
- 使用向上和向下箭头依次查看历史命令。
- 使用
HISTORY
命令显示命令历史。 - 默认保存最近 100 个历史语句。
- 使用
SET HISTORY LIMIT N
修改默认保存的历史命令数量限制。 - 命令历史支持跨 SQLcl 会话保存。
- 默认情况下,
SHOW
、HISTORY
、CONNECT
和SET
命令不会保存到历史中。 SET HISTORY BLACKLIST
命令可以用于设置不想要保存的命令黑名单。
命令补全
SQLcl 支持使用 Tab 键补全输入的功能,可以补全对象名称和命令,提高输入的速度。
格式化输出
SQL*Plus 的默认输出格式通常显得比较混乱,需要通过一系列的设置命令才能显得比较人性化。SQLcl 预置了多种常用的输出格式,包括 CSV、JSON、XML 等。
SQL> help set sqlformat;
SET SQLFORMAT
SET SQLFORMAT { csv,html,xml,json,ansiconsole,insert,loader,fixed,default}
以下分别是默认格式和 CSV 格式的输出示例:
SQL> SELECT *
2 FROM
3 EMPLOYEES
4* WHERE rownum <= 2;
EMPLOYEE_ID FIRST_NAME LAST_NAME
----------- -------------------- -------------------------
EMAIL PHONE_NUMBER HIRE_DATE JOB_ID SALARY
------------------------- -------------------- --------- ---------- ----------
COMMISSION_PCT MANAGER_ID DEPARTMENT_ID
-------------- ---------- -------------
207 Tony Dong
TonyDong 515.123.8000 15-1月 -10 IT_PROG 8800
102 60
100 Steven King
SKING 515.123.4567 17-6月 -03 AD_PRES 24000
90
SQL> set sqlformat csv;
SQL> SELECT *
2 FROM
3 EMPLOYEES
4* WHERE rownum <= 2;
"EMPLOYEE_ID","FIRST_NAME","LAST_NAME","EMAIL","PHONE_NUMBER","HIRE_DATE","JOB_ID","SALARY","COMMISSION_PCT","MANAGER_ID","DEPARTMENT_ID"
207,"Tony","Dong","TonyDong","515.123.8000",15-1月-10,"IT_PROG",8800,,,102,60
100,"Steven","King","SKING","515.123.4567",17-6月-03,"AD_PRES",24000,,,90