[SQL] ORACLE에서 슬립 기능
SQLORACLE에서 슬립 기능
나는 시간이 걸립니다 오라클에서 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 기능을 사용하지 않고이 기능을 다시 쓸 수 있습니까?
해결법
-
==============================
1.짧은 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;
-
==============================
2.당신의 잠금을 수행하는 절차를 만들고 DBMS_LOCK (USERA), DBMS_LOCK에 부여 USERA 접속과 "신뢰"하는 다른 사용자로 설치합니다.
당신의 잠금을 수행하는 절차를 만들고 DBMS_LOCK (USERA), DBMS_LOCK에 부여 USERA 접속과 "신뢰"하는 다른 사용자로 설치합니다.
그런 다음이 함수 USERB 액세스 권한을 부여 할 수 있습니다. 그런 다음 실 거예요 필요가 액세스 DBMS_LOCK 할 수 있도록
(메이크업은 반드시이 프로그램을 실행하기 전에 시스템의 사용자와 사용자가 없습니다)
DBMS_LOCK에 대한 보조금 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 */
-
==============================
3.오라클 18C에서 당신은 DBMS_SESSION.SLEEP 절차를 사용할 수 있습니다 :
오라클 18C에서 당신은 DBMS_SESSION.SLEEP 절차를 사용할 수 있습니다 :
DBMS_SESSION.sleep 필요한 추가 보조금 모든 세션을 사용할 수 있습니다. DBMS_LOCK.sleep이되지 않습니다주의하시기 바랍니다.
당신이 간단한 쿼리의 수면이 필요한 경우는 기능을 사용할 수 있습니다 :
WITH FUNCTION my_sleep(i NUMBER) RETURN NUMBER BEGIN DBMS_SESSION.sleep(i); RETURN i; END; SELECT my_sleep(3) FROM dual;
-
==============================
4."SQLPLUS"내에서 실행하면 시스템 명령 "잠"을 운영 호스트를 실행할 수 있습니다 :
"SQLPLUS"내에서 실행하면 시스템 명령 "잠"을 운영 호스트를 실행할 수 있습니다 :
!sleep 1
또는
host sleep 1
-
==============================
5.PL / SQL : : 수면 저를 도와 DBMS_LOCK를 사용하지 않고이 주제에 대한 좋은 기사가있다. 나는 사용자 정의 패키지에 포장 옵션 2를 사용했다. 제안 된 솔루션은 다음과 같습니다 :
PL / SQL : : 수면 저를 도와 DBMS_LOCK를 사용하지 않고이 주제에 대한 좋은 기사가있다. 나는 사용자 정의 패키지에 포장 옵션 2를 사용했다. 제안 된 솔루션은 다음과 같습니다 :
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; /
--- 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; /
-
==============================
6.절차 래핑 자바 코드에 대해 무엇입니까? 간단하고 작품을 잘.
절차 래핑 자바 코드에 대해 무엇입니까? 간단하고 작품을 잘.
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)';
-
==============================
7.동기화 메커니즘을 구현하는 것이 좋습니다 것입니다. 가장 쉬운 첫 번째 파일이 완료된 후 파일을 작성하는 것입니다. 그래서 당신은 감시 파일이 있습니다.
동기화 메커니즘을 구현하는 것이 좋습니다 것입니다. 가장 쉬운 첫 번째 파일이 완료된 후 파일을 작성하는 것입니다. 그래서 당신은 감시 파일이 있습니다.
존재에 대한 감시 파일에 대한 외부 프로그램의 외모 그래서. 그것은 않는 경우 그것은 안전하게 실제 파일의 데이터를 사용할 수 있다는 것을 알고있다.
파일을 다운로드 할 때 일부 브라우저가 어떻게 비슷합니다이 작업을 수행하는 또 다른 방법은, 파일이 완전히 다운로드 한 후 마지막에 기본 이름에 파일 이름을 바꿀 때까지 파일을 이름을베이스 name_part하는 것입니다. 완료 될 때까지 외부 프로그램이 파일을 "볼"수없는이 방법. 이 방법은 외부 프로그램의 재 작성이 필요하지 않을 것입니다. 어떤이 상황이 최선을 만들 수 있습니다.
-
==============================
8.자바가 11G에 설치되어있는 경우에 당신은 자바 클래스에서 그것을하고 PL / SQL에서 호출하지만, 나는 확실히 그것은 또한 전화 자바에 특정 보조금을 필요로하지 않는다는 것을 아니라고 할 수 있습니다.
자바가 11G에 설치되어있는 경우에 당신은 자바 클래스에서 그것을하고 PL / SQL에서 호출하지만, 나는 확실히 그것은 또한 전화 자바에 특정 보조금을 필요로하지 않는다는 것을 아니라고 할 수 있습니다.
-
==============================
9.자바 절차 / 기능이 작동 할 수 보인다. 그런데 왜 당신은 응용 프로그램 스키마 또는이 보조금을 가지고 있으며, 단지 개발자 계정이 그것을 실행 교부금 관리자 계정과 같은 사용자로 함수를 컴파일하지 않습니다. 방법은 그 정의 자 권한이 사용됩니다.
자바 절차 / 기능이 작동 할 수 보인다. 그런데 왜 당신은 응용 프로그램 스키마 또는이 보조금을 가지고 있으며, 단지 개발자 계정이 그것을 실행 교부금 관리자 계정과 같은 사용자로 함수를 컴파일하지 않습니다. 방법은 그 정의 자 권한이 사용됩니다.
-
==============================
10.에만 아래로 5 초 초과 한 바이트를 사용을 허용 할 수있는 파이프 5 초 지연 기록 XXX에 대해 예를 들어, 파이프 너무 큰 메시지를 사용할 수 DBMS_PIPE.SEND_MESSAGE
에만 아래로 5 초 초과 한 바이트를 사용을 허용 할 수있는 파이프 5 초 지연 기록 XXX에 대해 예를 들어, 파이프 너무 큰 메시지를 사용할 수 DBMS_PIPE.SEND_MESSAGE
dbms_pipe.pack_message('XXX');<br> dummy:=dbms_pipe.send_message('TEST_PIPE', 5, 1);
그러나 그 때문에 아마 더 좋은 DBMS_PIPE에 대한 승인이 필요하지 않습니다.
-
==============================
11.다음과 같이 당신은 DBMS_ALERT 패키지를 사용할 수 있습니다 :
다음과 같이 당신은 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;
from https://stackoverflow.com/questions/2561671/sleep-function-in-oracle by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] ORA-01795에 대한 해결 방법이 있습니까 : 목록에서 표현의 최대 수 1000 오류가? (0) | 2020.05.09 |
---|---|
[SQL] 당신은 SQL의 경우 - 당시 다른 논리를 가질 수 있습니까? [복제] (0) | 2020.05.09 |
[SQL] 어떻게 읽기 전용으로 MySQL의 행을 설정하는 방법? (0) | 2020.05.09 |
[SQL] 속으로 쿼리 구문을 교체 (0) | 2020.05.09 |
[SQL] 항목을 스캐 폴딩 할 수없는 응용 프로그램 (0) | 2020.05.09 |