전체 글
-
오라클 잡 관리(Oracle job manage)2014.01.28
-
oracle job 생성2014.01.28
-
[secureCRT] log scrollback buffer size 늘리기2014.01.27
-
[Linux] war 압축2014.01.24
-
[Linux] vi 명령어2014.01.24
뷰 이름 명시적 지정 :ModelAndView와 String 리턴 타입
뷰이름의 명시적 지정
- ModelAndView 나 String을 리턴해야한다.
(ModelAndView를 리턴해서 뷰를 지정하는 예)
@RequestMapping("index.do")
public ModelAndView index() {
ModelAndView mav = new ModelAndView("index");
return mav;
}
ModelAndView를 리턴할 경우 ModelAndView 클래스의 생성자나 setViewName() 메서드를 이용해서 뷰 이름을 지정할 수 있다.
위 코드는 ModelAndView 클래스의 생성자를 이용해서 뷰 이름을 지정하고 있다. 다음과 같이 setViewName()메서드를 사용해도 된다.
ModelAndView mav = new ModelAndView();
mav.setViewName("search/game");
String 타입을 리턴할 경우, 문자열 값이 뷰 이름으로 사용된다. 아래 코드는 String 을 리턴하는 예를 보여주고 있다.
아래 코드는 보여줄 뷰 이름으로 "help/main" 을 지정하고 있다.
@RequestMapping("/hello/main.do")
public String helloMain("ModelMap model) {
...
return "hello/main";
}
뷰 이름 자동 지정
다음의 경우는 RequestToNameTranslator를 이용해서 URL 로부터 뷰 이름을 결정한다.
◎ 리턴 타입이 Model이나 Map일경우
◎ 리턴 타입이 void 이면서 ServletResponse나 HttpservletResponse 타입의 파라미터가 없는 경우
스프링 설정 파일에 RequestToViewNameTranslator 빈이 존재하지 않을 경우 기본적으로 DefaultRequestToViewNameTranslator 를 사용한다. 이 클래스는 요청 URI 부터 맨 앞의 슬래시와 확장자를 제외한 나머지 부분을 뷰 이름으로 사용한다. (더 정확하게는 전체 경로를 사용하지 않도록 설정한 경우 서블릿 경로를 제외한 나머지 경로가 사용된다.)
@RequestMapping("/search/searchInfo.do")
public Map<Sttring, Object> search() {
HashMap<String, Object> model = new HashMap<String, Object>();
....
return model;
}
위 코드는 뷰에 전달할 모델 데이터를 갖고 있는 Map을 리턴하고 있다. 이 경우 ReqeustToViewTranslator를 이용해서 결과를 보여줄 뷰 이름을 결정하게 되는데 ,DefaultRequestToViewNameTranslator가 사용될 경우 다음과 같이 URL로 부터 뷰 이름이 결정된다.
/search/searchInfo.do --> search/searchInfo
전체 경로 사용 여부에 따라서 뷰 이름이 결정되는 방식이 달라진다.
리다이렉트 뷰
뷰 이름에 "redirect:" 접두어를 붙이면 지정한 페이지로 리다이렉트 된다.
리다이렉트 URL은 다음과 같이 두 가지 방식으로 입력할 수 있다.
◎redirect : /board/list - 현재 서블릿 컨텍스트에 대한 상대적인 경로로 리다이렉트
◎redirect:http://host/bbs/list - 지정한 절대 URL로 리다이렉트
아래 코드는 "redirect:" 접두어를 사용하여 뷰 이름을 지정한 예이다.
ModelAndView mav = mew ModelAndView();
mav.setViewName("redirect:/error.do");
return mav;
redirect 접두어는 UrlBasedViewResolver Class를 상속받은 ViewResolver에서 처리된다. InternalResourceViewResolver or VelocityViewResolver와 같이 사용되는 ViewResolver는 UrlBasedViewResolver Class 상속받고 있기 때문에 모두 redirect 접두어를 지원하고 있다.
Map, Model ,ModelMap을 통한 모델설정
Map, Model, ModelMap을 이용하면 뷰에 전달할 모델을 생성할 수 있다.
첫 번째 방법은 이들 세 가지 타입 중 한가지를 파라미터로 전달받는 것이다.
@RequestMapping("/search1.do")
public String search1(Map model) {
model.put("result", searchResult);
...
}
@RequestMapping("/search2.do")
public String search1(Model model) {
model.addAttribute("result", searchResult);
...
}
@ResultMapping("/search3.do")
public String1(ModelMap model) {
model.addAttribute("result", searchResult);
...
}
Map, Model, ModelMap을 파라미터로 전달받는 경우, 이들이 제공하는 메서드를 이용해서 모델 데이터를 추가할수 있다.
두 번째 방법은 Map과 Model을 리턴하는 것이다. 이 둘은 모두 인터페이스이기 때문에 실제로는 인터페이스를 구현한 클래스의 객체를 생성해서 리턴하면된다.
사용예)
@RequestMapping("/search1.do")
public Map<String, Object> search1() {
...
HashMap<String, Object> model = new HashMap<String, Object>();
model.put("result", searchResult);
return model;
}
@RequestMapping("/search2.do")
public Model search2() {
...
Model model = new ExtendedModelMap();
model.addAttrubute("result", searchResult);
return model;
}
Spring은 org.springframework.ui.Model 인터페이스의 구현 클래스인 ExtendedModelMap 클래스를 동일한 패키지에 제공하고 있으므로, ExtendedModelMap 클래스를 이용해서 모델을 설정하면된다. Map의 경우 많이 사용하는 java.util.HashMap 클래스를 이용해서 모델을 설정한다.
Model 인터페이스의 주요 메서드
org.springframework.ui.Model 인터페이스는 모델을 설정할 수 있도록 다음과 같은 메서드를 제공한다.
◎ModeladdAttriibute(String name, Object value)
value 객체를 name 이름으로 추가한다. 뷰 코드에는 name으로 지정한 이름을 통해서 value를 사용한다.
◎ModeladdAttribute(object value)
value를 추가한다. value의 패키지 이름을 제외한 단순 클래스 이름을 모델이름으로 사용한다. 이 떄 첫 글자는 소문자로 처리한다.
value가 배열이거나 콜렉션인 경우 첫 번째 원소의 클래스 이름뒤에 "List" 를 붙일 걸 모델이름으로 사용한다. 이 경우에도 클래스 이름의 첫글자는 소문자로 처리한다.
◎ModeladdAllAttributes(Collection<?> values)
addAttribute(Object value)) 메서드를 이용해서 콜렉션에 포함된 객체들을 차례대로 추가한다.
◎ModeladdAllAttributes(Map<String,?> attributes)
Map에 포함된 <key, value>에 대해 키를 모델 이름으로 사용해서 값을 모델로 추가한다.
◎Model mergeAttributes(Map<String,?> attributes)
Map에 포함된 <key, value>을 현재 모델에 추가한다. 단, 키와 동일한 이름을 갖는 모델 객체가 존재하지 않는 경우에만 추가한다.
◎Boolean containsAttributes(String name)
지정한 이름의 도델 객체를 포함하고 있는 경우 true를 리턴한다.
ModelAndView 를 통한 모델 설정
객체생성방법
ModelAndView객체 생성은 setViewName(String viewName) 메서드를 이용해서 뷰 이름을 설정하고,
addObject(String name, Object value) 메서드를 이용해 뷰에 전달할 값을 추가하는 것이다.
@RequestMapping("/search/product.do")
public ModelAndView search(SearchCommand command) {
...
ModelAndView mav = new ModelAndView();
mav.setViewName("search/product");
mav.addObject("searchResult", searchResult);
mav.addObject("searchTypeList", typeList);
return mav;
}
Map에 저장된 <key, value> 쌍 전체를 뷰에 전달할 값으로 ModelAndView 객체에 추가하고 싶다면 다음과 같이 addAllObjects(Map modelMap) 메서드를 사용하면 된다.
Map referenceMap = referenceDate();
mav.addAllObjects(referenceMap);
생성자를 사용해서 뷰 이름과 Map을 전달할 수도 있다.
Map referenceMap = referenceDate();
return new ModelAndView("search/product", referenceMap);
뷰에 전달할 객체가 한 개 뿐이라면 다음과 같은 생성자를 이용해서 코드 분량을 줄일 수 있을 것이다.
return new ModelAndView("search/game","result", searchResult);
'Programming > Spring' 카테고리의 다른 글
spring mvc 모델 생성 (0) | 2014.02.11 |
---|---|
[Spring] Environment와 @PropertySource (0) | 2014.02.05 |
[Spring] log4j 설정파일 정보 (0) | 2014.01.17 |
[Spring] Spring Login Interceptor 설정 (0) | 2014.01.17 |
[Spring] Spring Ajax 사용 위한 JsonView 설정 (0) | 2014.01.13 |
오라클 잡 관리(Oracle job manage)
.주기적으로 수행되어지는 JOB을 JOB QUEUE를 사용하여 스케줄링 할 수 있습니다..
JOB을 스케줄링 하기 위해서 ORACLE의 DBMS_JOB 패키지를 이용합니다..
JOB QUEUE PROCESS가 JOB QUEUE 안의 잡을 수행합니다..
JOB으로 등록될 수 있는 것은 PL/SQL 프로시저 또는 패키지가 되며
예를 들어소스 디비의 테이블들에서 타겟 테이블로 데이터를 적재하는 프로시저를 생성했는데
1분단위로 데이터를 타겟 테이블로 적재를 해야 할 때 DBMS_JOBS에 등록하여
스케줄링 할 수 있습니다.
.JOB_QUEUE_PROCESSES 파라미터가 이와 관련된 초기화 파라미터로 0으로 설정되면
JOB QUEUE PROCESS는 시작되지 않으며 JOB QUEUE의 어느 잡도 수행되지 않습니다..
JOB_QUEUE_PROCESSES 파라미터의 MAX값이 설정되어야 오라클 인스턴스 위에서
동시에 잡을 수행할 수 있다. 설정할 수 있는 최고 값은 1000입니다..
JOB_QUEUE_PROCESSES=60 과 같이 설정할 수 있습니다..
.등록되거나 수행되는 잡에 대해서는 DBA_JOBS 또는 USER_JOBS 딕셔너리 뷰를 통해
확인 할 수 있다.
.JOB_QUEUE_PROCESSES 는 다이나믹 하게 DB를 SHUTDOWN하지 않고 ALTER SYSTEM
명령을 이용해서 설정할 수 있습니다.
ALTER SYSTEM SET JOB_QUEUE_PROCESSES = 20;
.JOB QUEUE안의 JOB을 스케줄링 하기 위해서는 DBMS_JOBS패키지를 사용할 수 있으며
JOB_QUEUE를 사용하기 위해 관련된 DB 권한은 없다.
.다음은 DBMS_JOBS의 패키지를 사용하기 위한 패키지의 프로시져들입니다.
SUBMIT - 잡큐의 잡을 등록합니다.
REMOVE - 잡큐의 잡을 제거합니다.
CHANGE - 잡큐의 잡을 변경합니다.
NEXT_DATE - 잡의 다음 수행시간을 변경합니다.
INTERVAL - 잡 수행 주기를 변경합니다.
WHAT - 잡으로 등록된 프로시저 또는 패키지를 변경합니다.
RUN - 잡을 수동으로 강제로 수행합니다.
.새 JOB을 JOB QUEUE에 등록하기 위해 사용되는 파라미터로 DBMS_JOB.SUBMIT()에 들어가느
파라미터 입니다.
JOB - OUTPUT 파라미터로 생성한 잡에 의해 할당되는 식별자 입니다.
WHAT - JOB QUEUE에 등록되는 PL/SQL 프로시저 또는 패키지 입니다.
NEXT_DATE - 잡이 수행되는 다음 시간입니다.
INTERVAL - 잡이 수행되는 주기로 초 단위까지 지정 가능합니다.
JOB_QUEUE에 등록하는 예제입니다.
VARIABLE jobno NUMBER
BEGIN
DBMS_JOB.SUBMIT(:jobno,
'SP_IN_EMP_SAL;',
SYSDATE,
'SYSDATE + 1');
COMMIT;
END;
/
위의 PL/SQL문을 SQL PLUS에서 수행합니다.
첫번째 파라미터가 JOB NUMBER가 부여되는 부분이고
두번째 파라미터가 WHAT으로 SP_IN_EMP_SAL이라는 프로시저를 등록했습니다.
세번째 파라미터가 NEXT_DATE이며 4번째 파라미터가 잡 수행 주기로 하루에 한번씩
수행하라는 의미입니다.
DBMS_JOB을 이용하면 특정시간, 특정요일, 특정일, 30초단위, 매분 정각, 매시정각
등 다양하게 잡을 스케줄링 하는 것이 가능합니다.
ETL 수행 할 때도 유용하게 사용할 수 있습니다.
잡 수행 간격 조정의 예
.SYSDATE+ 7 : 7일에 한번씩 잡이 수행됩니다.
.SYSDATE+1/24 : 1시간에 한번씩 잡이 수행됩니다.
.SYSDATE+30/86400 : 30초에 한번씩 잡이 수행됩니다.
.최초 잡 수행시간이 14:02분일 경우 매시 14:02분에 잡을 수행해야 될 경우
=>trunc(SYSDATE,'MI')+1/24
.최조 잡 수행시간이 06시 이고 매 8시간마다 정각에 잡이 수행되어야 될 경우
=>trunc(SYSDATE,'MI')+8/24
.매주 월요일 정각 3시에 잡이 수행되어야 할 경우
=>NEXT_DAY(TRUNC(SYSDATE),'MONDAY')+15/25
.각 분기마다 첫번째 월요일에 잡이 수행되어야 될 경우
=>NEXT_DAY(ADD_MONTHS(TRUNC(SYSDATE,'Q'),3),'MONDAY')
주의> dbms_job으로 잡을 스케줄링하게 될 경우 예를 들어 잡 최초 수행시간이 22일 14:00시이고
매시 정각에 잡이 수행되어야 할 경우 SYSDATE+1/24로 간격을 주게 되면 매 정시에 도는 것이
아니라 잡 수행 시간에 따라 약간씩 늦어지게 되어 14:00:04 => 15:00:07 => 16:00:10 이런식으로
잡 수행시간이 잡히게 됩니다. 따라서 정각에 수행되게 하려면 trunc함수를 이용해서 무조건 분에서
잘라내여 00으로 만들어 준다. trunc(SYSDATE,'MI')
잡의 삭제
BEGIN
DBMS_JOB.REMOVE(14443);
END;
/
14443은 잡 번호 이다. USER_JOBS 데이터 딕셔너리 뷰를 보면 잡 번호를 알 수 있습니다.
잡의 변경
BEGIN
DBMS_JOB.CHANGE(14144, NULL, NULL, 'SYSDATE + 3');
END;
/
잡으로 등록된 프로시저/패키지 변경
BEGIN
DBMS_JOB.WHAT(14144,
'SP_IN_EMP_SAL;');
END;
/
잡 다음 수행시간 변경
BEGIN
DBMS_JOB.NEXT_DATE(14144, TRUNC(SYSDATE,'MI') + 4);
END;
/
잡 수행 간격 변경
BEGIN
DBMS_JOB.INTERVAL(14144, TRUNC(SYSDATE,'MI')+30/1440);
END;
/
잡 수행 정지
잡이 BROKEN되면 잡은 수행되지 않으며 강제로 수행 할 시에는 DBMS_JOB.RUN()을 통해 수행합니다..
BEGIN
DBMS_JOB.BROKEN(14144, TRUE);
END;
/
잡큐 정보 VIEWING
DBA_JOBS, USER_JOBS, ALL_JOBS를 이용합니다.
SELECT JOB, NEXT_DATE, NEXT_SEC, FAILURES, BROKEN
FROM DBA_JOBS;
JOB NEXT_DATE NEXT_SEC FAILURES B
------- --------- -------- -------- -
9125 01-JUN-01 00:00:00 4 N
14144 24-OCT-01 16:35:35 0 N
9127 01-JUN-01 00:00:00 16 Y
3 rows selected.
DBMS_JOB의 활용예제를 주기적으로 소스테이블에서 타켓 테이블로
적재할 시 어떻게 사용할 수 있는지 간단하게 예를 만들었습니다
--수행될 잡의 목록이 들어갈 테이블
CREATE TABLE JOB_LIST
(JOB_ID VARCHAR2(2),
JOB_TYPE VARCHAR2(1),
JOB_NAME VARCHAR2(30),
JOB_EXEC_HOUR VARCHAR(2),
JOB_PARENTID VARCHAR2(2),
CONSTRAINTS JOB_LIST_PK PRIMARY KEY(JOB_ID)
USING INDEX
TABLESPACE CYS_INDEX
PCTFREE 0
STORAGE(INITIAL 32K NEXT 32K PCTINCREASE 0)
NOLOGGING)
TABLESPACE CYS_DATA
PCTFREE 0
STORAGE(INITIAL 128K NEXT 128K PCTINCREASE 0);
/
CREATE UNIQUE INDEX JOB_LIST_IDX01
ON JOB_LIST(JOB_NAME,JOB_EXEC_HOUR)
TABLESPACE CYS_INDEX
PCTFREE 0
STORAGE(INITIAL 64K NEXT 64K PCTINCREASE 0);
/
-잡 수행 히스토리 테이블로 하루에 한번씩 JOB_LIST 테이블에서 LOG테이블로 JOB_LIST가 복사된다.
CREATE TABLE JOB_LOG
(JOB_ID VARCHAR2(2),
JOB_EXEC_DATE VARCHAR2(8),
JOB_START_TIME DATE,
JOB_END_TIME DATE,
JOB_DATASTART_TIME DATE,
JOB_DATAEND_TIME DATE,
JOB_STATUS VARCHAR2(1),
JOB_ERR_MSG VARCHAR2(100),
CONSTRAINTS JOB_LOG_PK PRIMARY KEY(JOB_ID,JOB_EXEC_DATE)
USING INDEX
TABLESPACE CYS_INDEX
PCTFREE 0
STORAGE(INITIAL 128K NEXT 128K PCTINCREASE 0)
NOLOGGING,
CONSTRAINTS JOB_LIST_FK FOREIGN KEY(JOB_ID)
REFERENCES JOB_LIST(JOB_ID))
TABLESPACE CYS_DATA
STORAGE(INITIAL 1M NEXT 1M PCTINCREASE 0)
--JOB_ID를 부여하기 위한 시퀀스
CREATE SEQUENCE JOB_NUM
START WITH 1
INCREMENT BY 1
--하루에 한번 DBMS_JOB을 이용하여 JOB_LIST의 JOB들을 JOB_LOG에 INSERT하기 위한 프로시져
--다음날 수행할 JOB을 LOG로 넣는다.
CREATE OR REPLACE PROCEDURE
SP_IN_JOB_LOG(V_INDATE IN VARCHAR2 DEFAULT NULL)
AS
BEGIN
INSERT INTO JOB_LOG
SELECT JOB_ID,
NVL(V_INDATE,TO_CHAR(SYSDATE+1,'YYYYMMDD')),
NULL,
NULL,
NULL,
NULL,
'N',
NULL
FROM JOB_LIST;
COMMIT;
END SP_IN_JOB_LOG;
--SP_IN_JOB_LOG 프로시저를 DBMS_JOB에 등록한다.
DECLARE
JOB_NUMBER NUMBER;
BEGIN
DBMS_JOB.SUBMIT(JOB_NUMBER, --JOB번호
'SP_IN_JOB_LOG;', --프로시저명
TO_DATE('20050208180000','YYYYMMDDHH24MISS'), --NEXT_DATE
'TRUNC(SYSDATE,''MI'')+1'); --잡 수행 간격(매일 정각 6시)
END;
--JOB_LIST에 수행할 프로시져(JOB)을 등록
--DBA_USERS테이블을 이용해서 24개의 로우를 만들어 낸 후 카테시안 프러덕을 이용
INSERT INTO JOB_LIST
SELECT JOB_NUM.NEXTVAL JOB_ID,
JOB_TYPE,
JOB_NAME,
B.CNT JOB_EXEC_HOUR,
NULL
FROM(
SELECT NULL JOB_ID,
'F' JOB_TYPE,
'SP_IN_F_SALE_SUM' JOB_NAME,
NULL JOB_EXEC_HOUR,
NULL
FROM DUAL) A,
( SELECT LPAD(ROWNUM-1,2,'0') CNT FROM DBA_TABLES
WHERE ROWNUM<25) B
COMMIT;
--JOB_LIST를 JOB_LOG로 INSERT(현재 SP_IN_JOB_LOG 가 다음일을 INSERT하도록 되어 있으므로 해당일을 넣어줌)
EXEC SP_IN_JOB_LOG('20050208');
--제대로 들어갔는지 확인
SELECT * FROM JOB_LOG;
--SOURCE 테이블을 시간단위로 섬머리 해서 TARGET 테이블로 적재하기 위한 프로시져
--ERROR없이 매 시간 돌 때는 파라미터 없이 SP_IN_F_SALE_SUM으로 수행 되고 수동으로 어떤 데이터의
--범위를 적재해야 할 경우 시간의 범위를 파라미터로 넘겨줌
CREATE OR REPLACE PROCEDURE
SP_IN_F_SALE_SUM(V_STARTTIME IN VARCHAR2 DEFAULT NULL,
V_ENDTIME IN VARCHAR2 DEFAULT NULL)
AS
D_STARTTIME DATE;
D_ENDTIME DATE;
V_ERR_MSG VARCHAR2(100);
BEGIN
--프로시저가 파라미터 값이 없이 수행될 경우
IF V_STARTTIME IS NULL AND V_ENDTIME IS NULL THEN
SELECT NVL(JOB_DATAEND_TIME,TRUNC(SYSDATE-1/24,'HH24'))
INTO D_STARTTIME
FROM JOB_LOG
WHERE JOB_ID=(SELECT JOB_ID FROM JOB_LIST
WHERE JOB_NAME='SP_IN_F_SALE_SUM'
AND JOB_EXEC_HOUR=TO_CHAR(SYSDATE-1/24,'HH24'))
AND JOB_EXEC_DATE=TO_CHAR(SYSDATE,'YYYYMMDD')
AND JOB_STATUS='Y';
D_ENDTIME:=TRUNC(SYSDATE,'HH24');
ELSE
SELECT NVL(JOB_DATAEND_TIME,TO_DATE(V_STARTTIME,'YYYYMMDDHH24MISS'))
INTO D_STARTTIME
FROM JOB_LOG
WHERE JOB_ID=(SELECT JOB_ID FROM JOB_LIST
WHERE JOB_NAME='SP_IN_F_SALE_SUM'
AND JOB_EXEC_HOUR=SUBSTR(V_STARTTIME,9,2))
AND JOB_EXEC_DATE=SUBSTR(V_ENDTIME,1,8)
AND JOB_STATUS='Y';
D_ENDTIME:=TO_DATE(V_ENDTIME,'YYYYMMDDHH24MISS');
END IF;
--수행되는 프로시저의 START시간을 찍어주고 RUNNING으로 표시
UPDATE JOB_LOG
SET JOB_START_TIME=SYSDATE,
JOB_STATUS='R'
WHERE JOB_ID=(SELECT JOB_ID FROM JOB_LIST
WHERE JOB_NAME='SP_IN_F_SALE_SUM'
AND JOB_EXEC_HOUR=SUBSTR(V_STARTTIME,9,2))
AND JOB_EXEC_DATE=SUBSTR(V_ENDTIME,1,8);
-- DML------
--수행되어질 INSERT문
-- DML-----
COMMIT;
--프로시저가 ERROR없이 수행이 끝나면 END 시간과 가져온 데이터의 범위를 찍어줌
UPDATE JOB_LOG
SET JOB_END_TIME=SYSDATE,
JOB_DATASTART_TIME=D_STARTTIME,
JOB_DATAEND_TIME=D_ENDTIME,
JOB_STATUS='Y'
WHERE JOB_ID=(SELECT JOB_ID FROM JOB_LIST
WHERE JOB_NAME='SP_IN_F_SALE_SUM'
AND JOB_EXEC_HOUR=TO_CHAR(D_ENDTIME,'HH24'))
AND JOB_EXEC_DATE=SUBSTR(V_ENDTIME,1,8);
COMMIT;
EXCEPTION
WHEN OTHERS THEN
V_ERR_MSG:= SUBSTRB(SQLERRM, 1, 80);
UPDATE JOB_LOG
SET JOB_END_TIME=SYSDATE,
JOB_STATUS='E',
JOB_ERR_MSG=V_ERR_MSG
WHERE JOB_ID=(SELECT JOB_ID FROM JOB_LIST
WHERE JOB_NAME='SP_IN_F_SALE_SUM'
AND JOB_EXEC_HOUR=TO_CHAR(D_ENDTIME,'HH24'))
AND JOB_EXEC_DATE=SUBSTR(V_ENDTIME,1,8);
COMMIT;
END SP_IN_F_SALE_SUM;
/
--SP_IN_F_SALE_SUM 프로시저를 DBMS_JOB에 등록합니다.
DECLARE
JOB_NUMBER NUMBER;
BEGIN
DBMS_JOB.SUBMIT(JOB_NUMBER, --JOB번호
'SP_IN_F_SALE_SUM;', --프로시저명
TO_DATE('20050209000000','YYYYMMDDHH24MISS'), --NEXT_DATE
'TRUNC(SYSDATE,''MI'')+1/24'); --잡 수행 간격(매시간 정각)
END;
JOB의 시간이나 간격 등록된 프로시저등을 변경하고자 할 때 DBMS_JOB의 다른 프로시져를 이용해서 변경합니다.
2번째 정리 부분에 설명되어 있습니다.
'Database & NoSQL > DB' 카테고리의 다른 글
[MS-SQL] mssql Getdate() format 정리 (0) | 2014.02.13 |
---|---|
다국어 데이터타입 설정 (0) | 2014.02.07 |
oracle job 생성 (0) | 2014.01.28 |
Erwin 설치, 엔티티생성, 관계설정 (0) | 2014.01.04 |
오라클 데이터 이동(merge) (0) | 2014.01.02 |
oracle job 생성
-- 프로시저 생성 CREATE OR REPLACE PROCEDURE INSERT_TEST_JOB IS BEGIN INSERT INTO TEST_JOB (NUM, REGDATE) VALUES ( (SELECT MAX (NVL (NUM, 0)) + 1 FROM TEST_JOB), SYSDATE); COMMIT; END INSERT_TEST_JOB; --프로시저 삭제 DROP PROCEDURE insert_test_job; -- JOB 생성 DECLARE JOBNO NUMBER; BEGIN DBMS_JOB.SUBMIT (JOBNO, 'USERS.INSERT_TEST_JOB;', SYSDATE + 1 / 24 / 60, -- job이 실행될 시간 1분후 'TRUNC(ADD_MONTHS(SYSDATE, 1))+6/24', -- job이 실행되는 간격 매달 1일 6시 FALSE); COMMIT; END;* job Interval 설정 ex) SYSDATE+7 : 7일에 한번 씩 job 수행 SYSDATE+1/24 : 1시간에 한번 씩 job 수행 SYSDATE+30/ : 30초에 한번 씩 job 수행(24: 시간 당, 1440(24x60):분 당, 86400(24x60x60):초 당 ) TRUNC(SYSDATE, 'MI')+8/24 : 최초 job 수행시간이 12:29분 일 경우 매시 12:29분에 job 수행 TRUNC(SYSDATE+1) : 매일 밤 12시에 job 수행 TRUNC(SYSDATE+1)+3/24 : 매일 오전 3시 job 수행 NEXT_DAY(TRUNC(SYSDATE),'MONDAY')+15/25 : 매주 월요일 오후 3시 정각에 job 수행 TRUNC(LAST_DAY(SYSDATE))+1 : 매월 1일 밤 12시에 job 수행 TRUNC(LAST_DAY(SYSDATE))+1+8/24+30/1440 : 매월 1일 오전 8시 30분
--JOB 삭제 execute dbms_job.remove(잡번호); --JOB 조회 SELECT WHAT, JOB, NEXT_DATE, NEXT_SEC, FAILURES, BROKEN FROM USER_JOBS; * job queue 정보 VIEWING SELECT * FROM DBA_JOBS SELECT * FROM USER_JOBS SELECT * FROM ALL_JOBS
'Database & NoSQL > DB' 카테고리의 다른 글
다국어 데이터타입 설정 (0) | 2014.02.07 |
---|---|
오라클 잡 관리(Oracle job manage) (0) | 2014.01.28 |
Erwin 설치, 엔티티생성, 관계설정 (0) | 2014.01.04 |
오라클 데이터 이동(merge) (0) | 2014.01.02 |
오라클 세로행을 가로 출력(LISTAGG) (0) | 2013.03.22 |
[secureCRT] log scrollback buffer size 늘리기
log scrollback buffer size 늘리기
secureCRT로 로그를 확인할 경우 buffer size가 부족해서 로그에 상단이 짤리는 경우가 있는데 이럴 경우 scrollback buffer size를 늘려주면 최초에 찍힌 log도 확인 할 수 있다.
Option > Session Option > Terminal > Emulation > Scrollback buffer size 32000
사이즈 입력~!
'Etc > Tool' 카테고리의 다른 글
[Eclipse] Javadoc 의 Author 설정 (0) | 2014.06.10 |
---|---|
[Eclipse] Console 한글 깨짐 설정 (0) | 2014.05.29 |
svn share 서버로 프로젝트 추가 (0) | 2014.01.17 |
Sonatype Nexus #2 : 설정 및 maven 과 연결하기 (0) | 2014.01.04 |
[eclipse] JRebel HotSwap 설정 (0) | 2013.12.17 |
[Linux] war 압축
Linux 압축
WAR 파일 만들기
1. command line 상에서 WAR파일을 만들고자 하는 폴더로 이동
2. jar cvf <war파일이름>.war * 입력
(예 : jar cvf test.war *)
3. 해당 폴더내에 war파일 생성완료
WAR 파일 압축 풀기
1. command line 상에서 WAR파일이 있는곳으로 이동
2. jar xvf <war파일이름>.war 입력
(예 : jar xvf test.war)
2-1. unzip test.war -d /var/lib/tomcat7/webapps/test (-d 이용 다른 폴더로 압축풀기)
unzip test.war (해당 폴더 내에서)
3. 해당 폴더내에 압축이 풀림
* 만약 해당 폴더가 아닌 다른 폴더에 압축을 풀고 싶다면
1. 압축을 풀고자 하는 폴더를 만들고 command line에서 폴더(BD)로 이동
2. jar xvf <절대/상대path + war파일이름>.war 입력
(예 :jar xvf /lnjdev/web_home/BD.war)
3. 해당 폴더내 압축이 풀림
'Infra > Linux' 카테고리의 다른 글
[Linux] 서버 용량 확인 (0) | 2021.03.29 |
---|---|
[shell] thread dump (0) | 2021.03.25 |
[Linux] 리눅스 명령어 (0) | 2021.03.25 |
[Linux] vi 명령어 (0) | 2014.01.24 |
[Linux] vi 명령어
Linux vi 에디터 명령어
vi 파일명
우선 파일을 열고 해당 위치로 이동..
수정 및 삭제할 대상을 편집명령어를 이용하여 삭제 후
삽입하기 위해서는 i 문자열을 커서 이전에 삽입, o 커서 이후에 삽입
(1) 편집 명령어
삭제,이동 x | 커서 다음 문자를 삭제 |
---|---|
X | 커서 이전 문자를 삭제 |
dw | 단어 삭제 |
dd | 현재 행 삭제 |
D | 한 행 전체를 삭제 |
p, P | 삭제한 문자열을 커서 뒤에 삽입, 커서 앞에 삽입 |
복사 yw | 단어 복사 |
yy | 현재 행 복사 |
삽입 후 esc 키 이용하여 원하는 위치로 이동..
(2) 종료 명령어
명령어 | 의미 |
---|---|
ZZ | 파일 저장 후 종료 |
:x | 파일 저장 후 종료 |
:wq | 파일 저장 후 종료 |
:w | 파일 저장 |
:w! | 무조건 파일을 저장 |
q | 파일 종료 |
q! | 무조건 파일 종료 |
Crtl + l : 화면 클리어
(3) 찾기
/키워드 : 커서 아래쪽 방향으로 키워드 검색.
n : 검색 키워드 아래 방향으로 계속 찾기.
?키워드 : 커서 위쪽 방향으로 키워드 검색.
? : 검색 키워드 위쪽 방향으로 계속 찾기.
N : 검색 진행 반대로 찾기.
(4) 윈도우에서 넘어온 파일 내용의 ^M 문자 치환
%/^M//g
(5) VI 커서 이동
Ctrl + f : 한 화면 위로 이동
Ctrl + b : 한 화면 아래로 이동
Ctrl + u : 반 화면 아래로 이동
Ctrl + d : 반 화면 위로 이동
Ctrl + e : 한 줄씩 위로 이동
Ctrl + y : 한 줄씩 아래로 이동
'Infra > Linux' 카테고리의 다른 글
[Linux] 서버 용량 확인 (0) | 2021.03.29 |
---|---|
[shell] thread dump (0) | 2021.03.25 |
[Linux] 리눅스 명령어 (0) | 2021.03.25 |
[Linux] war 압축 (0) | 2014.01.24 |