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
관련: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
'programing' 카테고리의 다른 글
git로 새 파일의 일부만 스테이징하는 방법은 무엇입니까? (0) | 2023.07.01 |
---|---|
날짜 시간.MinValue 및 SqlDateTime 오버플로 (0) | 2023.07.01 |
Spring-Data-Rest Validator (0) | 2023.07.01 |
유성 앱에서 mongodb에 2열 고유 ID를 추가하려면 어떻게 해야 합니까? (0) | 2023.07.01 |
R 요인을 각 요인 수준에 대한 1/0 지시 변수 집합으로 자동 확장 (0) | 2023.07.01 |