1

从我的 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 新手,我不确定如何处理这种情况。请向我提供有关如何处理这种情况的提示。

4

2 回答 2

2

杀死 Oracle 进程是个坏主意。尝试以另一种方式解决您的问题。

  1. 使用 dbms_scheduler 将您的过程作为作业运行。您可以在需要时通过调用 dbms_scheduler.stop_job('job name') 简单地停止作业。

  2. 构建您的过程,以便它可以以编程方式停止。我已经建立了几个运行很长时间的程序。该过程不时地检查一个名为“Status”的表,该表仅包含一行。如果状态为“ok”,则继续运行。如果我将行更改为其他内容,则程序会看到这一点并停止。

于 2013-01-20T07:36:38.270 回答
0

在交互式control-cSQL*Plus 会话中点击会终止正在运行的命令,生成一条信息性 ORA-01013 消息,并将您留在 SQL*Plus 提示符处——Oracle 进程仍然处于活动状态但处于空闲状态(可能有些过于简单化了)。

您可以通过发送中断信号而不是默认终止信号来获得等效的效果。这可能会根据您的操作系统和 shell 略有不同,但通常类似于:

kill -int $pid_func_foo 2>/dev/null

这仍应生成 ORA-01013,并且该sqlplus过程将继续。但是,正如您的“此处文档”中的下一条语句一样,exit它仍然会停止并且会比终止信号更自然地停止,并且 Oracle 会话将正常清除,从而删除 Oracle 进程。(如果您的过程正在执行任何插入或更新,则事务回滚时可能仍有延迟)。

我不确定这是管理执行时间限制的特别好方法;作业控制或资源管理可能是更好的方法。

于 2013-01-21T15:15:13.397 回答