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


    注意 :

    v\\\$  用法, “v\\\$session ”   ""不能用 

    1. sqlplus -S / as sysdba << EOF
    2. set pagesize 0
    3. set verify off
    4. set feedback off
    5. set echo off
    6. col coun new_value v_coun
    7. select count(*) coun from dual;
    8. EOF
    9. value="$?"
    10. VALUE=`sqlplus -s / as sysdba <<EOF
    11. set pagesize 0 feedback off verify off heading off echo off numwidth 5
    12. select count(*) from v\\\$session;
    13. exit;
    14. EOF`
    15. if [ "$VALUE" -gt 0 ]
    16. then
    17. echo "The number of rows is $VALUE."
    18. else
    19. echo "There is no row in the table."
    20. fi
    21. if [ $value == 0 ];
    22. then
    23. echo "222222222"
    24. else
    25. echo "1111111111"
    26. fi

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

    1. 1. 命令行直接输入方式
    2. 这种方式就是把要执行的命令直接传给sqlplus,-S是指silent模式。注意此处的反斜杠转义。
    3. sqlplus -S '/ as sysdba' << EOF
    4. set pagesize 0 feedback off verify off heading off echo off
    5. SELECT value FROM v\$parameter WHERE name = 'background_dump_dest';
    6. exit
    7. EOF
    8. 使用脚本的话,如下所示,注意反斜杠。
    9. if test $# -lt 1
    10. then
    11. echo You must pass a SID
    12. exit
    13. fi
    14. ORACLE_SID=$1; export ORACLE_SID
    15. DUMP_DIR=`sqlplus -S '/ as sysdba' << EOF
    16. set pagesize 0 feedback off verify off heading off echo off
    17. SELECT value FROM v\\$parameter WHERE name = 'background_dump_dest';
    18. exit
    19. EOF`
    20. echo ${DUMP_DIR}
    21. 2. 通过文件输入方式
    22. 这种方式是先把sql语句存储在一个文件中,这时就不需要反斜杠了,而且输入文件必须要以.sql为后缀。
    23. [oracle@node ~]$ cat /tmp/sqllines.sql
    24. set pagesize 0 feedback off verify off heading off echo off
    25. SELECT value FROM v$parameter WHERE name = 'background_dump_dest';
    26. exit
    27. [oracle@node ~]$ sqlplus -s "/ as sysdba" @/tmp/sqllines
    28. /u01/app/oracle/diag/rdbms/live/live/trace
    29. 这种方式同样可以写成一个shell脚本。
    30. [oracle@node ~]$ cat /tmp/sql
    31. if test $# -lt 1
    32. then
    33. echo You must pass a SID
    34. exit
    35. fi
    36. ORACLE_SID=$1; export ORACLE_SID
    37. echo "
    38. set pagesize 0 feedback off verify off heading off echo off
    39. SELECT value FROM v\$parameter WHERE name = 'background_dump_dest';
    40. exit
    41. ">/tmp/plsql_scr.sql
    42. # --------------------------------
    43. # Execute plsql script
    44. # --------------------------------
    45. if [ -s /tmp/plsql_scr.sql ]; then
    46. echo -e "Running SQL script to find out bdump directory... \n"
    47. $ORACLE_HOME/bin/sqlplus -s "/ as sysdba" @/tmp/plsql_scr.sql >/tmp/plsql_scr_result.log
    48. fi
    49. echo " Check the reslut "
    50. echo "------------------------"
    51. cat /tmp/plsql_scr_result.log
    52. exit

    1. sqlplus -s  / as sysdba <<eof
    2. @test.sql
    3. EOF
    4. 第二个EOF前面有没有exit效果都一样。 也就是说缺省就是exit
    5. test.sql里最后加不加commit效果都一样,exit缺省的时候就是提交(这个可以控制)
    6. test.sql 名字如果是带空格t est.sql,怎么办?
    7. (下面是好多sql文件进行遍历)
    8. 1
    9. cat database.sh
    10. ls *sql | while read line;do
    11. sqlplus -s / as sydsba <<eof
    12. @"$line"
    13. EOF
    14. 2
    15. cat database.sh
    16. for line in `ls *sql` ;do
    17. sqlplus -s / as sydsba <<eof
    18. @"$line"
    19. EOF
    20. done
    21. 用while循环,而不用for in 是因为如果文件名有空格,ls *sql出来以后,line取值是按照空格或者换行符作为间隔符号,
    22. 所以一个文件名会被空格分成为2个值使用;而用while read 则是只按照换行符作为间隔符号,所以一个文件名不会被分割。这就是这两种方式的区别。
    23. 下面的sqlplus 下面执行@"line",变量line需要加双引号,防止文件名被空格分割解析
    24. sqlplus 的两种方式对比对比:
    25. 1
    26. #cat test.sql
    27. insert into test values(sysdate);
    28. commit;
    29. #cat database.sh
    30. ls *sql | while read line;do
    31. sqlplus -s / as sydsba <<eof
    32. @"$line"
    33. EOF
    34. 上面的exit退出动作是由EOF完成的
    35. 2
    36. #cat test.sql
    37. insert into test values(sysdate);
    38. commit;
    39. exit;
    40. #cat database.sh
    41. ls *sql | while read line;do
    42. sqlplus -s / as sydsba @"$line"

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

     

    1. 如果当前服务器安装的有oracle数据库,配置环境变量后可以直接使用sqlplus,如果没有则需要安装客户端和sqlplus包。shell脚本中通过sqlplus -S dbuser/dbpass@host/dbname连接上数据库后,一般所做的操作就是在脚本中下载表中的数据到本地或者是在脚本中调用oracle存储过程,再通过crontab启动定时任务调用shell脚本去跑数据,下文将详细介绍这两种的使用方法:
    2. sqlplus常用参数设置
    3. set feedback off; --回显本次sql命令处理的记录条数,缺省为on
    4. set verify off; --是否显示替代变量被替代前后的语句
    5. set heading off; --是否显示字段的名称
    6. set echo off; --显示sqlplus中的每个sql命令本身,缺省为on
    7. set pagesize 0; --输出每页行数,缺省为24(每24行产生一个空行),为了避免分页,设定为0
    8. set linesize 200; --可以设置的大点,防止一行长度不够
    9. set trimspool on; --去除重定向(spool)输出每行的拖尾空格,缺省为off
    10. set colsep ','; --设置分隔符为逗号,这样csv文件里才不会冗余到一个单元格里
    11. spool用法
    12. spool是sqlplus中用来保存或打印查询结果,主要把sql查询结果保存到本地文件中,
    13. 格式为:spool 文件路径 参数(参数可省略,不添加参数默认为replace)
    14. 参数为:
    15. create: 创建指定文件名的新文件;如指定文件存在,则报文件存在错误
    16. replace:如果指定文件存在则覆盖替换;不存在,则创建,replace为spool默认选项
    17. append:向指定文件名中追加内容;如指定文件不存在,则创建
    18. 用法:
    19. spool /opt/proc_log/table_name.csv append
    20. sql查询脚本
    21. spool off
    22. shell脚本连接sqlplus,导出数据库里的数据到本地
    23. 举例导出文件为csv文件,其它文件一样
    24. 方法一:设置分隔符set colsep ',',表字段之间以逗号为分隔符
    25. #!/bin/bash
    26. source ~/.bash_profile
    27. #设置ORACLE的相关环境,如果在bash_profile已经添加了环境变量,不需要再添加以下两行
    28. export ORACLE_HOME=/安装路径下的/oracle/product/11.2.0/db_1
    29. export PATH=$PATH:$ORACLE_HOME/bin
    30. dbuser=appuser
    31. dbpass=$(echo "VGVzdDIwMjJfcHcK"|base64 -d)
    32. dbinfo=192.168.23.01/orcl
    33. #定义变量存放返回信息,避免回显
    34. msg=`
    35. #通过sqlplus连接数据库
    36. sqlplus -S $dbuser/$dbpass@$dbinfo << eof
    37. #设置分隔符
    38. set colsep ',';
    39. set pagesize 0;
    40. set trimspool on;
    41. set linesize 200;
    42. set feedback off;
    43. set verify off;
    44. set heading on;
    45. set echo off;
    46. #打印数据到csv文件
    47. spool /opt/proc_log/table_name.csv
    48. #spool无法打印字段名,特添加此操作在文件中增加字段名称
    49. select 'TABLE_ID'||','||
    50. 'TABLE_NAME'||','||
    51. 'TMP_TABLE_NAME'||','||
    52. 'LOAD_MODE'||','||
    53. 'EFFECTIVE_DATE'||','||
    54. 'EXPIRY_DATE'||','||
    55. 'MD5_TABLE_NAME'
    56. from dual;
    57. #查询sql
    58. select * from Table_List;
    59. #关闭打印
    60. spool off
    61. #退出
    62. exit;
    63. eof
    64. `
    65. exit 0
    66. 方法二:采用拼接手工控制输出格式,可以对各种字段进行预处理,常使用该方法
    67. #!/bin/bash
    68. source ~/.bash_profile
    69. #设置ORACLE的相关环境,如果在bash_profile已经添加了环境变量,不需要再添加以下两行
    70. export ORACLE_HOME=/安装路径下的/oracle/product/11.2.0/db_1
    71. export PATH=$PATH:$ORACLE_HOME/bin
    72. dbuser=appuser
    73. dbpass=$(echo "VGVzdDIwMjJfcHcK"|base64 -d)
    74. dbinfo=192.168.23.01/orcl
    75. msg=`
    76. sqlplus -S $dbuser/$dbpass@$dbinfo << eof
    77. set pagesize 0;
    78. set trimspool on;
    79. set linesize 200;
    80. set feedback off;
    81. set verify off;
    82. set heading on;
    83. set echo off;
    84. spool /opt/proc_log/table_name.csv
    85. select 'TABLE_ID'||','||
    86. 'TABLE_NAME'||','||
    87. 'TMP_TABLE_NAME'||','||
    88. 'LOAD_MODE'||','||
    89. 'EFFECTIVE_DATE'||','||
    90. 'EXPIRY_DATE'||','||
    91. 'MD5_TABLE_NAME'
    92. from dual;
    93. select TABLE_ID||','||
    94. TABLE_NAME||','||
    95. TMP_TABLE_NAME||','||
    96. LOAD_MODE||','||
    97. EFFECTIVE_DATE||','||
    98. EXPIRY_DATE||','||
    99. MD5_TABLE_NAME
    100. from Table_List;
    101. spool off
    102. exit;
    103. eof
    104. `
    105. exit 0
    106. shell脚本连接sqlplus,调用存储过程抓取返回值
    107. #!/bin/bash
    108. source ~/.bash_profile
    109. #设置ORACLE的相关环境,如果在bash_profile已经添加了环境变量,不需要再添加以下两行
    110. export ORACLE_HOME=/安装路径下的/oracle/product/11.2.0/db_1
    111. export PATH=$PATH:$ORACLE_HOME/bin
    112. dayno=date +%Y-%m-%d
    113. dbuser=appuser
    114. dbpass=$(echo "VGVzdDIwMjJfcHcK"|base64 -d)
    115. dbinfo=192.168.23.01/orcl
    116. msg=`
    117. sqlplus -S $dbuser/$dbpass@$dbinfo <<eof
    118. set feedback off;
    119. set verify off;
    120. set heading off;
    121. set echo off;
    122. #定义存储过程返回值
    123. var vo_code number;
    124. #定义存储过程返回信息
    125. var vo_msg varchar2(400);
    126. #调用存储过程,使用变量获取返回信息
    127. call procname($dayno, :vo_code, :vo_msg);
    128. #返回存储过程代码给msg
    129. select :vo_code from dual;
    130. exit;
    131. eof
    132. `
    133. echo ${msg}
    134. exit 0

     

  • 相关阅读:
    Taro:微信小程序通过获取手机号实现一键登录
    3.Mybatis 注解方式的基本用法
    linux通用时钟框架(CCF)
    强化学习输入数据归一化(标准化)
    R语言使用names函数为dataframe数据中的所有列重命名
    直播倒计时 1 天|SOFAChannel#35《SOFABoot 4.0 — 迈向 JDK 17 新时代》
    Linux【基本指令】
    论文日记四:Transformer(论文解读+NLP、CV项目实战)
    网页自适应
    敏捷是怎么提高工作效率的
  • 原文地址:https://blog.csdn.net/jnrjian/article/details/132769197