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 执行的时候阻塞,直到被手工处理以后,才能进入到下一次循环。

相关推荐
专注echarts研发20年11 分钟前
工业级 Qt 业务窗体标杆实现・ResearchForm 类深度解析
数据库·qt·系统架构
南知意-1 小时前
IDEA 2025.3 版本安装指南(完整图文教程)
java·intellij-idea·开发工具·idea安装
北邮刘老师1 小时前
A3C Network:智能体互联网的层次化视图
运维·服务器·网络
XRJ040618xrj1 小时前
如何在Linux中根据物理网卡建立虚拟网卡
linux·服务器·网络
空中楼阁,梦幻泡影2 小时前
LoRA 详细解析,使用LoRA 方式对模型进行微调详细操作指南
运维·服务器·人工智能·机器学习·语言模型
码农水水2 小时前
蚂蚁Java面试被问:混沌工程在分布式系统中的应用
java·linux·开发语言·面试·职场和发展·php
海边的Kurisu2 小时前
苍穹外卖日记 | Day4 套餐模块
java·苍穹外卖
晚风吹长发2 小时前
初步了解Linux中的动静态库及其制作和使用
linux·运维·服务器·数据结构·c++·后端·算法
Le_ee2 小时前
dc4打靶报告
运维·服务器·网络
毕设源码-邱学长2 小时前
【开题答辩全过程】以 走失儿童寻找平台为例,包含答辩的问题和答案
java