在Linux或Unix环境下,通过shell脚本调用Oracle的SQL语句操作数据库,是数据库自动化运维和批量数据处理的常用手段,核心依赖Oracle自带的sqlplus命令行工具实现交互。

环境准备
首先要确保当前shell环境可以正常访问Oracle客户端工具,需要满足两个基础条件:一是系统已经安装Oracle客户端或者完整的Oracle数据库软件,二是环境变量配置正确,尤其是ORACLE_HOME、PATH两个变量需要指向sqlplus所在的目录。可以通过以下命令验证环境是否正常:
# 验证sqlplus是否可用 which sqlplus # 如果输出类似 /u01/app/oracle/product/19.3.0/dbhome_1/bin/sqlplus 则说明环境正常
基础调用语法
shell中调用sqlplus执行SQL的核心语法有两种,一种是直接拼接SQL语句执行,另一种是通过文件传入SQL脚本执行。
直接执行单条或多条SQL
使用-S参数可以开启静默模式,减少不必要的输出信息,适合脚本场景使用,语法格式如下:
sqlplus -S 用户名/密码@数据库连接串 << EOF SQL语句1; SQL语句2; exit; EOF
下面是一个查询用户表的示例:
# 查询scott用户下的所有表名 sqlplus -S scott/tiger@orcl << EOF select table_name from user_tables; exit; EOF
执行SQL脚本文件
如果有复杂的SQL逻辑,可以把SQL语句写在单独的文件中,通过@符号调用脚本:
# 假设sql脚本路径为 /home/oracle/scripts/query.sql sqlplus -S scott/tiger@orcl @/home/oracle/scripts/query.sql
对应的query.sql文件内容示例:
-- 查询员工表中工资大于3000的员工信息 select empno, ename, sal from emp where sal > 3000; exit;
常见操作场景示例
数据更新操作
执行update、insert、delete等写操作时,需要注意提交事务,否则修改不会生效:
sqlplus -S scott/tiger@orcl << EOF update emp set sal = sal + 500 where deptno = 10; commit; exit; EOF
结果输出到文件
可以把SQL执行结果重定向到文件,方便后续处理:
sqlplus -S scott/tiger@orcl << EOF > /home/oracle/logs/query_result.txt set pagesize 0; set feedback off; set heading off; select empno, ename, sal from emp where sal > 3000; exit; EOF
其中set pagesize 0关闭分页,set feedback off关闭执行反馈信息,set heading off关闭表头输出,让结果更干净。
注意事项
- 数据库连接串如果是本地实例,可以直接写实例名,如果是远程连接,需要写
ip:端口/服务名的格式,比如192.168.0.1:1521/orcl - 密码包含特殊字符时,需要用双引号包裹密码,比如
sqlplus -S "scott/\"tiger#123\"@orcl" - 脚本中执行SQL后建议加上
exit语句,避免sqlplus进程挂起占用资源 - 如果需要捕获SQL执行的错误,可以在sqlplus中加入
whenever sqlerror exit sql.sqlcode语句,让SQL出错时直接退出并返回错误码
通过以上方法,就可以在shell脚本中灵活调用Oracle SQL完成各类数据库操作,适配自动化运维、批量数据处理等多种场景。