Package Body删除操作持续执行未完成,函数因误加代码无法使用求助
问题与解决方案
问题描述
在Package Body中误添加了以下代码段,包编译完成后,涉事函数一直处于执行状态,执行drop package body操作也无法完成:
if admtrans.code_total(codes,datec,102) = 1 then return null; end if;
解决步骤
定位异常会话
执行以下SQL查询,找到关联的会话信息(需DBA权限):SELECT s.sid, s.serial#, s.username, sql.sql_text FROM v$session s LEFT JOIN v$sql sql ON s.sql_id = sql.sql_id WHERE sql.sql_text LIKE '%admtrans.code_total%' OR s.program LIKE '%你的包名%'; -- 替换为实际包名也可通过锁定对象查询:
SELECT s.sid, s.serial#, o.object_name FROM v$locked_object lo JOIN v$session s ON lo.session_id = s.sid JOIN dba_objects o ON lo.object_id = o.object_id WHERE o.object_name = '你的包名'; -- 替换为实际包名终止异常会话
拿到查询到的SID和SERIAL#后,执行终止命令:ALTER SYSTEM KILL SESSION 'SID,SERIAL#' IMMEDIATE;如果会话无法通过SQL终止,查询操作系统进程号(SPID)后用系统命令终止:
SELECT p.spid FROM v$process p JOIN v$session s ON p.addr = s.paddr WHERE s.sid = 你的SID; -- 替换为查询到的SIDLinux/Unix环境执行
kill -9 SPID,Windows环境通过任务管理器结束对应进程。重新处理包
会话终止后,执行删除包体命令:DROP PACKAGE BODY 你的包名;修正Package Body中的错误代码,重新编译:
CREATE OR REPLACE PACKAGE BODY 你的包名 AS -- 移除误加的代码段,保留正确逻辑 END 你的包名; /排查根源(可选)
检查admtrans.code_total函数是否存在死循环、锁等待或资源占用过高的问题,避免后续重复触发此类异常。
内容的提问来源于stack exchange,提问作者mohammadreza Askari
相关产品推荐
相关产品推荐

