database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 39630 게시물 읽기
No. 39630
프로시져 내에서 서브프로시져를 호출하고 결과를 기다리지 않는 법
작성자
이무용(rainfeel)
작성일
2012-09-10 13:18
조회수
6,223

안녕하세요.

글을 거의 다 썼다가, 회사 보안... 뭐시기에 걸려서 다시 씁니다. ㅠㅜ
붙여쓰기를 잘못했다가, 흑...

다름이 아니고, 예전에 오라클ERP를 할 때 사용했던 컨커런트(Concurrent??)와 같은 처리를 그냥 plsql에서도 구현 가능한지 묻고자 글을 올리게 됐습니다.

오라클ERP의 컨커런트는
프로시져를 작성하고, 그 프로시져를 컨커런트에 등록해서 사용하는 방식이었습니다.
임의의 컨커런트에서 서브 컨커런트(일종의 프로시져라고 생각하셔도 될 듯)를 호출하면,
그 결과를 기다리지 않고, 본 부모 프로시져의 다음 로직을 행하는 방식입니다.

물론 부모 컨커런트와 자식 컨커런트 간의 세션이 다를 수 밖에 없기 때문에,
자율적 트랜잭션(PRAGMA AUTONOMOUS_TRANSACTION)과 관련이 있는건가... 해서
PRAGMA AUTONOMOUS_TRANSACTION라고 정의된 프로시져를 호출해 보기도 했는데, 호출된 프로시져의 결과를 기다리는 것 같네요.

세션이 별개이고, 별개 세션을 사용하는 프로시져를 기다릴 필요는 없기 때문에,
오라클ERP의 컨커런트처럼 호출만 하고, 자신은 다음 로직을 실행하는 방법이 있을 것 같은데,

혹시 그런 방법을 아시는 분 계시나요?
고수님들의 많은 가르침 기다리겠습니다.

그럼 좋은 하루들 되세요~~

 

이 글에 대한 댓글이 총 4건 있습니다.

 

오라클에서 백그라운드로 작업을 수행하시려면

dbms_job이나 dbms_scheduler(10g 이상)을 이용할 수 있습니다.

다만 권한이 있는지 살펴보셔야 할 것입니다.

 

프로시저1()

is

begin

      dbms_scheduler.create_job(...);  --> 프로시저2를 스캐줄러에 등록

      ....

end;

/

m님이 2012-09-10 14:56에 작성한 댓글입니다. Edit

m님 감사합니다.

알아봤는데, job등록할 때 input파라미터가 있는 프로시져를 등록할 수는 없나보죠?

미리 파라미터를 넣어서 실행시키는 예시밖에 안보이네요.

이무용(rainfeel)님이 2012-09-11 10:41에 작성한 댓글입니다.

 

파라미터를 이용하여 스케줄러를 기동하는 것이 가능하다고 알고 있는데, 

제가 직접 사용해보지는 않아서 답을 드리기는 어렵습니다.

다만 아래처럼 기본 방법을 응용하여 파라미터를 처리할 수도 있습니다.

파라미터를 다이나믹 SQL처럼 직접 전달해주는 방법입니다.

자주 수행되지 않는 프로그램이라면 아래와 같은 방법을 사용해도 무방할테지만,

아주 빈번하게 수행되는 프로시저라면 파라미터를 입력할 수 있는 방법을

테스트해서 수행하는 것이 좋을 듯 합니다. 

 

-- 테스트용 테이블 생성

DROP TABLE TMP_TABLE1 PURGE;

 

CREATE TABLE TMP_TABLE1

(JOB_DT      VARCHAR2(8)

,JOB_TIME    DATE

)

;

 

DROP TABLE TMP_TABLE2 PURGE;

 

CREATE TABLE TMP_TABLE2

(JOB_DT      VARCHAR2(8)

,JOB_TIME    DATE

)

;

 

-- 서브 프로시저

CREATE OR REPLACE PROCEDURE PROC_SUB(P_JOB_DT VARCHAR2)

IS

BEGIN

    INSERT INTO TMP_TABLE2(JOB_DT, JOB_TIME) VALUES (P_JOB_DT, SYSDATE);

    

    COMMIT;

END;

/

 

-- 메인 프로시저

CREATE OR REPLACE PROCEDURE PROC_MAIN

IS

V_JOB_DT      VARCHAR2(8);

V_JOB_ACTION  VARCHAR2(200);

BEGIN

    V_JOB_DT := TO_CHAR(SYSDATE, 'YYYYMMDD');

    

    -- 1.JOB 등록

    V_JOB_ACTION := 'BEGIN ' || 'PROC_SUB(''' || V_JOB_DT || '''); END;';

    

    DBMS_SCHEDULER.CREATE_JOB (JOB_NAME        => 'JOB_PROC_SUB'

                              ,JOB_TYPE        => 'PLSQL_BLOCK'

                              ,JOB_ACTION      => V_JOB_ACTION

                              ,START_DATE      => SYSDATE

                              ,AUTO_DROP       => TRUE           --> 수행 후 곧바로 스케줄러에서 제거함

                              );

 

    -- 2.JOB 구동

    DBMS_SCHEDULER.ENABLE ('JOB_PROC_SUB');

    

    -- 3.PROC_MAIN의 액션

    INSERT INTO TMP_TABLE1(JOB_DT, JOB_TIME) VALUES (V_JOB_DT, SYSDATE);

    

    COMMIT;

END;

/

 

-- 메인 프로시저 수행

BEGIN

    PROC_MAIN;

END;

/

 

-- 결과 확인

SELECT '1' KIND, A.*

FROM TMP_TABLE1 A

UNION ALL

SELECT '2' KIND, A.*

FROM TMP_TABLE2 A

;

 

m님이 2012-09-17 12:54에 작성한 댓글입니다. Edit

네, 감사합니다.

알아보니 파라미터 연계하는 방법이 있는 것 같더군요. 다만, dbms_job 등의 실행권한을 주지 않는다고 해서 그냥 패스하고 말았습니다.

대신, 꼼수로 트리거를 이용했습니다. ^^

이무용(rainfeel)님이 2012-09-20 08:47에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
39633sql 동적 쿼리 도움 좀 부탁 드립니다. [1]
김기훈
2012-09-11
4892
39632기간 건수 합계 구하기 [2]
마루아라
2012-09-10
4554
39631쿼리 질문입니다.. [1]
삐에로
2012-09-10
4106
39630프로시져 내에서 서브프로시져를 호출하고 결과를 기다리지 않는 법 [4]
이무용
2012-09-10
6223
39629단골 고객 구하는 쿼리 질문 입니다. [2]
박상민
2012-09-10
4392
39628oracle odbc로 접속후 where 절에 한글 검색을 하면 안나옵니다.
막시무스
2012-09-07
4804
39627기간별 이력 쿼리 질문 드립니다. [2]
논어
2012-09-07
5003
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다