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

相关推荐
TlYf NTLE1 分钟前
PostgreSQL的备份方式
数据库·postgresql
好家伙VCC8 分钟前
# MAUI 中的异步加载优化实战:从理论到高性能 UI 体验提升在现代跨平台移动开发中,*
java·python·ui
IMPYLH12 分钟前
Linux 的 link 命令
linux·运维·服务器·bash
Full Stack Developme13 分钟前
Java 弱引用与强引用
java·开发语言
1104.北光c°16 分钟前
【重写优化 新增绘图】布谷鸟过滤器:布隆过滤器的更优缓存穿透解?
java·开发语言·后端·缓存·缓存穿透·布隆过滤器·布谷鸟过滤器
萧逸才17 分钟前
【learn-claude-code】S06ContextCompact - 上下文压缩:上下文会满,你需要腾出空间
java·人工智能·ai
Carino_U18 分钟前
MySQL事务隔离机制&锁机制&MVCC详解
数据库·mysql
橙露21 分钟前
CentOS 服务器安全加固:防火墙、端口、权限配置
服务器·安全·centos
m0_6948455721 分钟前
RevelGo搭建教程:类Rails开发体验的Go Web框架
服务器·开发语言·后端·docker·golang·开源·github
yhole22 分钟前
redis连接服务
数据库·redis·bootstrap