代码之家  ›  专栏  ›  技术社区  ›  hud

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

  •  0
  • hud  · 技术社区  · 6 年前

    我在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;
    

    请建议如何抛出异常。

    2 回复  |  直到 6 年前
        1
  •  1
  •   Littlefoot    6 年前

    如何提出您自己的异常?这样地:

    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>
    

    展示它 在屏幕上,您可以将其存储到某个表中。

        2
  •  0
  •   Barbaros Özhan    6 年前

    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"
    

    如果 v_locked zero 然后,相关表有一个 row lock contention v_locked > 0 .