shell SQL 变量 Oracle shell调用SQL操作DB

注意 :

v\\\ 用法, "v\\\\\\session " ""不能用

复制代码
sqlplus -S  / as sysdba << EOF
set pagesize 0
set verify off
set feedback off
set echo off
col coun new_value v_coun
select count(*) coun from dual;
EOF
value="$?"
 





VALUE=`sqlplus -s / as sysdba <<EOF
        set pagesize 0 feedback off verify off heading off echo off numwidth 5
        select count(*)    from v\\\$session;
        exit;
EOF`


if [ "$VALUE" -gt 0 ]
then
        echo "The number of rows is $VALUE."
 else
        echo "There is no row in the table."
fi
if [ $value == 0 ];
then
echo  "222222222"
else
echo "1111111111"
fi

Oracle shell调用SQL操作DB

操作Oracle数据库可以使用sqlplus连接数据库之后,再交互式的使用数据库。另一种非交互的方式就是通过shell直接执行sql命令,可以直接在shell CLI端口执行命令,或者是通过shell脚本的方式。从sql命令的输入方式上,这种非交互的方式又可以分为两种,一种是命令行直接输入,另一种是sql文件输入。

复制代码
1. 命令行直接输入方式

这种方式就是把要执行的命令直接传给sqlplus,-S是指silent模式。注意此处的反斜杠转义。
sqlplus -S '/ as sysdba' << EOF
set pagesize 0 feedback off verify off heading off echo off
SELECT value FROM v\$parameter WHERE name = 'background_dump_dest';
exit
EOF
使用脚本的话,如下所示,注意反斜杠。
if test $# -lt 1
        then
 echo You must pass a SID
        exit
fi
  
ORACLE_SID=$1; export ORACLE_SID
DUMP_DIR=`sqlplus -S '/ as sysdba' << EOF
set pagesize 0 feedback off verify off heading off echo off
SELECT value FROM v\\$parameter WHERE name = 'background_dump_dest';
exit
EOF`

echo ${DUMP_DIR}

2. 通过文件输入方式

这种方式是先把sql语句存储在一个文件中,这时就不需要反斜杠了,而且输入文件必须要以.sql为后缀。
[oracle@node ~]$ cat /tmp/sqllines.sql
set pagesize 0 feedback off verify off heading off echo off
SELECT value FROM v$parameter WHERE name = 'background_dump_dest';
exit

[oracle@node ~]$ sqlplus -s "/ as sysdba" @/tmp/sqllines
/u01/app/oracle/diag/rdbms/live/live/trace
这种方式同样可以写成一个shell脚本。
[oracle@node ~]$ cat /tmp/sql
if test $# -lt 1
        then
 echo You must pass a SID
        exit
fi

ORACLE_SID=$1; export ORACLE_SID
echo "
set pagesize 0 feedback off verify off heading off echo off
SELECT value FROM v\$parameter WHERE name = 'background_dump_dest';
exit
">/tmp/plsql_scr.sql

# --------------------------------
# Execute plsql script
# --------------------------------

if [ -s /tmp/plsql_scr.sql ]; then
    echo -e "Running SQL script to find out bdump directory... \n"
    $ORACLE_HOME/bin/sqlplus -s "/ as sysdba" @/tmp/plsql_scr.sql >/tmp/plsql_scr_result.log
fi

echo " Check the reslut "
echo "------------------------"
cat /tmp/plsql_scr_result.log

exit


sqlplus -s  / as sysdba <<eof
@test.sql
EOF

第二个EOF前面有没有exit效果都一样。 也就是说缺省就是exit
test.sql里最后加不加commit效果都一样,exit缺省的时候就是提交(这个可以控制)

test.sql 名字如果是带空格t est.sql,怎么办?
(下面是好多sql文件进行遍历)
【1】
cat database.sh
ls *sql | while read line;do
sqlplus -s / as sydsba <<eof
@"$line"
EOF




【2】
cat database.sh
for line in `ls *sql` ;do
sqlplus -s / as sydsba <<eof
@"$line"
EOF
done


用while循环,而不用for in 是因为如果文件名有空格,ls *sql出来以后,line取值是按照空格或者换行符作为间隔符号,
所以一个文件名会被空格分成为2个值使用;而用while read 则是只按照换行符作为间隔符号,所以一个文件名不会被分割。这就是这两种方式的区别。




下面的sqlplus 下面执行@"line",变量line需要加双引号,防止文件名被空格分割解析



sqlplus 的两种方式对比对比:
【1】
#cat test.sql
insert into test values(sysdate);
commit;


#cat database.sh
ls *sql | while read line;do
sqlplus -s / as sydsba <<eof
@"$line"
EOF

上面的exit退出动作是由EOF完成的


【2】
#cat test.sql
insert into test values(sysdate);
commit;
exit;


#cat database.sh
ls *sql | while read line;do
sqlplus -s / as sydsba @"$line"

上面的exit退出动作,只能在test.sql中完成。

在这种情况下如果不在test.sql中加exit,那么循环会在第一次sqlplus 执行的时候阻塞,直到被手工处理以后,才能进入到下一次循环。

相关推荐
Brilliantwxx4 分钟前
【Linux】 自主shell编写巩固复习篇
linux·运维·服务器·开发语言
十年Java程序媛9 分钟前
Java 多线程基础与锁机制详解|进程线程、锁升级、synchronized 与 Lock 对比
java·开发语言·spring boot
弯_弯9 分钟前
FDE 的工程能力画像:数据接入、PoC 与可复用资产的落地口径
java·服务器·开发语言
anew___16 分钟前
《从零手写操作系统 (49):虚拟内存进阶——Demand Paging、Swap与缺页异常处理》
linux·服务器·php
weixin_3823952335 分钟前
0-500 人工厂的生产 PMC 系统怎么做?基于 Tauri + SQLite 的性能架构实践与 5000 物料压测实录
数据库·架构·sqlite
Android系统攻城狮1 小时前
Linux Gstreamer深度解析之gst_audio_ring_buffer_parse_caps调用流程与实战(八十)
linux·运维·服务器·gstreamer音视频·音视频进阶
l1t1 小时前
DeepSeek总结的 DuckDB 2.0 文档新内容
服务器·网络·数据库
IvorySQL1 小时前
PostgreSQL 日报| PG19 主备切换挂起修复(10 月 17 日)
数据库·postgresql
云和数据.ChenGuang1 小时前
print(f“a+b=“,result) print(f“a+b={result}“)区别
java·前端·人工智能·python·深度学习
roman_日积跬步-终至千里1 小时前
【数据Agent论文·查询与语义|11】EntSQL:给了业务文档,模型为何还是写不对SQL?
数据库·人工智能·sql·数据分析