我有一些我正在尝试自动化的 SQL 脚本。过去我使用过 SQL*Plus,并从 bash 脚本手动调用 sqlplus 二进制文件。
但是,我试图弄清楚是否有办法连接到数据库,并从 bash 脚本内部调用脚本......这样我就可以插入date
并让查询相对于特定天数运行过去。
我有点困惑。您应该能够从 bash 脚本中调用 sqlplus。这可能是您对第一个语句所做的事情
尝试在 bash 脚本中执行以下命令:
#!/bin/bash
echo Start Executing SQL commands
sqlplus <user>/<password> @file-with-sql-1.sql
sqlplus <user>/<password> @file-with-sql-2.sql
如果您希望能够将数据传递到脚本中,您可以通过 SQLPlus 通过将参数传递到脚本中来实现:
file-with-sql-1.sql 的内容
select * from users where username='&1';
然后改bash脚本调用sqlplus传入值
#!/bin/bash
MY_USER=bob
sqlplus <user>/<password> @file-with-sql-1.sql $MY_USER
你也可以使用“这里的文档”来做同样的事情:
VARIABLE=SOMEVALUE
sqlplus connectioninfo << HERE
start file1.sql
start file2.sql $VARIABLE
quit
HERE
也许您可以将 SQL 查询通过管道传输到 sqlplus。它适用于mysql:
echo "SELECT * FROM table" | mysql --user=username database
这是在 bash shell 中运行 MySQL 查询的简单方法
mysql -u [database_username] -p [database_password] -D [database_name] -e "SELECT * FROM [table_name]"
如果您不想sqlplus
在服务器/机器上安装,那么以下命令行工具可以成为您的朋友。它是一个简单的 Java 应用程序,只需要 Java 8 即可执行此工具。
该工具可用于从 Linux bash 或 Windows 命令行运行任何 SQL。
例子:
java -jar sql-runner-0.2.0-with-dependencies.jar \
-j jdbc:oracle:thin:@//oracle-db:1521/ORCLPDB1.localdomain \
-U "SYS as SYSDBA" \
-P Oradoc_db1 \
"select 1 from dual"
文档在这里。
您可以从这里下载二进制文件。
我在 Sourceforge 上使用了 jdbcsql 项目。
在 *nix 系统上,这将创建一个 csv 的结果流到标准输出:
java -Djava.security.egd=file///dev/urandom -jar jdbcsql.jar -d oracledb_SID -h $host -p 1521 -U some_username -m oracle -P "$PW" -f excel -s "," "$1"
请注意,添加-Djava.security.egd=file///dev/urandom
大大提高了性能
Windows 命令类似:见http://jdbcsql.sourceforge.net/
由于 Bash 没有内置的 sql 数据库连接......您将需要使用某种第三方工具。