带有表级锁的包创建
首先在包开头处声明要抛出的类型.
随后调用pragma exception_init()方法,为异常为分配错误代码
在执行select语句中使用for update nowait,进行锁表
当有自定义锁表异常出现时,进行异常处理
PRAGMA EXCEPTION_INIT(e_lock_table, -54); -- 初始化锁表的异常
FUNCTION get_contract_rec(p_contract_id NUMBER,
p_user_id NUMBER) RETURN con_contract%ROWTYPE IS
v_con_contract_rec con_contract%ROWTYPE;
BEGIN
SELECT *
INTO v_con_contract_rec
FROM con_contract t
WHERE t.contract_id = p_contract_id
FOR UPDATE NOWAIT; -- 进行操作的锁表
RETURN v_con_contract_rec;
EXCEPTION
WHEN no_data_found THEN -- 当into语句没有实现,则不做处理
RETURN NULL;
WHEN e_lock_table THEN -- 发生锁表时
sys_raise_app_error_pkg.raise_user_define_error(p_message_code => 'CON_CONTRACT_PKG.CONTRACT_LOCK_ERROR',
p_created_by => p_user_id,
p_package_name => 'con_contract_pkg',
p_procedure_function_name => 'get_contract_rec');
raise_application_error(sys_raise_app_error_pkg.c_error_number,
sys_raise_app_error_pkg.g_err_line_id);
END;