如何在存储过程Oracle中为锁定表引发异常

如何在存储过程Oracle中为锁定表引发异常,oracle,exception,stored-procedures,Oracle,Exception,Stored Procedures,我在Oracle中有一个用于获取和显示数据的存储过程。但我想在其中实现另外一个功能 我想要的是,我想要抛出一个异常,而这个异常我想要登录到一个Oracle表中 示例存储过程 CREATE OR REPLACE PROCEDURE GET_FCA_GISDATA( P_GRPNAME IN NVARCHAR2, TB

我在Oracle中有一个用于获取和显示数据的存储过程。但我想在其中实现另外一个功能

我想要的是,我想要抛出一个异常,而这个异常我想要登录到一个Oracle表中

示例存储过程

CREATE OR REPLACE PROCEDURE GET_FCA_GISDATA(
                                            P_GRPNAME    IN NVARCHAR2, 
                                            TBLDATA_APP OUT SYS_REFCURSOR 
                                           ) AS
BEGIN
    OPEN TBLDATA_APP FOR

      SELECT IP.ID,
             IP.SAP_ID,
             IP.ID_OD_COUNTCHANGE,
             IP.ID_OD_CHANGEDDATE,
             IP.RRH_COUNTCHANGE,
             IP.RRH_CHANGEDDATE,
             IP.TENANCY_COUNTCHANGE,
             IP.TENANCY_CHANGEDDATE,
             ST.STATUS,
             IP.RFE1_DATE_BAND,
             IP.RFS_DATE_BAND,
             IP.CREATED_BY
        FROM TBL_IPCOLO_MAST_INFO IP
        LEFT JOIN TBL_IPCOLO_STATUS ST
          ON IP.FCA_STATUS = ST.ID
       WHERE UMS_GRP_TO_NAME = P_GRPNAME
         AND ST.ISACTIVE = 1
       ORDER BY 12 DESC;

    COMMIT;

  EXCEPTION
    WHEN OTHERS THEN
      ROLLBACK;  
END GET_FCA_GISDATA;

请建议如何引发异常。

如何引发您自己的异常?像这样:

SQL> set serveroutput on
SQL> create or replace procedure p_test is
  2    my_ex exception;
  3  begin
  4    raise my_ex;
  5  exception
  6    when my_ex then
  7      dbms_output.put_line('My exception');
  8  end;
  9  /

Procedure created.

SQL> exec p_test
My exception

PL/SQL procedure successfully completed.

SQL>
与其在屏幕上显示,不如将其存储到某个表中。

如果将动态性能视图的选择权限的相关同义词授予当前用户,则可以添加如下SQL Select语句:

在调用游标之前


如果
v_locked
变量的值大于
0
,则相关表具有
行锁争用
。如果
v\u locked>0
,则会发出警报并记录在一个简单的表中

该过程永远不会在锁定的行上抛出错误;正是这个程序接受了这个ref游标并处理它,才需要处理这个错误。@Boneist:ohh,我明白了。。你能推荐一些示例来抛出自定义错误吗??你知道这个请求背后的原因吗?如何引用您的程序?这里没有足够的信息告诉您需要做什么。打开游标时不能强制发生错误,因为所做的只是设置一段代码(“执行计划”),告诉Oracle如何获取下一行。它实际上并不获取行。而且,作为select语句,它实际上并不关心行是否被锁定。@Boneist如果在循环中他正在执行dml(更新插入或删除数据),那么可能会得到错误异常,对吗?@Moudiz如果示例过程显示了如何使用ref游标,那么是的,可以处理错误。但是,编写的示例过程永远不会返回关于锁定行的错误。
Select count(1)
  Into v_locked
  From all_objects o
  Join v$locked_object l on o.object_id = l.object_id
  Join v$session s on l.session_id = s.sid
  Join v$session_wait w on s.sid = w.sid
 Where o.object_name = 'TBL_IPCOLO_MAST_INFO'
   and s.status = 'ACTIVE'
   and lower(w.event) like '%enq%contention%' --> "enq: TX - row lock contention"