0x-3-Oracle 23 ai-sqlcl 25.1 集成安装-配置和优化

是不是受够了安装了oracle database之后sqlplus的简陋,无法删除无法上下翻页的苦恼。

可以安装readline和rlwrap插件的话,配置.bahs_profile后也能解决上下翻页这些,但是很多生产环境无法安装rpm包。

oracle提供了sqlcl免费许可,sqlcl依赖于java,比sqldeveloper小,小巧的同时改善了sqlplus的功能。在完全兼容23ai的同时还支持vector属性。

rpm安装完毕Oracle 23 ai free之后,其实在23ai的路径中默认带了sqlcl 25.1,需要配置JDK变量即可调用sqlcl。

一、23 ai free 默认路径下的 sqlcl中调用

1. 设置环境变量调用sqlcl
bash 复制代码
 [oracle@OL96TC ~]$ cat ~/.bash_profile
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

# User specific environment and startup programs
export ORACLE_HOME=/opt/oracle/product/23ai/dbhomeFree
export ORACLE_SID=FREE
export PATH=$ORACLE_HOME/bin:$PATH
export PATH=$PATH:/opt/oracle/product/23ai/dbhomeFree/sqlcl/bin
export PATH=$PATH:/opt/oracle/product/23ai/dbhomeFree/jdk/bin
export PATH=$PATH:$JAVA_HOME/bin
2. TrueCache辅库上继续使用sqlcl

可以查询主库中新建的表deparments3,

但是由于数据TrueCache,无法查询到表的objects信息

bash 复制代码
[oracle@OL96TC ~]$ sql / as sysdba;
SQLcl: Release 25.1 Production on Sun Jun 08 16:16:18 2025

Copyright (c) 1982, 2025, Oracle.  All rights reserved.

Connected to:
Oracle Database 23ai Free Release 23.0.0.0.0 - Develop, Learn, and Run for Free
Version 23.8.0.25.04

SQL> show pdbs;

   CON_ID CON_NAME    OPEN MODE    RESTRICTED
_________ ___________ ____________ _____________
        2 PDB$SEED    READ ONLY    NO
        3 FREEPDB1    READ ONLY    NO
SQL> alter session set container=FREEPDB1;

Session altered.

SQL> show pdbs;

   CON_ID CON_NAME    OPEN MODE    RESTRICTED
_________ ___________ ____________ _____________
        3 FREEPDB1    READ ONLY    NO
SQL> info deparments3;

ERROR:
ORA-04043: object deparments3 does not exist
SQL> select * from departments3;

   DEPT_ID DEPT_NAME      LOCATION         BUDGET
__________ ______________ _____________ _________
         1 Research       Building 7       750000
         2 Research       Building 7       750000
       100 Development    Building 5       900000
         4 Marketing      Building 3       650000
SQL>

二、SQLcl 的核心特性
在生产主机上很多sqlplus难以实现的,Tab自动补全是最为好用的,
Tab键来补全语句关键字、table的名字,column的名字等,当某些table、视图中当中的列name巨长的时候,是不是得心应手。

    • 智能补全(表名/列名/函数)
    • 语法高亮显示
    • 多行编辑支持(类似 IDE)
bash 复制代码
SQL> help
For help on a topic type help <topic>
List of Help topics available:
/                  @                  @@                 ACCEPT             ALIAS              APEX               APPEND
AQ                 ARBORI             ARCHIVE_LOG        ARGUMENT           AWR                BACKGROUND         BLOCKCHAIN_TABLE
BREAK              BRIDGE             BTITLE             CD                 CERTIFICATE        CHANGE             CLEAR
CLOUDSTORAGE       CODESCAN           COLUMN             COMPUTE            CONNECT            CONNMGR            COPY
CS                 CTAS               DATAPUMP           DBCCRED            DDL                DEFINE             DEL
DESCRIBE           DG                 DIRS               DISCONNECT         EDIT               EXECUTE            EXIT
FILES              FIND               FORMAT             GET                HISTORY            HOST               IMMUTABLE_TABLE
INFORMATION        INPUT              JOBS               LIQUIBASE          LIST               LOAD               MDB
MIGRATEADVISOR     MLE                MODELER            NET                OCI                OCIDBMETRICS       OERR
ORAPKI             PASSWORD           PAUSE              POPD               PRINT              PROJECT            PROMPT
PUSHD              QUIT               REMARK             REPEAT             RESERVED_WORDS     REST               RUN
SAVE               SCRIPT             SDK                SECRET             SET                SHOW               SHUTDOWN
SODA               SPOOL              SSHTUNNEL          START              STARTUP            STORE              TIMING
TNSPING            TOSUB              TTITLE             UNDEFINE           UNLOAD             VARIABLE           VAULT
WAIT4              WHENEVER           WHICH              XQUERY

SQL> select * FROM V$VERSION
--习惯小写的命令,自动TAB补全的是大写
2. ​丰富的输出格式​

sqlformat格式化--OCM考试好用。通过设置sqlformat,可以设置不同输出的格式

bash 复制代码
SET SQLFORMAT JSON/CSV/HTML/XML

default
ansiconsole
csv
insert -- lists resuts as an insert statement
loader -- pipe-delimited
delimited -- same as csv
xml
html
fixed -- fixed width
text
json

2.1 设置sqlformant jason

bash 复制代码
SYS@CDB$ROOT> show pdbs;

   CON_ID CON_NAME    OPEN MODE     RESTRICTED
_________ ___________ _____________ _____________
        3 FREEPDB1    READ WRITE    NO
SYS@CDB$ROOT> set sqlformat json
SYS@CDB$ROOT> select * from departments3;
{"results":[{"columns":[{"name":"DEPT_ID","type":"NUMBER"},{"name":"DEPT_NAME","type":"VARCHAR2"},{"name":"LOCATION","type":"VARCHAR2"},{"name":"BUDGET","type":"NUMBER"}],"items":
[
{"dept_id":1,"dept_name":"Research","location":"Building 7","budget":750000}
,{"dept_id":2,"dept_name":"Research","location":"Building 7","budget":750000}
,{"dept_id":100,"dept_name":"Development","location":"Building 5","budget":900000}
,{"dept_id":4,"dept_name":"Marketing","location":"Building 3","budget":650000}
]}]}
SYS@CDB$ROOT>

2.2 设置XML格式

bash 复制代码
SYS@CDB$ROOT> set sqlformat xml
SYS@CDB$ROOT> select * from departments3;
<?xml version='1.0'  encoding='UTF-8' ?>
<RESULTS>
        <ROW>
                <COLUMN NAME="DEPT_ID"><![CDATA[1]]></COLUMN>
                <COLUMN NAME="DEPT_NAME"><![CDATA[Research]]></COLUMN>
                <COLUMN NAME="LOCATION"><![CDATA[Building 7]]></COLUMN>
                <COLUMN NAME="BUDGET"><![CDATA[750000]]></COLUMN>
        </ROW>
        <ROW>
                <COLUMN NAME="DEPT_ID"><![CDATA[2]]></COLUMN>
                <COLUMN NAME="DEPT_NAME"><![CDATA[Research]]></COLUMN>
                <COLUMN NAME="LOCATION"><![CDATA[Building 7]]></COLUMN>
                <COLUMN NAME="BUDGET"><![CDATA[750000]]></COLUMN>
        </ROW>
        <ROW>
                <COLUMN NAME="DEPT_ID"><![CDATA[100]]></COLUMN>
                <COLUMN NAME="DEPT_NAME"><![CDATA[Development]]></COLUMN>
                <COLUMN NAME="LOCATION"><![CDATA[Building 5]]></COLUMN>
                <COLUMN NAME="BUDGET"><![CDATA[900000]]></COLUMN>
        </ROW>
        <ROW>
                <COLUMN NAME="DEPT_ID"><![CDATA[4]]></COLUMN>
                <COLUMN NAME="DEPT_NAME"><![CDATA[Marketing]]></COLUMN>
                <COLUMN NAME="LOCATION"><![CDATA[Building 3]]></COLUMN>
                <COLUMN NAME="BUDGET"><![CDATA[650000]]></COLUMN>
        </ROW>
</RESULTS>
SYS@CDB$ROOT>
2.3 设置HTML
bash 复制代码
SYS@CDB$ROOT> set sqlformat HTML
SYS@CDB$ROOT> select * from departments3;
<!DOCTYPE html>
<html>

<head>
  <meta charset='UTF-8'>

  <title>Result Data</title>

  <meta name="viewport" content="width=device-width, initial-scale=1.0">


  <style>
  * {
    margin: 0;
    padding: 0;
  }
  body {
    font: 14px/1.4 Palatino, Serif;
  }
3. 免客户端安装
    • 独立运行(仅需 Java)
    • 支持所有连接方式:
      sql user/pwd@host:port/service
      sql /@tns_alias
4. 高级调试功能​
    • 实时 SQL 监控
    • 可视化执行计划
    • 历史命令性能分析
4.1 SQLcl支持历史指令检索的功能,默认是100个,可以单独设置数量。

循环复写,上下箭头操作,可以显示完整的指令,HISTORY FULL会隔行显示。
history

bash 复制代码
SQL> history;
History:
alter session set container = FREEPDB1;
SQL>

HISTORY USAGE,会显示单条语句的执行次数

bash 复制代码
SQL> history usage;
  1  (1) alter session set container =FREEPDB1;
  2  (1) info t
  3  (1) alter session set container = FREEPDB1;
  4  (1) info table departments3;
SQL>

HISTORY TIME,会显示单条语句的执行时间统计,是不是很有用

bash 复制代码
SQL> history time;
  1  (00.366) alter session set container =FREEPDB1;
SQL>

4.2 info显示各种统计信息,打包信息

bash 复制代码
SYS@CDB$ROOT> info dbms_stats.gather_table_stats;
Package

/* Package SYS.DBMS_STATS */
/*  PROCEDURE  SYS.DBMS_STATS.GATHER_TABLE_STATS  */
    SYS.DBMS_STATS.GATHER_TABLE_STATS(   OWNNAME            =>  p_IN_param0  /*   VARCHAR2   */,
                                         TABNAME            =>  p_IN_param1  /*   VARCHAR2   */,
                                         PARTNAME           =>  p_IN_param2  /*   VARCHAR2   */,
                                         ESTIMATE_PERCENT   =>  p_IN_param3  /*   NUMBER   */,
                                         BLOCK_SAMPLE       =>  p_IN_param4  /*   BOOLEAN   */,
                                         METHOD_OPT         =>  p_IN_param5  /*   VARCHAR2   */,
                                         DEGREE             =>  p_IN_param6  /*   NUMBER   */,
                                         GRANULARITY        =>  p_IN_param7  /*   VARCHAR2   */,
                                         CASCADE            =>  p_IN_param8  /*   BOOLEAN   */,
                                         STATTAB            =>  p_IN_param9  /*   VARCHAR2   */,
                                         STATID             =>  p_IN_param10  /*   VARCHAR2   */,
                                         STATOWN            =>  p_IN_param11  /*   VARCHAR2   */,
                                         NO_INVALIDATE      =>  p_IN_param12  /*   BOOLEAN   */,
                                         STATTYPE           =>  p_IN_param13  /*   VARCHAR2   */,
                                         FORCE              =>  p_IN_param14  /*   BOOLEAN   */,
                                         CONTEXT            =>  p_IN_param15  /*   VARRAY   */,
                                         OPTIONS            =>  p_IN_param16  /*   VARCHAR2   */);

/*  FUNCTION  SYS.DBMS_STATS.GATHER_TABLE_STATS_FUNC  */
    /*   RETURN NUMBER   */
     v_ret := SYS.DBMS_STATS.GATHER_TABLE_STATS_FUNC(   OWNNAME            =>  p_IN_param0  /*   VARCHAR2   */,
                                                        TABNAME            =>  p_IN_param1  /*   VARCHAR2   */,
                                                        PARTNAME           =>  p_IN_param2  /*   VARCHAR2   */,
                                                        ESTIMATE_PERCENT   =>  p_IN_param3  /*   NUMBER   */,
                                                        BLOCK_SAMPLE_STR   =>  p_IN_param4  /*   VARCHAR2   */,
                                                        METHOD_OPT         =>  p_IN_param5  /*   VARCHAR2   */,
                                                        DEGREE             =>  p_IN_param6  /*   NUMBER   */,
                                                        GRANULARITY        =>  p_IN_param7  /*   VARCHAR2   */,
                                                        CASCADE_STR        =>  p_IN_param8  /*   VARCHAR2   */,
                                                        STATTAB            =>  p_IN_param9  /*   VARCHAR2   */,
                                                        STATID             =>  p_IN_param10  /*   VARCHAR2   */,
                                                        STATOWN            =>  p_IN_param11  /*   VARCHAR2   */,
                                                        NO_INVALIDATE_STR  =>  p_IN_param12  /*   VARCHAR2   */,
                                                        STATTYPE           =>  p_IN_param13  /*   VARCHAR2   */,
                                                        FORCE_STR          =>  p_IN_param14  /*   VARCHAR2   */,
                                                        OPTIONS            =>  p_IN_param15  /*   VARCHAR2   */);

/*  PROCEDURE  SYS.DBMS_STATS.GATHER_TABLE_STATS_AUTONOMOUS_TXN  */
    SYS.DBMS_STATS.GATHER_TABLE_STATS_AUTONOMOUS_TXN(   OWNNAME   =>  p_IN_param0  /*   VARCHAR2   */,
                                                        TABNAME   =>  p_IN_param1  /*   VARCHAR2   */,
                                                        DEGREE    =>  p_IN_param2  /*   NUMBER   */);


SYS@CDB$ROOT>

4.3 查询DDL同时可导出

bash 复制代码
SYS@CDB$ROOT> help ddl
Generates the code to reconstruct the selected object.
Use the result type for materialized views.
Use the save parameter to save the DDL in a file.

           DDL <object_name> [<object_type>] [SAVE <file_name>.sql]

Usage:
  ddl {PARAMETERS}

Parameters:
  <object>
  Name of the database object you want to get its description.

  <objecttype>
  [OPTIONAL] Type of the resultant object. Values with spaces need to be quoted.
  Example: package_body or "package body" will both work.

  <save>
  [OPTIONAL] Save the content of the buffer to a SQL script.

  <filename>
  [OPTIONAL - SAVE required] File name where the content is saved.

More help topics:
  DDL EXAMPLES
  DDL SYNTAX

SYS@CDB$ROOT> ddl departments3;

  CREATE TABLE "SYS"."DEPARTMENTS3"
   (    "DEPT_ID" NUMBER(*,0) GENERATED BY DEFAULT ON NULL AS IDENTITY MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START WITH 1 CACHE 20 NOORDER  NOCYCLE  NOKEEP  NOSCALE  NOT NULL ENABLE,
        "DEPT_NAME" VARCHAR2(50) NOT NULL ENABLE,
        "LOCATION" VARCHAR2(100),
        "BUDGET" NUMBER(12,2),
         PRIMARY KEY ("DEPT_ID")
  USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "SYSTEM"  ENABLE
   ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "SYSTEM" ;
SYS@CDB$ROOT>
5.生态集成​
    • 内置 Liquibase
    • 云存储直连(OCI/Azure/AWS)
    • Docker 容器友好
      # 使用 Liquibase 进行数据库版本控制
      lb update -changelog-file schema.xml
6. 占用的资源和依赖 :​
  • 1.Java 依赖(需 JDK 8+)
  • 2.内存占用高于 SQL*Plus
  • 3.部分传统 DBA 脚本需调整语法

7. 功能对比sqlplus、sqlcl、sqldeveloper

|---------------|-----------|----------------|---------------|
| 特性 | SQL*Plus | SQLcl | SQL Developer |
| ​ 安装复杂度 ​ | 需完整客户端 | 免安装 | 需 GUI 安装 |
| ​ 内存占用 ​ | 5-10MB | 100-300MB | 500MB+ |
| ​ 自动补全 ​ | ❌ | ✅ 智能补全 | ✅ 图形化补全 |
| ​ 输出格式化 ​ | 基础表格 | 10+种格式 | 可视化导出 |
| ​ 版本控制 ​ | ❌ | ✅ Liquibase 集成 | ✅ Git 集成 |
| ​ 云服务集成 ​ | ❌ | ✅ 原生支持 | ✅ 需插件 |
| ​ 脚本兼容性 ​ | ✅ 100% | ✅ 95% | ❌ 部分不兼容 |
| ​ 23ai 特性支持 ​ | ❌ | ✅ 完整支持 | ✅ 需新版 |

相关推荐
一 乐1 小时前
婚纱摄影网站|基于ssm + vue婚纱摄影网站系统(源码+数据库+文档)
前端·javascript·数据库·vue.js·spring boot·后端
1.14(java)2 小时前
SQL数据库操作:从CRUD到高级查询
数据库
Full Stack Developme3 小时前
数据库索引的原理及类型和应用场景
数据库
IDC02_FEIYA4 小时前
SQL Server 2025数据库安装图文教程(附SQL Server2025数据库下载安装包)
数据库·windows
辞砚技术录5 小时前
MySQL面试题——联合索引
数据库·面试
萧曵 丶5 小时前
MySQL 主键不推荐使用 UUID 的深层原因
数据库·mysql·索引
小北方城市网5 小时前
分布式锁实战指南:从选型到落地,避开 90% 的坑
java·数据库·redis·分布式·python·缓存
毕设十刻5 小时前
基于Vue的人事管理系统67zzz(程序 + 源码 + 数据库 + 调试部署 + 开发环境配置),配套论文文档字数达万字以上,文末可获取,系统界面展示置于文末
前端·数据库·vue.js
Master_清欢7 小时前
jupyter新增行数
ide·python·jupyter
TDengine (老段)7 小时前
TDengine Python 连接器入门指南
大数据·数据库·python·物联网·时序数据库·tdengine·涛思数据