programing

oracle pl/sql DBMS_LOCK 오류

starjava 2023. 7. 1. 07:57
반응형

oracle pl/sql DBMS_LOCK 오류

Oracle PL/SQL에서 sleep 기능을 테스트하고 싶습니다.hr 스키마를 사용하고 있는데 오류가 발생합니다.

PLS-00201: identifier 'DBMS_LOCK' must be declared

코드:

begin
 DBMS_LOCK.Sleep( 60 );
end;
/

스키마에 해당 패키지에 대한 실행을 허용해야 합니다.

grant execute on <object> to <user>;

예.

connect as sys
grant execute on SYS.DBMS_LOCK to someuser;

시스템에 대한 액세스 권한이 없거나 DBA가 원하지 않는 경우

   GRANT EXECUTE on SYS.DBMS_LOCK to you;

데이터베이스에서 Java 절차를 작성할 수 있습니다.

   CREATE OR REPLACE PROCEDURE SLEEPIMPL (P_MILLI_SECONDS IN NUMBER) 
   AS LANGUAGE JAVA NAME 'java.lang.Thread.sleep(long)';

그리고 자바 저장 프로시저를 호출하는 함수를 만듭니다.

 CREATE OR REPLACE FUNCTION sleep (
    seconds IN NUMBER
   ) RETURN NUMBER
   AS
   BEGIN
     SLEEPIMPL( seconds );
     RETURN seconds;
   END;

그 후에

GRANT EXECUTE ON sleep TO public;

선택 항목에서 전화할 수 있습니다.

select sleep(6000) from dual

이 문제가 발생하여 사용자가 DBMS_LOCK 패키지에 액세스할 수 없으며 현재 12c에 있기 때문에 사용할 수 없습니다.DBMS_SESSION.SLEEP꾸러미그래서 30분의 대기 시간을 수용하기 위해 다음 절차를 만들었습니다.

매개 변수 V_START_DATE가 의 현재 날짜 시간을 저장합니다.

매개 변수 V_END_DATE는 의 현재 날짜 시간을 저장하고 작업이 대기할 시간(분)을 추가합니다(이 경우 30/1440은 30분 추가).

루프는 종료 날짜 시간까지 반복되며, 플래그가 1이거나 실행이 지정된 대기 시간(예: V_END_DATE > V_START_DATE)과 플래그 값 <> 1을 초과하면 중단됩니다.

create or replace procedure SP_SLEEP_ALTERNATE is
  V_FLAG       INT := 0;
  V_START_DATE DATE;
  V_END_DATE   DATE;
begin

  SELECT SYSDATE INTO V_START_DATE FROM DUAL;

  SELECT SYSDATE + 30 / 1440 INTO V_END_DATE FROM DUAL;

  while V_START_DATE <= V_END_DATE LOOP
  
    BEGIN
      /* get flag from a table */
    EXCEPTION
      WHEN NO_DATA_FOUND THEN
        V_FLAG := 0;
    END;
    IF V_FLAG <> 1 THEN
    
      V_FLAG := 0;
    ELSIF V_FLAG = 1 THEN
      DBMS_OUTPUT.PUT_LINE('Execution Started');
      EXIT;
    ELSIF V_FLAG <> 1 AND V_START_DATE > V_END_DATE THEN
      EXIT;
    END IF;
  
    SELECT SYSDATE INTO V_START_DATE FROM DUAL;
  
  END LOOP;

end SP_SLEEP_ALTERNATE;

같은 문제에 직면한 누군가에게 도움이 되기를 바랍니다.

DBMS_SESSION.Oracle Database 18c에서 DBMS_LOCK.SLEEP을 대체하는 SLEEP

SLEEP 절차는 DBMS_SESSION 패키지에 추가되며 Oracle Database 18c의 DBMS_LOCK 패키지에서 사용되지 않습니다.

SLEEP 프로시저는 DBMS_SESSION 패키지에 추가되므로 DBMS_LOCK 패키지에 대한 추가 허가 없이 모든 세션에서 사용할 수 있습니다.


실패: dbms_lock.sleep(...)

with function slow_function(p_id  in number) return number
    deterministic as
begin
    dbms_lock.sleep(0.02);  --look here
    return p_id;
end;

select 
    slow_function(level)
from 
    dual
connect by level <= 20000

오류:

ORA-00904: "SYS"."DBMS_LOCK": invalid identifier

성공: sys.dbms_session.sleep(...)

with function slow_function(p_id  in number) return number
    deterministic as
begin
    --dbms_lock.sleep(0.02);
    sys.dbms_session.sleep(0.02);  --look here
    return p_id;
end;

select 
    slow_function(level)
from 
    dual
connect by level <= 20000

결과:

SLOW_FUNCTION(LEVEL)
--------------------
                   1
                   1
                   1
                   1
                   1
                   1
                   1
                   1
                   1
                   1
…
10 rows of 20000

db<>디플

관련:CONNECT BY LEVEL 쿼리에서 CONNECT BY LEVEL 함수가 예기치 않은 숫자를 반환하는 이유는 무엇입니까?


저는 전문가가 아니니까 제가 틀리면 언제든지 고쳐주세요.

자체 제작 절차.보조금을 설정할 권한이 없는 경우

CREATE OR REPLACE procedure new_sleep(p_nSekunden  number)

is

  dDate  date := sysdate;
begin

  if p_nSekunden < 1 then
    return;
  end if;
 
  dDate := dDate + ( (1/24/3600) * p_nSekunden );

  loop
    exit when sysdate > dDate;       
  end loop;
end;

언급URL : https://stackoverflow.com/questions/10870787/oracle-pl-sql-dbms-lock-error

반응형