从bash中运行SQL命令

时间:2016-09-05 14:24:00

标签: sql oracle bash passwords sqlplus

有人可以举例说明如何从bash脚本中运行SQL查询。我已经搜索了Stack Overflow,但无法找到适合我的答案。我之前做过类似的事情,但对于psql而言,它看起来像这样:

psql -U userName -c "SELECT * FROM table;"

情况是这样的,当我在我的服务器上时,我必须编写这些行来从数据库中选择一些东西:

    su - oracle;
   //insert password for oracle user
    sqlplus /nolog;
    connect / as sysdba
    SELECT * FROM table;

这应该如何看待bash脚本?

谢谢!

3 个答案:

答案 0 :(得分:1)

您可以使用sqlplus将查询提供给echo的标准输入,例如:

echo "SELECT * FROM table;" | sqlplus -s user/password@host/DB

答案 1 :(得分:1)

有几种不同的方法可以做到这一点。每个人都有一个喜欢的,但他们都很相似,因为他们允许SQL命令在传递给sqlplus命令行shell之前被组合在一起。所有方法都能够捕获来自sqlplus的响应以写入日志文件,并且大多数方法都支持变量替换,尽管有些方法可能会违反参数扩展。

我个人总是喜欢以下方法,因为它允许我快速更改SQL语句并将语句的旧版本保留为注释。我知道这可以在其他示例中完成,但我只是个人更喜欢这种方法:

 #!/bin/bash

 exec > >(tee logs/logfile.$$)
 exec 2>&

   {
     echo "TRUNCATE TABLE test_runs;"
     echo "INSERT INTO test_runs SELECT * FROM test_cases WHERE id = 6;"
#      echo "SELECT * FROM table1 where x = 1;"
      echo "SELECT * FROM table1 where x = 2;"
#      echo "UPDATE table2 SET status=$STATUS WHERE complete=1;"
      echo "exit;"
   } | sqlplus <connect string>

其他方法使用&#39; here documents&#39;:

#!/bin/bash

sqlplus&lt;&lt; EOF     插入表(field1,field2,field3)值(&#39; a&#39;,&#39; b&#39;,&#39; c&#39;);     EOF

或使用单独文件中的SQL语句:

#!/bin/bash
sqlplus <connect string> @query.sql

或利用sqlplus的原生功能:

#!/bin/bash

sqlplus <connect string> -s 'SELECT parts FROM factory;' 
QUERY="SELECT parts FROM factory;"
sqlplus <connect string> -s $QUERY

警惕在最后一个版本中使用bash变量,以下内容可能无法提供您期望的结果:

#!/bin/bash
QUERY="select * from $TABLE1 WHERE url =\"Compu-Global-Hyper-Mega-Net.com\";"
sqlplus <connect string> -s $QUERY

编辑:

示例从shell脚本传递用户名和密码(安全问题,他们在流程表中可见,任何人都可以看到)

#!bin/bash

{
  echo "SELECT 1 from dual;"
} | sqlplus username/password@SID1

我的一个旧脚本,连接为sysdba:

#!/bin/ksh

get_asm() {
$ORACLE_HOME/bin/sqlplus -s /nolog <<EOF  
connect / as sysdba
col path format a35
col CREATE_DATE format a20
set lines 132
set trims on
set tab off
set pages 2000
select inst_id, DISK_NUMBER, header_status, 
       state,path,TOTAL_MB,FREE_MB,
       to_char(CREATE_DATE,'yyyy-mon-dd hh24:mi') CREATE_DATE 
from gv\$asm_disk;
EOF
}

ASMDISK=$1
if [ ${ASMDISK}"x" == "x" ]; then
    get_asm;
else
    get_asm | egrep "INST_ID|^--|${ASMDISK}"
fi

答案 2 :(得分:0)

! /斌/庆典

...
MY_LOGIN="..."
MY_PASSWORD="..."
MY_SID="..."
sqlplus /nolog -s >file.log >error.log <<EOF
    CONNECT ${MY_LOGIN}/${MY_PASSWORD}@${MY_SID}
    ... your request ...
EOF
RET_CODE=$?
...

警告,请勿使用以下语法:

sqlplus login/password@sid ...

有了它,任何可以使用“ps”命令的人都可以看到你的所有连接信息。始终使用“/ nolog”。