您当然可以从 SQLPlus 脚本调用 HOST 命令,但我想您真的在问您是否可以在其余的 SQLPlus 脚本中使用您的 linux 函数的返回值。而且您可能还想在您的 linux 函数中使用 SQL 查询的结果。
如果您不需要需要将 SQL 信息传递给您的 linux 函数,并且 不需要需要在 SQL 的其余部分中访问 linux 函数的结果,那么你所拥有的几乎可以工作。这会
date
sqlplus / << xxENDxx \
@file.sql
HOST mylinuxfunction...
@file2.sql
HOST anotherlinuxfunction..
exit
xxENDxx
date
现在如果你想从你的 linux 函数中获取信息到 SQL 中,你将不得不使用外部表;很多设置,但请看这里:https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:439619916584 并搜索“但这是另一种有趣的方法,在 10.2.0.5 及更高版本中可用:”
如果您想将在调用 SQLPlus 之前完成的 Linux 命令中的信息传递到您的 SQL 命令中,这将是这样的,即在 uptimes 表中插入一行,其中包含存储在BASH 变量$UPTIMES:
#!/bin/bash
if [ "$1" = "" ]
then
echo Missing User ID parm
exit 1
else
USER_ID=$1
fi
read -p "Enter Your password for Oracle instance $ORACLE_SID for user $USER_ID: " PW
UPTIMES=`uptime | awk -F, '{print $3, $4, $5}' | awk '{printf "%2.2f,%2.2f,%2.2f\n", $3, $4, $5}'`
sqlplus /nolog << xxENDxx \
connect $USER_ID/$PW
insert into uptimes (date_stamp, one_min, five_min, fifteen_min) values (sysdate, $UPTIMES);
HOST ls -o uptimes.sh
--@file2.sql
select * from uptimes;
HOST du -sh .
exit
xxENDxx
date
调用上面给出的结果是:
oracle. (/home/oracle/sql)
Linux> ./uptimes.sh mark.stewart
Enter Your password for Oracle instance ecs03 for user mark.stewart: xxxx
SQL*Plus: Release 12.1.0.2.0 Production on Thu Mar 17 20:09:36 2016
Dev:@> Connected.
Dev:MARK.STEWART@ecs03> Dev:MARK.STEWART@ecs03>
1 row created.
Dev:MARK.STEWART@ecs03> -rwxr-xr-x. 1 oracle 548 Mar 17 20:09 uptimes.sh
Dev:MARK.STEWART@ecs03> Dev:MARK.STEWART@ecs03>
DATE_STAM ONE_MIN FIVE_MIN FIFTEEN_MIN
--------- ---------- ---------- -----------
17-MAR-16 0 .01 .05
17-MAR-16 0 .01 .05
17-MAR-16 0 .01 .05
Dev:MARK.STEWART@ecs03> 146M .
Dev:MARK.STEWART@ecs03> Disconnected from Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options
Thu Mar 17 20:09:36 CET 2016
oracle. (/home/oracle/sql)
Linux>