让输出可读
默认的 SQL*Plus 输出经常因为行宽和页高而错乱。开始工作前先设置格式,这是一条值得背下来的习惯。
SET LINESIZE 200
-- 每行最多字符数
SET PAGESIZE 100
-- 每页行数;设为 0 会把列标题/页标题一起屏蔽,只想关掉翻页请设大值
SET LONG 20000
-- 长类型(CLOB 等)显示宽度
SET NUMWIDTH 12
-- 数字列宽
SET FEEDBACK ON
-- 显示「已选择 N 行」
SET TIMING ON
-- 显示语句耗时
SET NULL '(null)'
-- 让 NULL 可见SQL 缓冲区与斜杠
- SQL*Plus 把最近一条语句存进缓冲区,单独输入 / 表示重新执行
- 分号 ; 表示「执行」,单独回车只是换行继续输入
- EDIT 或 ED 可以打开编辑器修改缓冲区内容
- LIST / 数字 / DEL 可以查看和修改缓冲区特定行
-- 先输入一条跨行语句,用分号执行
SELECT employee_id, last_name
FROM employees
WHERE employee_id = 100;
-- 此时缓冲区里有 4 行
LIST
-- 列出缓冲区所有行及行号
2 -- 把「当前行」切到第 2 行
c/employees/employees_demo/ -- 替换当前行的内容
/ -- 从头重新执行整条语句这一段是交互式操作:LIST、2、c/旧/新/、/ 都必须在 SQL*Plus 提示符下一行一行输入,不能当脚本一次性粘贴执行(批量执行时那个 2 会被当成行号参数而报 SP2 错误)。要点是:n 或 LIST n 定位第 n 行,c/旧/新/ 替换当前行,单独一个 / 重新执行整个缓冲区。
脚本化与变量
要做可重复的查询,应该写成脚本文件,用替换变量接受输入。这是 DBA 日常批量作业的基础。
-- 保存为 dept_report.sql
SET PAGESIZE 50
SET LINESIZE 150
ACCEPT p_dept PROMPT '请输入部门 ID: '
SELECT e.last_name, e.salary, d.department_name
FROM employees e
JOIN departments d ON d.department_id = e.department_id
WHERE e.department_id = &p_dept
ORDER BY e.salary DESC;
-- 调用
@dept_report.sql
-- 或把结果落盘
SPOOL report.txt
@dept_report.sql
SPOOL OFF工具怎么选
- SQL*Plus:所有环境都有,脚本化能力强,运维首选
- SQLcl:Oracle 官方新命令行工具,支持 JavaScript、历史命令和自动补全
- SQL Developer:官方免费图形工具,看执行计划、调试 PL/SQL 很方便
- DBeaver / Navicat:第三方,跨库体验统一,日常写 SQL 更顺手
- 生产环境做脚本,建议用 SQL*Plus;探索数据结构用图形工具