当前位置: 首页 > news >正文

Oracle SQL Plus 如何不显示结果集 (TERMOUT OFF)

需求描述

为什么会有这个需求? 因为一些SQL输出很多(例如数千行),但我们只需要他的执行计划或SQL Monitor报告。

太多的输出不仅干扰了我们所需的信息,而且也拉长了elapsed time。

基本概念

方法其实就是SQL Plus的SET TERMOUT OFF选项。其说明参见这里:

Controls the display of output generated by commands in a script that is executed with @, @@ or START. OFF suppresses the display so that you can spool output to a file without displaying the output on screen. ON displays the output on screen. TERMOUT OFF does not affect output from commands you enter interactively or redirect to SQL*Plus from the operating system.

这里的核心意思是说:

  • TERMOUT控制SQL的输出是否输出到屏幕,ON是输出,OFF是不输出
  • TERMOUT默认是ON
  • 对于交互式输出不管用,只适用于非交互式的通过 @, @@ 或 START调用的脚本。
SQL>settermout SP2-0265: termout must besetONorOFFSQL>showtermout termoutON

极简示例

有两个脚本,main.sql调用test1.sql。内容如下,其中--是注释。

$ cat main.sql-- SET TERMOUT OFF@test1exit$ cat test1.sqlselectsysdatefromdual;

由于TERMOUT默认是打开,因此可以看到输出:

$ sqlplus-S/ as sysdba @main SYSDATE ---------25-JUN-26

把main.sql中的注释去掉,再次执行,这回没有输出了:

$ sqlplus-S/ as sysdba @main $

如果SET TERMOUT写在被调用的脚本test1.sql,效果也是一样的。但放在调用脚本控制更方便。

实用场景示例

常用的场景包括:

  1. 只需要执行计划,不需要结果集
  2. 只需要实时SQL Monitor 报告,不需要结果集

我们来演示下场景1。

两个脚本,main.sql调用test1.sql:

$ cat main.sqlSETTERMOUTOFF@test1.sqlSETTERMOUTONSELECT*FROMTABLE(DBMS_XPLAN.DISPLAY_CURSOR);exit$ cat test1.sqlselect*fromemployees;

执行结果只有执行计划,没有结果集:

$ sqlplus-S hr/******@orclpdb1@mainPLAN_TABLE_OUTPUT--------------------------------------------------------------------------------SQL_ID7jk33n4f4mpy9,child number0-------------------------------------select*fromhr.employeesPlanhashvalue:1445457117-------------------------------------------------------------------------------|Id|Operation|Name|Rows|Bytes|Cost(%CPU)|Time|-------------------------------------------------------------------------------|0|SELECTSTATEMENT||||3(100)|||1|TABLEACCESSFULL|EMPLOYEES|106|7314|3(0)|00:00:01|PLAN_TABLE_OUTPUT---------------------------------------------------------------------------------------------------------------------------------------------------------------13rowsselected.

实用场景示例进阶

需求和上一个场景的唯一不同是,我们需要把输出写到文件中,但不包含结果集。例如实时SQL Monitor的html输出。

还是两个脚本,main.sql和test1.sql。

test1.sql不变。来看下main.sql的三种写法。

第一种写法:

$ cat main.sqlSPOOL test1.outSETTERMOUTOFF@test1.sqlSETTERMOUTONSELECT*FROMTABLE(DBMS_XPLAN.DISPLAY_CURSOR);SPOOLOFFEXIT

执行如下:

$ sqlplus-Shr/********@orclpdb1 @main PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------- SQL_ID 7jk33n4f4mpy9, child number0-------------------------------------select* from hr.employees Planhashvalue:1445457117-------------------------------------------------------------------------------|Id|Operation|Name|Rows|Bytes|Cost(%CPU)|Time|-------------------------------------------------------------------------------|0|SELECT STATEMENT||||3(100)|||1|TABLE ACCESS FULL|EMPLOYEES|106|7314|3(0)|00:00:01|PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------- -------------------------------------------------------------------------------13rows selected. $ls-ltest1.out -rw-r--r--.1oracle oinstall65471Jun2509:53 test2.out $headtest1.out EMPLOYEE_ID FIRST_NAME LAST_NAME ----------- -------------------- ------------------------- EMAIL PHONE_NUMBER HIRE_DATE JOB_ID SALARY ------------------------- -------------------- --------- ---------- ---------- COMMISSION_PCT MANAGER_ID DEPARTMENT_ID -------------- ---------- -------------100Steven King SKING515.123.456717-JUN-03 AD_PRES2400090

第二种写法:

$ cat main.sqlSETTERMOUTOFF@test1.sqlSETTERMOUTONSPOOL test1.outSELECT*FROMTABLE(DBMS_XPLAN.DISPLAY_CURSOR);SPOOLOFFEXIT

执行如下:

$ sqlplus-Shr/********@orclpdb1 @main PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------- SQL_ID 7jk33n4f4mpy9, child number0-------------------------------------select* from hr.employees Planhashvalue:1445457117-------------------------------------------------------------------------------|Id|Operation|Name|Rows|Bytes|Cost(%CPU)|Time|-------------------------------------------------------------------------------|0|SELECT STATEMENT||||3(100)|||1|TABLE ACCESS FULL|EMPLOYEES|106|7314|3(0)|00:00:01|PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------- -------------------------------------------------------------------------------13rows selected. $ls-ltest1.out -rw-r--r--.1oracle oinstall1399Jun2509:56 test2.out $headtest2.out PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------- SQL_ID 7jk33n4f4mpy9, child number0-------------------------------------select* from hr.employees Planhashvalue:1445457117-------------------------------------------------------------------------------

第三种写法:

$ cat main.sqlSETTERMOUTOFF@test1.sqlSPOOL test1.outSELECT*FROMTABLE(DBMS_XPLAN.DISPLAY_CURSOR);SPOOLOFFEXIT

执行如下:

$ sqlplus-Shr/********@orclpdb1 @main $ls-ltest1.out -rw-r--r--.1oracle oinstall1399Jun2510:00 test1.out $headtest1.out PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------- SQL_ID 7jk33n4f4mpy9, child number0-------------------------------------select* from hr.employees Planhashvalue:1445457117-------------------------------------------------------------------------------

哪一种写法是正确的?其实二和三都正确,但我常用三。

以上示例揭示了TERMOUT OFF的一个坑,即如果写在SPOOL后面,尽管不会输出到屏幕,但会将输出定向到spool文件。

http://www.jsqmd.com/news/1084033/

相关文章:

  • Karpathy LLM Wiki 完整原理与双方案部署教程(Cursor _ Claude 通用)
  • 【课程设计/毕业设计】基于 SpringBoot+Vue 的企业员工档案与人事考评系统的设计与实现 基于 SpringBoot 的智能化企业人事运维管理系统【附源码、数据库、万字文档】
  • 68元对标Claude Opus,豆包2.1 Pro性价比拉满,但能否留住用户仍待考验?
  • SDR++:如何用开源软件构建你的无线电频谱分析系统
  • 安卓木马滥用虚拟化技术劫持银行应用:原理、检测与防御
  • tiktoken:OpenAI模型Token精准计量与工程实践指南
  • 终极无广告体验:SpotifyPremium桌面版完整配置指南
  • 智谱市值破万亿:是资本游戏还是 AI 新范式?解禁后命运几何?
  • 体检门店销量榜诊断模型
  • 【PC】 Vutron音乐-高颜值免费音乐软件-畅听全网
  • ts3380,G3000,ix6780,MG3640,ix6700,ix6800,G5080,TS8380,ts8220报错5B00,P07,E08,1700,5b02废墨垫清零,亲测可用
  • 告别链接失效烦恼:百度网盘秒传脚本完全指南
  • 进销存软件不一定贵,但要看这几点
  • 鸿蒙语音识别的 Flutter ↔ ArkTS 完整调用链:权限申请、引擎生命周期与结果回传的时序问题
  • 中医药现代化研究,国自然申请书怎么写才能中?
  • 一台高配置图形工作站带10人SolidWorks画图的实施方案是怎样的
  • 别再浪费Token了!教你用企微回调接口,做个低成本的AI“语料传送带”
  • MusicBee-NeteaseLyrics:让本地音乐库重获网易云音乐歌词生态的智能插件
  • 2026干细胞研究获突破 关键基因机制阐明
  • 加权射影空间中行列式簇的度与正则性计算实战
  • 2026保姆级教程:免费好用手机抠图APP汇总,人像物品一键去除背景全指南
  • 跨平台网盘直链下载解决方案:高效解锁九大网盘文件下载
  • 《HarmonyOS技术精讲-窗口管理》第一篇:窗口基础概念与WindowStage
  • Windows 端口占用排查与释放
  • 用你自己的签名,打你自己
  • 微信会话存档亿级数据处理:基于 RSA 混合解密与 Flink 的流式架构实战
  • 第一次写课程论文不会搭框架?Gradpaper 自动生成标准大纲,跟着填就行
  • 【AI大模型进阶】从GPT-1到GPT-4,它到底进化出了什么“可怕”的能力?
  • C#工业相机开发从零到一:图像采集与显示的工程化实战
  • SDR++:零臃肿的跨平台软件定义无线电软件,你值得拥有吗?