programing

ORACLE의 sleep 기능

golfzon 2023. 3. 10. 23:01
반응형

ORACLE의 sleep 기능

ORACLE에서 SQL 쿼리를 실행해야 하는데 일정 시간이 걸립니다.그래서 이 함수를 썼습니다.

CREATE OR REPLACE FUNCTION MYSCHEMA.TEST_SLEEP
(
TIME_  IN  NUMBER
)
RETURN INTEGER IS
 BEGIN
   DBMS_LOCK.sleep(seconds => TIME_);
RETURN 1;
 EXCEPTION
   WHEN OTHERS THEN
   RAISE;
   RETURN 1;
END TEST_SLEEP;

이렇게 전화해요.

SELECT TEST_SLEEP(10.5) FROM DUAL

하지만 일을 하기 위해서는 정해진 인가가 필요하다.DBMS_LOCK절차 소유자에게 전달해야 합니다.

를 사용하지 않고 이 기능을 다시 쓰는 방법DBMS_LOCK.sleep기능하고 있습니까?

에 대한 접근 허가가 부족하다.DBMS_LOCK.sleep이 방법은 작동하지만 끔찍한 해킹입니다.

IN_TIME INT; --num seconds
v_now DATE;

-- 1) Get the date & time 
SELECT SYSDATE 
  INTO v_now
  FROM DUAL;

-- 2) Loop until the original timestamp plus the amount of seconds <= current date
LOOP
  EXIT WHEN v_now + (IN_TIME * (1/86400)) <= SYSDATE;
END LOOP;

잠금을 실행하는 프로시저를 작성하여 dbms_lock(USERA)과 함께 "신뢰할 수 있는" 다른 사용자에게 설치하고 USERA에 dbms_lock에 대한 액세스를 부여합니다.

그리고 USERB에 이 기능에 대한 액세스 권한을 부여합니다.그러면 DBMS_LOCK에 액세스할 필요가 없습니다.

(이 작업을 수행하기 전에 시스템에 usera 및 userb가 없는지 확인합니다.)

dbms_lock에 대한 grant privs를 사용하여 사용자로 연결하여 사용자를 생성할 수 있습니다.

drop user usera cascade;
drop user userb cascade;
create user usera default tablespace users identified by abc123;
grant create session to usera;
grant resource to usera;
grant execute on dbms_lock to usera;

create user userb default tablespace users identified by abc123;
grant create session to userb;
grant resource to useb

connect usera/abc123;

create or replace function usera.f_sleep( in_time number ) return number is
begin
 dbms_lock.sleep(in_time);
 return 1;
end;
/

grant execute on usera.f_sleep to userb;

connect userb/abc123;

/* About to sleep as userb */
select usera.f_sleep(5) from dual;
/* Finished sleeping as userb */

/* Attempt to access dbms_lock as userb.. Should fail */

begin
  dbms_lock.sleep(5);
end;
/

/* Finished */

Oracle 18c부터는 DBMS_SESSION을 사용할 수 있습니다.sleep 절차:

이 절차에서는 지정된 시간 동안 세션을 일시 중지합니다.

DBMS_SESSION.SLEEP (seconds  IN NUMBER)

DBMS_SESSION.sleep는 추가 인가가 필요 없는 모든 세션에서 사용할 수 있습니다.주의하시기 바랍니다.DBMS_LOCK.sleep는 권장되지 않습니다.

간단한 쿼리 sleep이 필요한 경우 사용할 수 있습니다.WITH FUNCTION:

WITH FUNCTION my_sleep(i NUMBER)
RETURN NUMBER IS
BEGIN
    DBMS_SESSION.sleep(i);
    RETURN i;
END;
SELECT my_sleep(3) FROM dual;

db <> 데모 표시

이 토픽에 관한 좋은 기사가 있습니다.PL/SQL : Sleep without DBMS_LOCK use DBMS_LOCK 입니다.커스텀 패키지로 포장된 옵션 2를 사용했습니다.제안 솔루션은 다음과 같습니다.

옵션 1: APEX_UTIL.sleep

APEX가 설치되어 있는 경우 공개 패키지 APEX_에서 "PAUSE" 절차를 사용할 수 있습니다.유효.

예: "Wait 5 seconds" :

SET SERVEROUTPUT ON ;
BEGIN
    DBMS_OUTPUT.PUT_LINE('Start ' || to_char(SYSDATE, 'YYYY-MM-DD HH24:MI:SS'));
    APEX_UTIL.PAUSE(5);
    DBMS_OUTPUT.PUT_LINE('End   ' || to_char(SYSDATE, 'YYYY-MM-DD HH24:MI:SS'));
END;
/

옵션 2: java.lang.스레드.sleep

다른 옵션은 Java 클래스 "스레드"에서 "sleep" 메서드를 사용하는 것입니다. 이 메서드는 간단한 PL/SQL 래퍼 절차를 통해 쉽게 사용할 수 있습니다.

주의: "스레드"를 기억하십시오.sleep"은 밀리초를 사용합니다.

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

--- use ---
SET SERVEROUTPUT ON ;
BEGIN
    DBMS_OUTPUT.PUT_LINE('Start ' || to_char(SYSDATE, 'YYYY-MM-DD HH24:MI:SS'));
    SLEEP(5 * 1000);
    DBMS_OUTPUT.PUT_LINE('End   ' || to_char(SYSDATE, 'YYYY-MM-DD HH24:MI:SS'));
END;
/

"sqlplus" 내에서 실행되는 경우 호스트 운영 체제 명령 "sleep"을 실행할 수 있습니다.

!sleep 1

또는

host sleep 1

자바 코드가 프로시저로 포장된 건 뭐죠?심플하고 동작도 양호합니다.

CREATE OR REPLACE AND COMPILE JAVA SOURCE NAMED SNOOZE AS
public final class Snooze {
  private Snooze() {
  }
  public static void snooze(Long milliseconds) throws InterruptedException {
      Thread.sleep(milliseconds);
  }
}

CREATE OR REPLACE PROCEDURE SNOOZE(p_Milliseconds IN NUMBER) AS
    LANGUAGE JAVA NAME 'Snooze.snooze(java.lang.Long)';

동기 메커니즘을 구현하는 것이 좋습니다.가장 쉬운 것은 첫 번째 파일이 완료된 후에 파일을 쓰는 것입니다.초병 파일을 가지고 계시네요

그래서 외부 프로그램은 존재하는 감시 파일을 찾습니다.그러면 실제 파일의 데이터를 안전하게 사용할 수 있다는 것을 알 수 있습니다.

다른 방법은 일부 브라우저가 파일을 다운로드할 때와 마찬가지로 파일이 완전히 다운로드될 때까지 base-name_part라는 이름의 파일을 만들고 마지막에 파일 이름을 base-name으로 변경하는 것입니다.이렇게 하면 파일이 완료될 때까지 외부 프로그램이 파일을 "표시"할 수 없습니다.이렇게 하면 외부 프로그램을 다시 쓸 필요가 없습니다.그래서 이 상황이 최선일 수도 있어요

11G에 Java가 설치되어 있으면 Java 클래스에서 실행할 수 있고 PL/SQL에서 호출할 수 있지만 Java를 호출하는 데 특별한 권한이 필요하지 않은지 잘 모르겠습니다.

자바 프로시저/함수가 작동할 수 있을 것 같습니다.그러나 이 권한을 가진 애플리케이션 스키마나 관리자 계정과 같은 사용자로 기능을 컴파일하고 개발자 계정에서 실행 권한을 부여하면 어떨까요?그렇게 정의자 권한이 사용됩니다.

하시면 됩니다.DBMS_PIPE.SEND_MESSAGE 큰 를 들어 시 수 가(「 5 」 ( 「 5 」 ) 。「 XXX 」 、 「 5 」 。

dbms_pipe.pack_message('XXX');<br>
dummy:=dbms_pipe.send_message('TEST_PIPE', 5, 1);

, 그러기 는 「」에 가 필요합니다.DBMS_PIPE아아 、 을을을을거거 。

.DBMS_ALERT츠키다

CREATE OR REPLACE FUNCTION sleep(seconds IN NUMBER) RETURN NUMBER
AS
    PRAGMA AUTONOMOUS_TRANSACTION;
    message VARCHAR2(200);
    status  INTEGER;
BEGIN
    DBMS_ALERT.WAITONE('noname', message, status, seconds);
    ROLLBACK;
    RETURN seconds;
END;
SELECT sleep(3) FROM dual;

언급URL : https://stackoverflow.com/questions/2561671/sleep-function-in-oracle

반응형