0
点赞
收藏
分享

微信扫一扫

Hand-Aurora-数据库常用设计

梯梯笔记 2022-02-09 阅读 44

带有表级锁的包创建

首先在包开头处声明要抛出的类型.
随后调用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;
举报

相关推荐

0 条评论