从我的shell脚本中,我使用kill命令杀死我的后台函数进程。此函数使用sqlplus调用SQL过程:
func_foo(){
retval=`sqlplus -s $USER_NAME/$PWD <<EOF
set pages 0 lines 120 trimout on trimspool on tab off echo off verify off feed off serverout on
exec pkg_xyz.proc_abc();
exit;
EOF`
}
func_foo&
pid_func_foo=$!
sleep 5
kill $pid_func_foo 2>/dev/null
wait $pid_func_foo 2>/dev/null
该方法的问题在于即使我的函数进程被终止,Oracle进程也会继续运行。 Oracle进程没有被杀死。我是oracle的新手,我不知道如何处理这种情况。请告诉我如何处理这种情况的提示。
答案 0 :(得分:2)
杀死Oracle进程是个坏主意。尝试以另一种方式解决您的问题。
使用dbms_scheduler将您的过程作为作业运行。您可以在需要时通过调用dbms_scheduler.stop_job('job name')来停止作业。
构建您的过程,以便以编程方式停止。我已经构建了一些运行很长时间的程序。每隔一段时间,该过程就会检查一个名为“Status”的表,该表只包含一行。如果状态为“ok”,则运行。如果我将行更改为其他内容,则过程会看到并停止。
答案 1 :(得分:0)
在交互式SQL * Plus会话中点击control-c
会终止正在运行的命令,生成信息性的ORA-01013消息,并让您离开SQL * Plus提示符 - Oracle进程仍处于活动状态但处于空闲状态(可能过于简单化)有点)。
您可以通过发送中断信号而不是默认终止信号来获得等效效果。根据您的操作系统和shell,这可能略有不同,但通常类似于:
kill -int $pid_func_foo 2>/dev/null
这仍应生成ORA-01013,sqlplus
进程将继续。但是,由于“here here”中的下一个语句是exit
,它仍然会停止并且会比终止信号更自然地执行,并且Oracle会话将正常清除,从而删除Oracle进程。 (如果您的程序正在进行任何插入或更新,则在事务回滚时可能仍会有延迟)。
我不确定这是管理执行时间限制的一种特别好的方法;工作控制或资源管理可能是更好的方法。