Oracle에서 하나의 프로 시저 사본 만 실행되도록하려면 어떻게해야합니까? 특정 프로 시저의 사본 하나만 실행되도록해야합니다. 이미

Oracle에서는 특정 프로 시저의 사본 하나만 실행되도록해야합니다. 이미 실행 중이고 사용자가 다른 것을 열려고하면 오류가 발생합니다.

가장 좋은 방법은 무엇입니까?



답변

DBMS_LOCK독점 잠금 으로이 작업을 수행 할 수 있습니다 .

다음 절차를 참조하십시오.

CREATE OR REPLACE PROCEDURE myproc
IS
  lockhandle VARCHAR2(128);
  retcode NUMBER;
BEGIN
  DBMS_LOCK.ALLOCATE_UNIQUE('myproclock',lockhandle);

  retcode:=DBMS_LOCK.REQUEST(lockhandle,timeout=>0, lockmode=>DBMS_LOCK.x_mode);

  IF retcode<>0
  THEN
    raise_application_error(-20000,'myproc is already running');
  END IF;

  /* sleep so that we can test with a 2nd execution */
  DBMS_LOCK.sleep(1000);

  retcode:=DBMS_LOCK.RELEASE(lockhandle);

END myproc;
/

테스트 (세션 1) :

SQL> BEGIN
  2  myproc();
  3  END;
  4  /

(반환하면 분명히 반환 DBMS_LOCK.sleep()).

테스트 (세션 2) :

SQL> BEGIN
  2  myproc();
  3  END;
  4  /
BEGIN
*
ERROR at line 1:
ORA-20000: myproc is already running
ORA-06512: at "PHIL.MYPROC", line 12
ORA-06512: at line 2


SQL>

분명히 당신은해야합니다 GRANT EXECUTE ON DBMS_LOCK TO YOURUSER;.


답변

‘잠금’테이블을 사용하십시오.

프로 시저가 시작될 때 테이블에 알려진 값이 있는지 점검하십시오. 존재하는 경우 더 이상 진행하지 않고 proc을 종료하십시오. 없으면 테이블에 값을 쓰고 프로 시저를 실행 한 다음 값을 삭제하고 정상적으로 종료하십시오.


답변

고객에게 이와 같은 고유 한 비즈니스 로직이있는 요청이 있으면 질문을 돌리고 왜 이것이 필요한지 묻습니다.

하나의 사본 만 실행되도록하는 가장 좋은 방법은 사용자가 절차에서 전혀 실행하지 못하게하는 것입니다. 이 절차가 매우 특별한 경우에는 사용을 dba / developers로 제한해야합니다.

다른 방법은이 절차를 작업으로 만 실행하는 것입니다. 이를 호출하는 작업이 실행 중인지 확인하려면 프로 시저에 점검을 추가하십시오. 그런 다음 추가 처리를 중지하고 발생을 기록하십시오.