shell中调用sqlplus

本文介绍如何在Shell脚本中调用Oracle数据库执行SQL语句及存储过程,包括变量声明与赋值、执行SQL查询及插入语句等具体操作。
有时候需要在shell中 调用数据库操作。脚本框架如下:
 
sqlplus -s username/password@SID<<!
--此时已进入sqlplus环境了
--结尾叹号“!”表示sqlplus将会以“!”结束。
 
--变量声明
variable  v_start_time varchar2(20);
variable  v_user_id varchar2(10);
 
--shell参数可以直接使用
select $1 into : v_user_id from dual;
 
 v_user_id:='10000010'
 
--sql语句执行 注意不要丢掉变量之前的 冒号
execute  select to_char(sysdate,'yyyymmddhh24mmss') into :v_start_time from dual;
 
--此句不需要 冒号
print v_start_time;
 
insert into tablename
(user_id)
values
(:v_user_id);
 
 
--执行存储过程
exec procedurename_p(:arguments);
 
 
 
#结束,退出shell
exit

 
Shell 中执行 SQL*Plus 是可以返回查询结果的,但需要合理配置 SQL*Plus 的输出格式以确保结果清晰、无多余信息。SQL*Plus 默认会在执行过程中输出提示信息(如 `Connected to:`、`SQL>` 等),这些信息可以通过设置参数进行控制,从而实现仅输出所需的查询结果。 ### 输出控制与格式优化 为了在 Shell 脚本中获取干净的查询结果,建议在 SQL*Plus 脚本中使用如下设置: ```sql SET ECHO OFF SET FEEDBACK OFF SET VERIFY OFF SET HEADING OFF SET PAGESIZE 0 SET LINESIZE 1000 SET TRIMSPOOL ON SET TERMOUT OFF ``` 上述设置的作用如下: - `ECHO OFF`:不显示脚本中的命令。 - `FEEDBACK OFF`:不显示查询后返回的行数提示。 - `HEADING OFF`:不显示列名。 - `PAGESIZE 0`:去除所有分页信息和标题。 - `LINESIZE` 设置为合适值以适应一行数据宽度。 - `TRIMSPOOL ON`:去除 spool 文件中每行末尾的空白字符。 - `TERMOUT OFF`:不在终端输出内容,适用于只写入文件的情况[^2]。 例如,在 Shell 脚本调用 SQL*Plus 并将结果保存到变量中: ```bash result=$(sqlplus -S user/password@db <<EOF SET PAGESIZE 0 FEEDBACK OFF VERIFY OFF SELECT ename FROM emp WHERE empno = 7369; EXIT; EOF ) echo "$result" ``` 该方式可确保 `result` 变量中仅包含查询结果,而不会混杂其他 SQL*Plus 提示信息。 ### 获取存储过程执行结果 除了查询语句外,SQL*Plus 还支持通过绑定变量获取存储过程的输出参数。例如,定义一个存储过程 `myproc(in_num IN NUMBER, out_num OUT NUMBER)`,可以在 SQL*Plus 中这样调用并获取结果: ```sql VAR v_out NUMBER BEGIN myproc(5, :v_out); END; / PRINT v_out ``` 在 Shell 脚本调用此逻辑,并捕获输出值: ```bash result=$(sqlplus -S user/password@db <<EOF VAR v_out NUMBER BEGIN myproc(5, :v_out); END; / PRINT v_out EXIT; EOF ) echo "$result" ``` 此时 `result` 将包含 `v_out` 的输出值,可用于后续判断或处理[^1]。 ### 处理多行输出与换行问题 在实际使用中,可能会遇到 SQL*Plus 输出带有额外空行的问题。这通常是由默认的 `PAGESIZE` 和 `HEADING` 设置引起的。为了避免此类问题,应设置 `PAGESIZE 0` 并关闭 `HEADING`,同时启用 `TRIMSPOOL ON` 来清理多余的空白字符[^4]。 此外,在 Shell 脚本中处理多行结果时,可以使用 `grep` 或 `awk` 对输出进行进一步清洗,例如过滤掉 SQL*Plus 的提示信息: ```bash result=$(sqlplus -S user/password@db @query.sql | grep -v '^SQL>' | grep -v '^PL/SQL>') ``` 该命令将剔除所有以 `SQL>` 或 `PL/SQL>` 开头的提示行,保留真正的查询结果。 ### 总结 Shell 中执行 SQL*Plus 不仅可以输出查询结果,还可以通过适当的参数配置实现对输出格式的精确控制。结合 Shell 脚本的文本处理能力,能够有效提取和利用 SQL*Plus 返回的数据,满足自动化运维、报表生成等场景需求。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员柒叔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值