SET 命令简介
SET 命令用于设置 SQLPlus 系统变量(也称为 SET 变量)的值,这些变量决定了 SQLPlus 如何显示查询结果、处理错误、格式化输出等。

基本语法:
SET [SYSTEM] {variable_name} {value}
SYSTEM(可选): 如果使用SET SYSTEM,该变量将成为一个会话级的系统变量,对所有 SQL*Plus 脚本都有效,如果不使用SYSTEM,则变量仅对当前会话(或当前脚本)有效。variable_name: 要设置的变量名。value: 要设置的值。
查看当前所有 SET 变量的值:
SHOW ALL
查看某个特定 SET 变量的值:
SHOW variable_name
常用 SET 命令详解
下面是一些最常用和最重要的 SET 命令,并附有说明和示例。

控制输出显示
| 命令 | 语法 | 说明 | 示例 |
|---|---|---|---|
| PAGESIZE | SET PAGESIZE {n} |
设置每页显示的行数,默认为 14,设置为 0 表示不换页,即所有结果连续输出。 | SET PAGESIZE 0 (取消分页) |
| LINESIZE | SET LINESIZE {n} |
设置每行的最大字符数,默认是 80,对于宽表,需要设置更大的值以避免换行。 | SET LINESIZE 200 |
| LONG | SET LONG {n} |
控制 LONG 或 CLOB 类型数据的显示长度,默认是 80,查看存储过程、函数的源码时需要设置一个较大的值。 |
SET LONG 100000 |
| LONGCHUNKSIZE | SET LONGCHUNKSIZE {n} |
控制每次从数据库获取 LONG 数据的块大小,通常与 SET LONG 配合使用。 |
SET LONGCHUNKSIZE 8000 |
| HEADING | SET HEADING {ON|OFF} |
控制是否显示列标题,默认为 ON。 |
SET HEADING OFF (不显示列名) |
| FEEDBACK | SET FEEDBACK {n|ON|OFF} |
当查询返回 n 行或更多时,显示 "已选择 X 行" 的消息。ON 默认为 6 行,OFF 表示不显示。 |
SET FEEDBACK 1 (每次查询都显示行数) |
| NULL | SET NULL {text} |
当查询结果为 NULL 时,显示指定的文本,默认为空字符串。 |
SET NULL 'NULL值' |
控制格式化和布局
| 命令 | 语法 | 说明 | 示例 |
|---|---|---|---|
| TIMING | SET TIMING {ON|OFF} |
显示每条 SQL 语句执行的耗时,对性能分析非常有用,默认为 OFF。 |
SET TIMING ON |
| ARRAYSIZE | SET ARRAYSIZE {n} |
设置 SQL*Plus 一次从数据库获取的行数,值越大,网络往返次数越少,但内存占用也越大,默认为 15。 | SET ARRAYSIZE 50 |
| PAUSE | SET PAUSE {ON|OFF|text} |
ON 时,每次输出一屏后暂停,并显示 "按回车键继续...",可以自定义提示文本。 |
SET PAUSE ON |
| PNO | SET PNO {ON|OFF} |
控制是否在每页的顶部显示页码,默认为 ON。 |
SET PNO OFF |
控制编辑和脚本行为
| 命令 | 语法 | 说明 | 示例 |
|---|---|---|---|
| ECHO | SET ECHO {ON|OFF} |
控制是否在运行脚本时显示脚本本身的内容,默认为 OFF,调试脚本时非常有用。 |
SET ECHO ON |
| VERIFY | SET VERIFY {ON|OFF} |
控制是否显示用 & 或 && 定义的替换变量的值,默认为 ON。 |
SET VERIFY OFF (不显示变量替换过程) |
| SCAN | SET SCAN {ON|OFF} |
控制是否对输入的脚本进行 & 替换,默认为 ON,如果要在脚本中输入 & 字符本身,可以设置为 OFF。 |
SET SCAN OFF |
| TERMOUT | SET TERMOUT {ON|OFF} |
控制是否将脚本的输出显示到屏幕上,设置为 OFF 时,脚本仍然会执行,只是你看不到结果,常用于将输出重定向到文件。 |
SET TERMOUT OFF |
| SERVEROUTPUT | SET SERVEROUTPUT {ON|OFF} [SIZE {n|UNLIMITED}] [FORMAT {WRAP|TRUNC}] |
控制是否显示数据库包(如 DBMS_OUTPUT)的输出信息,开发 PL/SQL 时必备。 |
SET SERVEROUTPUT ON SIZE 1000000 |
控制错误和事务处理
| 命令 | 语法 | 说明 | 示例 |
|---|---|---|---|
| SQLPLUSCOMPATIBILITY | SET SQLPLUSCOMPATIBILITY {version} |
设置 SQL*Plus 的行为与哪个 Oracle 数据库版本兼容,可以设置为 0 或 0。 |
SET SQLPLUSCOMPATIBILITY 11.0 |
| SQLBLANKLINES | SET SQLBLANKLINES {ON|OFF} |
允许 SQL 语句中包含空行,默认为 OFF。 |
SET SQLBLANKLINES ON |
| DEFINER | SET DEFINER {USER|CURRENT_USER} |
在创建视图或同义词时,指定使用哪个用户的权限。 | SET DEFINER CURRENT_USER |
实践示例
假设我们有一个表 EMPLOYEES,并且我们想以一个美观、信息完整的格式查看它。
默认情况下的输出
SQL> SELECT * FROM EMPLOYEES WHERE ROWNUM < 10;
输出可能分页、列宽不够、显示 "已选择 X 行" 等信息,可能不够直观。
优化后的查询环境

我们可以先设置一组 SET 命令来优化输出:
-- 1. 设置行宽和页长,避免内容被截断和分页 SQL> SET LINESIZE 200 SQL> SET PAGESIZE 0 -- 2. 关闭不必要的输出信息,让结果更清爽 SQL> SET HEADING OFF SQL> SET FEEDBACK OFF SQL> SET PNO OFF -- 3. 如果有LONG类型数据,需要设置 SQL> SET LONG 1000000 -- 4. 现在执行查询 SQL> SELECT EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, HIRE_DATE FROM EMPLOYEES WHERE ROWNUM < 10;
输出会是一个连续的、没有列标题、没有行数提示的干净表格。
在脚本文件中应用
这些 SET 命令会放在 SQL 脚本的开头,以确保脚本在任何环境下都能以期望的方式运行。
-- script.sql SET ECHO ON SET LINESIZE 200 SET PAGESIZE 0 SET HEADING ON SET FEEDBACK ON SET SERVEROUTPUT ON SIZE UNLIMITED P -- 这是一个注释,P是PRINT的缩写,用于换行和显示信息 P -- 正在执行查询... SELECT * FROM EMPLOYEES WHERE DEPARTMENT_ID = 50; P -- 查询执行完毕。
运行脚本:
sqlplus username/password @script.sql
SET 命令的最佳实践
- 一致性: 在开发一套报表或脚本时,在脚本开头使用
SET命令统一环境,避免因不同用户或不同机器的 SQL*Plus 配置差异导致输出不一致。 - 调试: 使用
SET ECHO ON和SET TIMING ON来调试和性能分析你的脚本。 - 可读性: 使用
SET LINESIZE和SET PAGESIZE来确保输出结果易于阅读。 - 自动化: 在使用
spool命令将输出重定向到文件时,通常需要关闭PAGESIZE、HEADING、FEEDBACK等,以生成干净的数据文件(如 CSV)。
掌握 SET 命令是高效使用 SQLPlus 的关键,它能让你完全掌控 SQLPlus 的行为,使其成为一个强大而灵活的工具。
