Answers:
您可以使用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;。