복붙노트

[SQL] ORACLE에서 슬립 기능

SQL

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 기능을 사용하지 않고이 기능을 다시 쓸 수 있습니까?

해결법

  1. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    4."SQLPLUS"내에서 실행하면 시스템 명령 "잠"을 운영 호스트를 실행할 수 있습니다 :

    "SQLPLUS"내에서 실행하면 시스템 명령 "잠"을 운영 호스트를 실행할 수 있습니다 :

    !sleep 1
    

    또는

    host sleep 1
    
  5. ==============================

    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. ==============================

    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. ==============================

    7.동기화 메커니즘을 구현하는 것이 좋습니다 것입니다. 가장 쉬운 첫 번째 파일이 완료된 후 파일을 작성하는 것입니다. 그래서 당신은 감시 파일이 있습니다.

    동기화 메커니즘을 구현하는 것이 좋습니다 것입니다. 가장 쉬운 첫 번째 파일이 완료된 후 파일을 작성하는 것입니다. 그래서 당신은 감시 파일이 있습니다.

    존재에 대한 감시 파일에 대한 외부 프로그램의 외모 그래서. 그것은 않는 경우 그것은 안전하게 실제 파일의 데이터를 사용할 수 있다는 것을 알고있다.

    파일을 다운로드 할 때 일부 브라우저가 어떻게 비슷합니다이 작업을 수행하는 또 다른 방법은, 파일이 완전히 다운로드 한 후 마지막에 기본 이름에 파일 이름을 바꿀 때까지 파일을 이름을베이스 name_part하는 것입니다. 완료 될 때까지 외부 프로그램이 파일을 "볼"수없는이 방법. 이 방법은 외부 프로그램의 재 작성이 필요하지 않을 것입니다. 어떤이 상황이 최선을 만들 수 있습니다.

  8. ==============================

    8.자바가 11G에 설치되어있는 경우에 당신은 자바 클래스에서 그것을하고 PL / SQL에서 호출하지만, 나는 확실히 그것은 또한 전화 자바에 특정 보조금을 필요로하지 않는다는 것을 아니라고 할 수 있습니다.

    자바가 11G에 설치되어있는 경우에 당신은 자바 클래스에서 그것을하고 PL / SQL에서 호출하지만, 나는 확실히 그것은 또한 전화 자바에 특정 보조금을 필요로하지 않는다는 것을 아니라고 할 수 있습니다.

  9. ==============================

    9.자바 절차 / 기능이 작동 할 수 보인다. 그런데 왜 당신은 응용 프로그램 스키마 또는이 보조금을 가지고 있으며, 단지 개발자 계정이 그것을 실행 교부금 관리자 계정과 같은 사용자로 함수를 컴파일하지 않습니다. 방법은 그 정의 자 권한이 사용됩니다.

    자바 절차 / 기능이 작동 할 수 보인다. 그런데 왜 당신은 응용 프로그램 스키마 또는이 보조금을 가지고 있으며, 단지 개발자 계정이 그것을 실행 교부금 관리자 계정과 같은 사용자로 함수를 컴파일하지 않습니다. 방법은 그 정의 자 권한이 사용됩니다.

  10. ==============================

    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. ==============================

    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;
    
  12. from https://stackoverflow.com/questions/2561671/sleep-function-in-oracle by cc-by-sa and MIT license