Как сгенерировать исключение в хранимой процедуре Oracle для блокировки в таблице - PullRequest
0 голосов
/ 18 января 2019

У меня есть хранимая процедура в 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 ]

0 голосов
/ 18 января 2019

можно добавить оператор SQL Select, подобный приведенному ниже, при условии, что текущему пользователю предоставлены соответствующие синонимы привилегий выбора динамических представлений производительности:

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.

0 голосов
/ 18 января 2019

Как поднять собственное исключение?Например:

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>

Вместо того, чтобы отображать его на экране, вы сохраните его в некоторой таблице.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...