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;
이 토픽에 관한 좋은 기사가 있습니다.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
'programing' 카테고리의 다른 글
| ngRepeat 사용 시 표시되는 결과 수 제한 (0) | 2023.03.10 |
|---|---|
| wp-config.php에서 값(PHP 정의 상수)을 읽으려면 어떻게 해야 하나요? (0) | 2023.03.10 |
| org.springframework 유형의 빈을 정의하는 것을 검토합니다.보안.인증이 필요합니다.AuthenticationManager'가 설정되어 있습니다. (0) | 2023.03.10 |
| WordPress에서 모든 포스트 태그를 얻으려면 어떻게 해야 하나요? (0) | 2023.03.10 |
| 홈 화면에 추가하기 위한 iOS 아이콘이 검은색으로 바뀝니다. (0) | 2023.03.10 |