还在用 SQL*Plus 访问 Oracle?试试更强大的 SQLcl

作者: 不剪发的Tony老师
毕业于北京航空航天大学,十多年数据库管理与开发经验,目前在一家全球性的金融公司从事数据库架构设计。CSDN学院签约讲师以及GitChat专栏作者。csdn上的博客收藏于以下地址:https://tonydong.blog.csdn.net


文章目录

        主要特性
        安装 SQLcl
        连接数据库
        使用介绍
            查看帮助
            内置编辑器
            命令历史
            命令补全
            格式化输出
        相关链接

SQLcl
一直以来,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/tony@192.168.56.104: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

 

相关链接

    官方网址
    参考手册
    FAQ