Sublime Text 3需改用sublimelsp的SQL语法包替代内置PL/SQL,并手动配置Oracle关键词补全、禁用sqlparse重排、显式设置Build System环境变量。

右下角显示 PL/SQL 就说明高亮根本没走对路
Sublime Text 3 默认不支持 PL/SQL 语法高亮——它内置的 PL/SQL 语法定义非常简陋,只覆盖 Oracle 8i 时代的极小子集,WITH、MERGE、PIVOT、JSON_OBJECT 等现代关键字全不识别,括号配对也常错乱。你点右下角选了 PL/SQL,发现 SELECT 不变色、-- 注释不斜体、/* */ 里嵌套高亮失效,这不是插件问题,是语法 scope 本身就不包含这些规则。
真正可用的路径只有一条:用标准 SQL 语法包(作者 sublimelsp)替代 PL/SQL,再手动补全 Oracle 特有关键词。别信“PL/SQL Enhanced”这类过时包,它们连 DBMS_OUTPUT.PUT_LINE 都会断开高亮。
- 打开任意
.sql或.pls文件 → 点右下角当前语法名 → 选SQL(不是PL/SQL) - 右键文件标签 →
Set Syntax: SQL→Apply to All Files with Same Extension - 若菜单里没有
SQL选项:按Ctrl+Shift+P→ 输入Package Control: Install Package→ 安装SQL(作者必须是sublimelsp) - 验证:写
SELECT * FROM DUAL; DBMS_OUTPUT.PUT_LINE('test');→ 前者关键字应立刻变蓝,后者函数名保持默认色(正常,后续靠补全)
代码提示靠 Packages/User/xxx.sublime-completions,不是插件自动给
Sublime Text 3 没有语言服务器,所谓“PL/SQL 提示”本质是静态关键词补全。SQLTools 插件自带的补全只覆盖 ANSI SQL,Oracle 特有函数(如 TO_DATE、REGEXP_LIKE)、包名(DBMS_*)、伪列(ROWNUM、LEVEL)全得自己填。
补全文件必须放在 Packages/User/ 目录下,命名任意但后缀为 .sublime-completions,内容格式严格:
{
"scope": "source.sql",
"completions": [
{ "trigger": "rownum", "contents": "ROWNUM" },
{ "trigger": "dbms_output", "contents": "DBMS_OUTPUT.${1:PUT_LINE}('${2:text}');" }
]
}-
"scope": "source.sql"是关键——用source.plsql或source.oracle都无效,因为语法识别已切到SQL - 触发词(
trigger)建议全小写,避免大小写敏感导致失灵 - 补全项里带
${1:text}这种占位符,按Tab可跳转编辑,比纯字符串实用得多 - 别把整个 Oracle 手册塞进去:超过 200 条补全项会导致 Sublime 卡顿,优先加高频函数和常用包
Ctrl+Alt+F 格式化后 PL/SQL 块缩进错乱?sqlparse 不认 BEGIN/END
sqlparse 是 Python 写的通用 SQL 解析器,它把 BEGIN ... END 当成普通语句块处理,不会识别 PL/SQL 的嵌套层级。结果就是 IF ... THEN ... END IF; 里的 THEN 缩进被抹平,DECLARE 后的变量声明全挤在第一列。
唯一可控的做法是关掉自动重排,只做基础美化:
- Preferences → Package Settings → SQLTools → Settings,改这两项:
"formatter": "sqlparse""sqlparse_options": {"keyword_case": "upper", "identifier_case": "preserve", "reindent": false} -
reindent: false是重点——保留你手写的缩进,只统一关键字大小写、修复空格 - 别加
--reindent或--wrap-after参数,它们会让FOR i IN 1..10 LOOP变成三行,破坏可读性 - 确认
pip install sqlparse是全局安装(不是虚拟环境),且版本 ≥ 0.4.4(旧版解析WITH FUNCTION直接崩溃)
Build System 调用 sqlplus 失败,90% 是环境变量没透过去
Sublime Text 3 启动时继承的是系统登录 shell 的环境变量,但 Windows 图形界面启动的 Sublime 往往拿不到你终端里设的 ORACLE_HOME 和 PATH。直接按 Ctrl+B 报错 sqlplus: command not found 或 ORA-12154: TNS could not resolve,不是配置写错了,是进程根本没看到 Oracle 环境。
- 先在终端运行
sqlplus /nolog确认能启动;再执行echo $ORACLE_HOME(macOS/Linux)或echo %ORACLE_HOME%(Windows)看值是否非空 - 新建 Build System(
Tools > Build System > New Build System),内容如下:{ "cmd": ["sqlplus", "-S", "username/password@tns_alias", "@$file"], "selector": "source.sql", "shell": true, "env": { "ORACLE_HOME": "/opt/oracle/product/19c/dbhome_1", "PATH": "/opt/oracle/product/19c/dbhome_1/bin:${PATH}" } } -
env字段必须显式声明,不能依赖系统 PATH——尤其 Windows 下sqlplus.exe在C:\oracle\product\19c\client_1\bin,而 Sublime 默认只找C:\Windows\System32 -
-S参数禁用 banner 输出,避免干扰结果;@$file确保执行完整文件,不是粘贴片段
最易被忽略的是:语法识别(source.sql)和 Build System 的 selector 必须完全一致。哪怕你右下角显示的是 SQL,如果 Build System 里写成 source.plsql,Ctrl+B 就永远静默失效。


















