PL/SQL 杂谈(六)(pl/sql for)
mhr18 2025-06-30 18:22 4 浏览 0 评论
承接(五)。内容书写不容易,各位友友们,如果可以,麻烦点个赞,让我有动力可以写下去。
这节主要谈谈 关于 SQL*Plus 的其他任务。SQL*Plus 有大量命令,但由于文章字数有限,我们只能聊一聊那些特别重要的、或是特别让人困惑的少数一些命令。
1、个性化设置
我们可以对 SQL*PLUS 进行个性化设置,通过命令行的方式改变它内置的变量值和设置。我们已在上面的示例中看到了 SET SERVEROUTPUT ON 命令,
SQL*PLUS 中的 SET 命令有许多选项,如 SET SUFFIX(改变默认的文件扩展名)、SET LINESIZE n(设置显示时每行最大字符数,超过部分进行折行处理)等,
可以用下面的命令来查看当前会话的各选项的值:
SQL>SHOW ALL
------
SQL*Plus 也可以创建和操作它自己的一些内存变量,它预留了一些特殊的变量,这些变量可以影响它的行为。
实际上,SQL*PIus中有两类变量:DEFINE 和 绑定变量。我们可以使用 DEFINE 命令给一个 DEFINE 变量赋值:
SQL> DEFINE x="the answer is 42"
如要查看x的值,可以这样:
SQL>DEFINE x
DEFINE x="the answer is 42"(CHAR)
---
若要引用这样的变量,需要使用连接符号“&”。SQL*plus 在把语句发送给 Oracle 数据库之前,会对变量做一个简单的替代,所以当我们希望一个字符串被当作变量进行替代,我们就需要把它用单引号括起来:
SELECT '&X' FROM DUAL;
----
对于绑定变量,我们需要首先对它进行声明,然后就可以在 PL/SQL 里使用它了,如要显示它的值,就用 SQL*Plus 里的 PRINT 命令:
SQL> VARIABLE x VARCHAR2(10)
SQL> BEGIN
:x := 'hello';
END ;
----
PL/SQL procedure successfully completed.
SQL> PRINT :x
----
X
-----------
hello
在这里,大家可能有点小困惑,因为现在出现了两个不同的变量“x”,一个是定义出来的,一个是声明出来的:
SQL> SELECT :x,'&x' FROM DUAL;
----
原值 1: SELECT :x,'&x' FROM DUAL
新值 1: SELECT :x,'the answer is 42' FROM DUAL
:X 'THEANSWERIS42'
--------------------------- -----------------------------------
hello the answer is 42
-----------------------------------------
只需记住,DEFINE 的变量总是被SQL*PLUS 当作扩展的字符串使用,而 DECLARED 的变量可以被 SQL 和 PL/SQL 当作真正的绑定变量使用。
------------------
2、将输出保存到文件
时不时地,我们需要把一个 SQL*Plus 会话的输出保存到一个文件中去,用于生成报告,或是记录我们的操作过程,或是我们需要把执行的命令记录下来以便日后再次运行。在SQL*Plus中,一个简便的方法是使用 SPOOL 命令:
SQL> SPOOL report
---我们要事先在当前目录新建一个 run_report.sql文件,或者指明具体路径。写一段SQL语句,比如 SELECT * FROM EMPLOYEES
SQL> @run_report.sql
........输出的内容不断向下滚动..........
第一条命令的意思就是写入名为 report.lst的文件,这个文件所在的目录是当前所在目录,可以打开cmd,就看到当前目录……
SQL> SPOOL OFF
SPOOL OFF命令告诉SQL*Plus,停止将输出保存到文件,同时关闭文件。
而 report 文件扩展名.1st 是默认的,可以通过在 SPOOL 命令中指定扩展名来改变默认扩展名:
SQL> SPOOL report.txt
------------------------------
3、退出 SQL*Plus
使用 EXIT 命令,可以退出 SQL*Plus,返回到操作系统环境:
SQL> EXIT ;
如果我们退出之前还在进行 SPOOL,那么 SQL*Plus 会自动停止 SPOOL 并关闭文件,如果我们在会话中修改了一些表的数据,没有用显式的事务控制语句结束事务,就退出SQL*Plus,会有什么后果?
默认地,SQL*Plus 退出前会强制进行事务提交(COMMIT),特殊情况是因为 SQL错误而导致会话终止,并且我们在SOL*Plus会话里发出过 WHENEVER SQLERROR EXIT ROLLBACK 指令。
若要断开数据库连接,但仍留在 SQL*Plus 环境,可以使用 DISCONNECT 命令,这个命令的表现是这样的:
SQL> DISCONNECT
切换连接时,我们无需使用 DISCONNECT 命令——我们只要再发一条 CONNECT 命令即可,SQL*Plus 会断开前一个连接,再建立新的连接。但实际上,有时断开再重新连接实属必要:如果我们正在使用操作系统验证,脚本就可能会自动重新连接,但使用的是错误的账号,这样的情况是有可能发生的。
-----------------------
4、 编辑语句
SQL*PLUS 会在缓存中保留最新接收的一些语句,我们可以对这些语句进行编辑,既可以使用内置的行编辑器、也可使用任意的外部编辑器。
下面进行演示如何设置和使用一个外部编辑器:
edit 命令、可以使得SQL*PLUS 把当前保留在缓存中的命令存储能到一个文件去,暂时停止SQL*Plus 并调用编译器:
SQL>EDIT
保存命令的文件名默认是 afiedt.buf,我们也可以使用 SET EDITFILE 命令进行修改。或者,如果我们想编辑一个现有的文件,
只需把文件名作为EDTT命令的变量:
SQL> EDIT abe.pkg
如果我们没有abe.pkg这个文件,他会提示是否新建。一旦我们保存文件并退出编辑器、SQL*PLUS 会话就将新边界的文件内容读入缓存,然后会话继续。
ORACLE 默认的外部编辑器是:
(1)UNIX、Linux 相关操作系统使用 ed.
(2)Windows 系列使用 Notepad.
虽然默认编译器的选择已经被硬编码到 SQLPLUS 可执行文件中了,我们仍然可以通过设置 SQL*Plus 的 _EDITOR 变量的值,来轻松地改变当前的编码器。
看下面的示例:
SQL> DEFINE _EDITOR = /bin/vi
---不建议修改
/bin/vi 是一款“怪人”们常用的编辑软件的全路径。为安全考虑,建议在这里使用编辑器的全路径名称。
如果我们只想使用 SQL*Plus 内置的行编辑器(也确实挺方便的),有一些基本的命令需要了解:
(1)L
显示最后使用的语句。
(2)n
把语句的第n行作为当前行。
(3)DEL
删除当前行。
(4)C/old/new
当前行中,把第一个出现的 old 替换成 new。分隔符(这里是一个斜杠)可以是任意字符
(5)n text
把 text 作为第n行的内容,
(6)I
在当前行之后插入一行。若要在当前行之前插入一行,使用0行命令(即“0 text”)。
---------------
5、在启动时自动加载自定义环境
若要自定义我们的 SQL*Plus 环境,在不同的会话中都保有我们的自定义,我们需要编辑一个或是多个自动启动脚本。
SQL*Plus在启动时的表现是这样的:
(1)搜索$
ORACLE_HOME/sqlplus/admin/glogin.sgl文件,如果成功,执行文件里面的命令,这是个“全局”登录脚本,
任何人只要执行的是同一个 Oracle home 下的 SQL*Plus,不管是从哪个目录登录的,都会执行这个脚本。
(2)下一步,如果当前目录下存在 login.sql文件,它就运行这个文件。
启动脚本内所包含的语句内容,可以跟任何 SOL*Plus脚本内容一样:SET命令、SQL语句、列格式化命令,等等。
上述的两个启动脚本都不是必须存在的,如果都存在,则先执行glogin.sql,然后是login.sql,如果两个文件中的变量设置有冲突,则以最后一个脚本为准。
相关推荐
- 【预警通报】关于WebLogic存在远程代码执行高危漏洞的预警通报
-
近日,Oracle官方发布了2021年1月关键补丁更新公告CPU(CriticalPatchUpdate),共修复了包括CVE-2021-2109(WeblogicServer远程代码执行漏洞)...
- 医院信息系统突发应急演练记录(医院信息化应急演练)
-
信息系统突发事件应急预案演练记录演练内容信息系统突发事件应急预案演练参与人员信息科参与科室:全院各部门日期xxxx-xx-xx时间20:00至24:00地点信息科记录:xxx1、...
- 一文掌握怎么利用Shell+Python实现完美版的多数据源备份程序
-
简介:在当今数字化时代,无论是企业还是个人,数据的安全性和业务的连续性都是至关重要的。数据一旦丢失,可能会造成无法估量的损失。因此,如何有效地对分布在不同位置的数据进行备份,尤其是异地备份,成为了一个...
- docker搭建系统环境(docker搭建centos)
-
Docker安装(CentOS7)1.卸载旧版Docker#检查已安装版本yumlistinstalled|grepdocker#卸载旧版本yumremove-ydocker.x...
- 基础篇:数据库 SQL 入门教程(sql数据库入门书籍推荐)
-
SQL介绍什么是SQLSQL指结构化查询语言,是用于访问和处理数据库的标准的计算机语言。它使我们有能力访问数据库,可与多种数据库程序协同工作,如MSAccess、DB2、Informix、M...
- Java21杀手级新特性!3行代码性能翻倍
-
导语某券商系统用这招,交易延迟从12ms降到0.8ms!本文揭秘Oracle官方未公开的Record模式匹配+虚拟线程深度优化+向量API神操作,代码量直降70%!一、Record模式匹配(代码量↓8...
- 一文读懂JDK21的虚拟线程(java虚拟线程)
-
概述JDK21已于2023年9月19日发布,作为Oracle标准Java实现的一个LTS版本发布,发布了15想新特性,其中虚拟线程呼声较高。虚拟线程是JDK21中引入的一项重要特性,它是一种轻量级的...
- 效率!MacOS下超级好用的Linux虚拟工具:Lima
-
对于MacOS用户来说,搭建Linux虚拟环境一直是件让人头疼的事。无论是VirtualBox还是商业的VMware,都显得过于笨重且配置复杂。今天,我们要介绍一个轻巧方便的纯命令行Linux虚拟工具...
- 所谓SaaS(所谓三维目标一般都应包括)
-
2010年前后,一个科技媒体的主编写一些关于云计算的概念性问题,就可以作为头版头条了。那时候的云计算,更多的还停留在一些概念性的问题上。而基于云计算而生的SaaS更是“养在深闺人未识”,一度成为被IT...
- ORA-00600 「25027」 「x」报错(报错0xc0000001)
-
问题现象:在用到LOB大对象的业务中,进行数据的插入,失败了,在报警文件中报错:ORA-00600:内部错误代码,参数:[25027],[10],[0],[],[],[],[],[...
- 安卓7源码编译(安卓源码编译环境lunch失败,uname命令找不到)
-
前面已经下载好源码了,接下来是下载手机对应的二进制驱动执行编译源码命令下载厂商驱动https://developers.google.com/android/drivers?hl=zh-cn搜索NGI...
- 编译安卓源码(编译安卓源码 电脑配置)
-
前面已经下载好源码了,接下来是下载手机对应的二进制驱动执行编译源码命令下载厂商驱动https://developers.google.com/android/drivers?hl=zh-cn搜索NGI...
- 360 Vulcan Team首战告捷 以17.5万美金强势领跑2019“天府杯“
-
2019年11月16日,由360集团、百度、腾讯、阿里巴巴、清华大学与中科院等多家企业和研究机构在成都联合主办了2019“天府杯”国际网络安全大赛暨2019天府国际网络安全高峰论坛。而开幕当日最激荡人...
- Syslog 日志分析与异常检测技巧(syslog发送日志配置)
-
系统日志包含有助于分析网络设备整体运行状况的重要信息。然而,理解并从中提取有效数据往往颇具挑战。本文将详解从基础命令行工具到专业日志管理软件的全流程分析技巧,助你高效挖掘Syslog日志价值。Gr...
- 从Oracle演进看数据库技术的发展(从oracle演进看数据库技术的发展的过程)
-
数据库技术发展本质上是应用需求驱动与基础架构演进的双向奔赴,如何分析其技术发展的脉络和方向?考虑到oracle数据库仍然是这个领域的王者,以其为例,管中窥豹,对其从Oracle8i到23ai版本的核...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- oracle位图索引 (74)
- oracle基目录 (50)
- oracle批量插入数据 (65)
- oracle事务隔离级别 (53)
- oracle主从同步 (55)
- oracle 乐观锁 (51)
- redis 命令 (78)
- php redis (88)
- redis 存储 (66)
- redis 锁 (69)
- 启动 redis (66)
- redis 时间 (56)
- redis 删除 (67)
- redis内存 (57)
- redis并发 (52)
- redis 主从 (69)
- redis 订阅 (51)
- redis 登录 (54)
- redis 面试 (58)
- 阿里 redis (59)
- redis 搭建 (53)
- redis的缓存 (55)
- lua redis (58)
- redis 连接池 (61)
- redis 限流 (51)