有人可以举例说明如何从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脚本?
谢谢!
答案 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”。