我正在尝试通过 Oracle 11g 中的 PL/SQL 调用外部程序。 This是共享库的 C 代码,this是它相应的 PL/SQL 包装器。
假设我想执行 Unix 的 ps -A
命令。这是我得到的:
Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.1.0
Connected as sys@orcl AS SYSDBA
SQL> set serveroutput on;
SQL> exec osutil.RunOsCmd('ps -A');
ERROR, bad command or no output returned...
ERROR, bad command or no output returned...
PL/SQL procedure successfully completed
我觉得奇怪的是,我应该exec osutil.RunOsCmd('echo This Works, but ps does not?!?');
相反,它给了我命令的输出,就像它应该的那样:
This works, but ps does not?!?
PL/SQL procedure successfully completed
让我们尝试回显 $ORACLE_HOME...
SQL> exec osutil.RunOsCmd('echo $ORACLE_HOME');
/home/oracle/app/oracle/product/11.2.0/dbhome_1
PL/SQL procedure successfully completed
现在让我们尝试回显 $PATH...
SQL> exec osutil.RunOsCmd('echo $PATH');
PL/SQL procedure successfully completed
在我看来,该库的 popen
命令在通过 Oracle 的 extproc
执行时会调用一个 sh
shell,其 $ 中没有任何内容路径。
知道为什么会发生这种情况吗?我想从 Oracle 执行 ps -A
而不指定命令的完整路径,即 /bin/ps -A
。
最佳答案
我通过将以下行添加到我的 extproc.ora
文件中解决了我的问题,在我的例子中,该文件位于 /home/oracle/app/oracle/product 下/11.2.0/dbhome_1/hs/admin
:
SET PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin
看来Oracle 11g的extproc
确实取消了PATH
环境变量的设置;事实上,extproc
似乎有自己的环境,只能通过上面提到的 extproc.ora
文件进行配置。
关于c - 甲骨文11g : osutil package; no PATH on CentOS 7?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53641312/