블로그 이미지
숏퐁숑

카테고리

분류 전체보기 (70)
게임기획자 준비 (18)
게임기획 참고자료 (7)
프로그램 (33)
숨쉬기 활동 (10)
Total
Today
Yesterday

달력

« » 2024.10
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31

공지사항

태그목록

최근에 올라온 글

윈도우10에 오라클 12c를 설치



오라클사이트


winx64_12102_database_1of2

winx64_12102_database_2of2



Windows10환경에서 오라클12c를 설치를 해보았다.

 





전자메일 무시하고 다음으로 넘기자



 




메일제공하기싫으면 무시하고 다음 예  





데이터베이스 생성 및 구성




서버클래스




단일 인스턴스 데이터베이스 설치




고급설치


영어/한국어

 


엔터프라이즈 에디션



 


Oracle 홈 사용자 지정(Microsoft Windows 운영 체제 전용)
 

Windows 내장 계정을 사용하거나 표준 Windows 사용자 계정(관리자 계정 아님)을 지정하여 Oracle 홈을 설치하고 구성하십시오. 이 계정은 Oracle 홈에 대한 Windows 서비스를 실행하는 데 사용됩니다. 관리 작업을 수행하기 위해 이 계정으로 로그인하지 마십시오.


기존 Windows 사용자 사용

계정은 Windows 로컬 사용자, Windows 도메인 사용자 또는 Windows MSA(관리 서비스 계정)일 수 있습니다. Windows 로컬 또는 도메인 사용자에 대해 사용자 이름과 비밀번호를 제공해야 합니다. 관리 도메인 계정인 MSA 계정의 경우 사용자 이름만 제공하면 됩니다.

Oracle RAC Database 및 Oracle Grid Infrastructure 설치의 경우 Windows 도메인 사용자 계정만 사용할 수 있습니다.


새 Windows 사용자 생성

Oracle Universal Installer를 사용하여 생성할 Windows 로컬 사용자의 사용자 이름과 비밀번호를 제공합니다. 비밀번호를 확인합니다. 새로 생성된 사용자는 Windows 컴퓨터에 대화식 로그온 권한이 거부되어 있습니다. 그러나 Windows 관리자가 다른 Windows 계정과 마찬가지로 이 계정을 관리할 수 있습니다.


Windows 내장 계정 사용

사용자 이름이나 비밀번호가 필요하지 않습니다. Oracle은 Windows 내장 계정(LocalSystem 또는 LocalService)을 사용하여 Windows 서비스를 생성합니다.

데이터베이스 서버 설치의 경우, Oracle은 보안 향상을 위해 Oracle 홈 사용자로 (Windows 내장 계정 대신) 표준 Windows 사용자 계정을 사용할 것을 권장합니다.

다양한 유형의 Windows 계정에 대한 자세한 내용은 Microsoft 설명서를 참조하십시오








기본적 위치는 권한때문에 D로 잡힐것이다.

D로 설치해도 무난하다.




일반용/트랜잭션 처리




다음
 




자동메모리 관리를 사용으로 설정 해도 상관없음







문자집합은 기본값 사용

 



다음




 


다음


 


다음



다음

 

모든 계정에 동일한 비빌먼호 사용





 









 


설치




설치 도중 에러가 발생할수있다.

파일이 없다고 나올경우

winx64_12102_database_2of2 에있는


winx64_12102_database_2of2\database\stage 아래에있는 파일을 복사해서

winx64_12102_database_1of2\database\stage\Components 에 넣어주자





확인





닫기


설치완료



이제부터 가장 중요한 확인 순서


cmd 창을 관리자 권한으로 접속



 


대소문자 구분 없애기


alter system set sec_case_sensitive_logon=false;
  


listenr.ora설정



 listener.ora

 # listener.ora Network Configuration File: D:\app\Administrator\product\12.1.0\dbhome_1\network\admin\listener.ora
# Generated by Oracle configuration tools.

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = CLRExtProc)
      (ORACLE_HOME = D:\app\Administrator\product\12.1.0\dbhome_1)
      (PROGRAM = extproc)
      (ENVS = "EXTPROC_DLLS=ONLY:D:\app\Administrator\product\12.1.0\dbhome_1\bin\oraclr12.dll")
    )
  )

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = DESKTOP-XXXX)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
  )



설치도중 ora-28547를 만날수 있다. 


리스너에 HOST를 자신의 PC이름으로 변경하자


위치 : 제어판\시스템 및 보안\시스템


컴퓨터 이름: DESKTOP-XXXX

 


 tnsnames.ora

 # tnsnames.ora Network Configuration File: c:\oracle\product\10.2.0\client\network\admin\tnsnames.ora
# Generated by Oracle configuration tools.

EXTPROC_CONNECTION_DATA =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = HOSTNAME)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = PLSExtProc)
    )
  )

ORCL =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = DESKTOP-XXXX)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )
 



ORACLE SQL DEBELOPER




테스트 접속 성공

'프로그램 > ORACLE' 카테고리의 다른 글

오라클 12c 계정만들기  (0) 2016.12.16
TNS 리스너가 없습니다.  (0) 2016.12.16
오라클 sysdba접속 방법  (0) 2016.12.16
[오라클] WM_CONCAT 함수 사용하기  (0) 2016.11.30
[오라클] TRIGGER 구문 정리  (0) 2016.11.30
Posted by 숏퐁숑
, |

1년 전에 학원에서 DB 만질 때 이후로 DB는 설치만 하고 건들지 않았는데 

모처럼 한 번 해보기로 했다.

학원과의 차이점은 그 때는 오라클 11g를 사용했는데, 이제는 오라클 12c를 사용한다는 것이다.


처음 접속하는 것부터 까먹었는데 cmd에서 오라클로 접속하기 위해서는 sqlplus를 입력해야 한다.

그런데 나는 새 계정을 만들어야 하기 때문에 

sqlplus / as sysdba 

명령어를 입력하여 

sys 계정으로 접속한다.





그러면 sys 계정에 접속됨고 동시에 sql 명령어를 입력할 수 있게 된다.

계정을 만들기 위해서는 다음과 같은 sql 명령어를 입력한다.


create user 계정이름 identified by 비밀번호;


반드시 마지막에 세미콜론을 붙여야 한다. 

그렇지 않으면 명령어가 끝나지 않은 것으로 인식해서 더 받을려고 하며 

이를 그냥 넘기면 결국 실행되지 않는다.


그런데 여기에 문제가 있었는데 

"ORA-65096: 공통 사용자 또는 롤 이름이 부적합합니다."란 오류가 떴었다.

검색해보니 12g에서는 로컬 사용자가 아닌 공통 사용자 생성시에는 

계정이름 앞에 c##을 붙여줘야 한다고 한다.

이를 붙여주니까 계정이 정상적으로 생성이 되었다.


계정을 생성했다고 해서 바로 쓸 수 있는 것은 아니다.

먼저 계정의 잠금을 풀어줘야 한다.


alter user 계정명 account unlock;


다음으로 계정에 로그인 및 테이블 생성을 할 수 있게 접근 권한 및 자원을 부여한다.


grant connect, resource to 계정명;




계정이 제대로 만들어졌는지 확인하려면 다음 명령어를 입력하여 접속해본다.


conn 계정명/비밀번호


여기에는 세미콜론이 없어다 된다.




여기에서 테이블도 만들고 수정도 되겠지만, 이미 우리에겐 SQL Developer라는 좋은 툴이 있다.

위의 과정도 잘 기억은 안 나지만 Developer에서 더 쉽게 할 수 있을 것이다.


여튼 이제는 Developer를 사용하기 위해 계정을 연결하도록 한다.



1. 접속 이름

접속 시에 사용할 이름


2. 사용자 이름

아까 만들었던 계정 이름


3. 비밀번호

계정 비밀번호


4. 호스트 이름

오라클 시스템의 호스트 이름, 보통 localhost로 되어 있으며 굳이 수정하지 않아도 될 것이다.


5. 포트

오라클이 사용할 포트, 포트 충돌이 일어나지 않는 이상 바꿀 일은 없을 듯.


6. SID

데이터베이스 이름.

기본값은 xe이고, 보통 사용자들은 orcl이라는 이름을 많이 사용한다.

근데 나는 왜 저걸 계정 이름과 같이 해놓았는지 모르겠다.


여튼 이 SID를 잘못 입력하면 ORA-12505 에러가 난다.

정확한 SID 이름을 확인하려면 명령 프롬프트 창에서 다음을 입력한다.


lsnrctl services


이를 입력해보면 밑의 사진처럼 뜨는데 빨간 박스 안의 것처럼 DEDICATED 설정을 가진 서비스의 이름을 SID 이름으로 적으면 된다.



'프로그램 > ORACLE' 카테고리의 다른 글

오라클 12c 설치  (0) 2016.12.16
TNS 리스너가 없습니다.  (0) 2016.12.16
오라클 sysdba접속 방법  (0) 2016.12.16
[오라클] WM_CONCAT 함수 사용하기  (0) 2016.11.30
[오라클] TRIGGER 구문 정리  (0) 2016.11.30
Posted by 숏퐁숑
, |

oracle이 설치된 경로에 NETWORK\ADMIN\ 폴더에 보면 oracle에서 network와 관련한 여러 설정파일들이 있다.


그 중 'tnsnames.ora'라는 파일이 있는데... 이 파일은 간단히 설명하자면 클라이언트가 oracle 서버에 접속하기 위해 필요한 일종의 설정파일이라고 보면 된다. 


근데 문제는 'ora-12541 : TNS 리스너가 없습니다'라는 에러가 나올 경우인데... 

별도로 'tnsnames.ora' 파일을 셋팅하지 않은 경우라면 oracle 리스너가 동작하지 않고 있을 가능성이 높다. 'tnsnames.ora'파일을 셋팅을 한 일이 있다면 'tnsnames.ora'파일 설정이 올바르게 되어 있는지도 고려해 봐야 할 것이다.


1. oracle 리스너 컨트롤 툴에 접속


2. start


3. 오류발생!?!?


4. 알고 보니 예전에 'tnsnames.ora'파일을 바꿨던게 host 주소가 바뀌면서 문제가 생긴 것...  다시 수정하고 start


oracle을 쓰지 않는지라 가끔씩 심심할 때마다 만지면 기억이 없다. 리스너 컨트롤 생각은 하면서 명령어가 기억이 나지 않으니;; 매번 같은 검색을 또 하고 있다. 이번엔 좀 더 오래 남겠지;;

'프로그램 > ORACLE' 카테고리의 다른 글

오라클 12c 설치  (0) 2016.12.16
오라클 12c 계정만들기  (0) 2016.12.16
오라클 sysdba접속 방법  (0) 2016.12.16
[오라클] WM_CONCAT 함수 사용하기  (0) 2016.11.30
[오라클] TRIGGER 구문 정리  (0) 2016.11.30
Posted by 숏퐁숑
, |

오라클 sysdba 접속 방법

* conn /as sysdba;

또는,

* connect sys/oracle as sysdba;



현재 포트 확인 명령

* select dbms_xdb.gethttpport() from dual;



포트번호를 9090으로 변경

* exec dbms_xdb.sethttpport(9090);



오라클 11g hr 계정 활성화

* conn /as sysdba;

* alter user hr identified by hr account unlock;

→ sys계정으로 로그인해야만 위의 명령어 사용가능. 두번째에 나오는 hr은 password. 원하는 password 입력

* conn hr/hr;



기타 오라클 계정 생성

* create user id identified by password;

→ id와 password에 원하는 id, 비밀번호 입력

비밀번호를 변경하고 싶다면,

* alter user id identified by password;



계정에 권한 부여하는 명령어

오라클 로그인 권한 부여

* grant create session to id;


테이블 생성 권한 부여

* grant create table to id;


테이블 스페이스 생성 권한 부여

* grant create tablespace to id;

 

 

오라클 12c버전 부터는 계정 생성및 권한 부여할 때 id값 앞에 c##을 붙여줘야한다.

'프로그램 > ORACLE' 카테고리의 다른 글

오라클 12c 계정만들기  (0) 2016.12.16
TNS 리스너가 없습니다.  (0) 2016.12.16
[오라클] WM_CONCAT 함수 사용하기  (0) 2016.11.30
[오라클] TRIGGER 구문 정리  (0) 2016.11.30
[오라클] MERGE INTO 구문 정리  (0) 2016.11.30
Posted by 숏퐁숑
, |

3.루아(Lua)란?

프로그램/Lua / 2016. 12. 10. 16:59

루아 공식 홈페이지 http://www.lua.org

루아 5.0 레퍼런스 매뉴얼 - 번역 http://blog.naver.com/darkrun/140058578565

레드 위키 루아 http://www.redwiki.net/wiki/wiki.php/Lua

 

 

 

 

루아의 사용

 

루아는 다른 프로그램에 내장해 외부에서 컨트롤 할 목적으로 사용되는 스크립트 언어이다.

즉 C/C++ 등과 함께 사용되어진다는 것, 루아 자체로는 언어의 규약이며 규약을 담은 파일이다.

따라서 이를 사용할 도구(실행 프로그램)가 필요하며 이를 통해서 루아의 스크립팅을 할 수 있다.

 

 

1. 자체 목적을 가진 외부 프로그램을 통한 루아 사용

 

루아 자체로는 C나 C++로 만든 함수에 직접 연결해 데이터를 외부로 빼는 목적으로 사용된다.

반대로말해 C/C++ 로 만든 프로그램에서 루아를 읽게 만들어 실행시 루아로 짠 스크립트 파일을 읽어들여 실행시킨다는 뜻이다.

C++ 에서 루아를 호출하거나 루아에서 C++ 함수를 호출해 사용해야 한다.

 

루아를 C/C++ 함수에 바인딩 시키는 작업에 도움되는 라이브러리들이 존재한다.

 

LuaBind http://www.rasterbar.com/products/luabind.html

루아를 C/C++ 함수에 바인드 해서 루아 스크립트에서 호출을 가능하게 해 주는 라이브러리 

 

LuaTinker http://gpgstudy.com/gpgiki/LuaTinker

우리나라에서 루아 바인드와 마찬가지 기능을 좀 더 가볍게 만든 라이브러리

 

 

2. 루아 실행을 목적으로 만들어진 루아 인터프리터를 통한 루아 사용

 

Lua Demo http://www.lua.org/cgi-bin/demo

루아 홈페이지에 있는 간단한 루아 스크립트용 엔진??(이라고 해야하나?? 컴파일러라고 해야하나?? 인터프리터라고 하긴엔....)


독립형 인터프리터(lua.exe) 루아 홈페이지에서 제공하는 루아를 직접 사용할 수 있도록 하는 작은 프로그램

인터 프리터를 통한 루아 사용 http://luabinaries.luaforge.net/download.html

루아 홈페이지에서 자신의 pc에 맞는 binary를 다운로드해 사용

 

Windows OS 용 바이너리

lua5_1_4_Win32_bin.zip Windows x86 Executables 
lua5_1_4_Win64_bin.zip Windows x64 Executables 
lua5_1_4_Win32_dll8_lib.zip Windows x86 DLL and Includes 
(Visual C++ 2005 Compatible)
lua5_1_4_Win64_dll8_lib.zip Windows x64 DLL and Includes 
(Visual C++ 2005 Compatible)

 

 

 

해당 파일을 다운받아 폴더에 풀면 'lua5.1.exe' 와 'luac5.1.exe'가 있다

lua5.1.exe - 루아 standalone interpreter(독립형 인터프리터)

luac5.1.exe - 루아 컴파일러

standalone... 공각기동대 생각나는건 나뿐인가..

 

interpreter를 통해 스크립트를 작성하면 컴파일러가 컴파일 해준다.

 

문제점 

interpreter를 사용한 스크립팅은 대화모드로 즉시 실행되므로 편집이 불가능하다.

(매개 변수를 지정하면 뭐 어케 된다는데 잘 모르겠다.) 

때문에 메모장이나 Editplus 같은 편집기와 interpreter를 연결시켜 편집기에서 작성해야한다.

 

메모장에서 lua사용하기 

programming in Lua에서 사용법이 나와있지만 제대로 되질않아 확인이 필요하다.

 

Editplus 에서 Lua 쉽게 실행하기  http://blog.naver.com/darkrun/140064672639

 

비주얼 스튜디오에서 루아 라이브러리 만들기 http://blog.naver.com/aozora18/70036810912

[출처] 루아(Lua)란?|작성자 화저

'프로그램 > Lua' 카테고리의 다른 글

2.루아 사용환경 갖추기  (0) 2016.12.10
Posted by 숏퐁숑
, |
메모장에서 보다 에디트플러스를 사용하면 훨씬 쉽게 코드를 작성할 수 있다.

1. EditPlus를 다운 받자
http://www.editplus.com/kr/download.html
위에서 다운 받거나
네이버에서 EditPlus를 치면 한글판을 다운 받을 수 있다.


2. 루아 를 다운 받자
 --루아는 이미 다운 받았으니 이전에 있던 경로에 추가 해주면 된다.

3. EditPlus용 Lua 문법 강조 파일 을 다운받고 추가 해준다.

==> 문법 강조 파일

 에디트 플러스를 실행시킨후 메뉴에서
도구 -> 영구적인 설정에 들어가자


 파일 종류  에서 추가를 눌러 Lua를 추가해주고
파일 확장자에 lua 를 해주고
구문파일에 아까 다운 받은 lua51.stx을 추가 해주자  ... 를 누르면 파일 경로를 설정해줄수 있다.
마지막으로 '자주 쓰는 파일'에 추가를 선택해주면된다.

4. 에디터플러스에 루아 인터프리터를 등록

 도구>사용자 도구 구성(C)에 들어가자
그런 다음에 다음과 같이 설정해주면된다.

 
그룹이름에  Lua 해주고
추가(D)를 누르고 실행 을 추가해준다.
그런다음에 밑에 있는 것들을 추가해주면된다.
명령(0) 는 루아를 다운받았던 곳으로 찾아가서 추가 해주면 된다. lua5.1.exe를 추가해주자 실수로 luac5.1.exe를 해주면 안된다.
인수와 디렉토를 위와 같이 추가해주고 출력 내용 캡쳐를 선택해주면된다.
이렇게 해주면 원하는 루아 코드를 넣어주고 ctrl + 1을 눌러면 컴파일이 되고 실행 결과가 보일것이다. ㅎㅎㅎ

제대로 되었다면 이렇게 나오게 될것이다 ㅎ

 

'프로그램 > Lua' 카테고리의 다른 글

3.루아(Lua)란?  (0) 2016.12.10
Posted by 숏퐁숑
, |

이클립스의 단축키를 알아두면 개발시 유용한 것들이 많이 있다. 개발하면서 요정도 단축키를 상식적으로 알아두면 개발시간을 많이 단축시켜줄 것이다.

 

?1) 코딩을 할 때 라인 번호가 있으면 개발이 쉽다.

Window > Perferences > General > Editors > Text Editors > Show line numbers(항목의 체크박스에 체그하면된다)

 

2) 코드 스타일 바꾸기
Windows > Prefrences > Java > Code Style > Formatter
하나를 만들어서 그거 이용하도록
에디터에서 적용방법 : Ctrl + Shift + F 또는 Source > Format
특정부분만 적용하려면 블록 후 Ctrl + Shift + F

3) 퍼스펙티스 설정 저장
WIndow > Save Perspective As

4) 코드 어시스트 Ctrl + Space
for, while 자동완성
sysout 자동완성
템플릿 설정은 Preferences
Java > Editor > Templates
Actio 정도만 치고 Ctrl+Space를 치면 적당한 후보를 내준다.
for(int i = 0; i < array.length; i++)
이거 치기 귀찮다
for만 치시고 ctrl+space 누르시면
슈루룩 완성된다.
중간에 바꿔야 할건 tab키를 이용하면 바꿀 수 있다. 이건 습관되면 코딩 속도도 빨라지고 편해진다 ㅋ
 
5) Quick fix

에러난 줄에 노란전구가 있으면 Ctrl + 1 눌러서 방법중 하나 고르면 수정된다.
빨간 줄이 보이세요? 커서를 올려놓고 기다려보자.
올려놓고 기다리시면 왜 빨간줄이 나왔는지 나온다.
도대체 어떻게 고쳐야할지 모르겠다 싶으시면
한번 Ctrl+1을 눌러보면 알아서 고쳐줄지도 모른다.  

6) Quick Type Hierarchy
메서드, 타입, 패키지를 선택하고 Ctrl + T
한번 더 누르면 뒤집어짐

 

7) Quick Outline
Ctrl + 0 키를 누르면 바로 필터링됨

 

8) 소스 코드 네비게이션
정의로 바로가기 : F3
다시 돌아오기 : Alt + <- , 다시 정의보기 : Alt + ->
Ctrl 누르고 있으면 각 요소가 하이퍼링크 모양으로 바뀜 : 이때 마우스 클릭시 이동
해당라인 이동 : Ctrl + L
 
9) Mark Occurences
툴바버튼이 눌려있으면 커서가 위치한 요소는 사용처가 다 보인다

 

10) getter, setter, 생성자
소스에서 Source > 해서 Generate getter and setter~ 선택해서 원하는 함수를 만들어준다.

 

11) 소스 비교
우클릭 > Compare with > Local History
Replace With > Local History
Restore from Local HIstory

 

12) 에디터간 이동
많아지면 오른쪽 >> 클릭
Ctrl + F6 : 

13) 뷰 간 이동
Ctrl + F7

 

14) 퍼스펙티브간 이동
Ctrl + F8

 

15) 에디터로 돌아오기
어디에 있든지 F12 키 누르면 현 에디터로 돌아온다.
 
16) 찾기
점증적찾기 : Ctrl + J (아래에 Incremental File표시)
그리고 단어입력
그리고 Ctrl + J 클릭시 다음단어 찾음 (Ctrl + Shift + J는 반대)
블록선택후 Ctrl + K 클릭시 다음단어
검색기능
일반 검색 : Ctrl + F
마우스로 드레그한 항목 아래로 검색 : Ctrl + K
마우스로 드레그한 항목 위로 검색 : Ctrl + Shift + K
실시간 타이핑 검색 (아래로) : Ctrl + J
실시간 타이핑 검색 (위로) : Ctrl + Shift + J

 

17) 소스 편집
원하는 라인으로 이동 : Ctrl + L
한 라인 삭제 : Ctrl + D
주석처리 : Ctrl + Shift + / ---> 형태 : /* */
Ctrl + / ----> 형태 : //
자동 들여쓰기 정리 : Ctrl + I
자동으로 임포트하기 : Ctrl + Shift + O
소스창 전체화면 전환 : Ctrl + M
System.out.println(); 간단하게 입력하기 : sysout 입력 후 Ctrl + Space
try { } catch { } 간단하게 입력하기 : try 입력 후 Ctrl + Space
for문 간단하게 입력하기 : for 입력 후 Ctrl + Space
열린파일 이동할때 리스트 항목을 보고 선택하기 : Ctrl + F6
Ctrl + Shift + O - Organize Imports
저장전에는 필히 import 구문을 정리 해주시고..
Ctrl + Shift + F - Reformat source
저장전 소스 들여쓰기도 자동으로 정리해주시고
Alt + Shift + J - Java Doc Comment Create
아직도 Java Doc을 안다는가.. 달어줘라 개발자의 센스다. 일일히 타이핑 하는가..
이젠 이단축키 하나로.. 메소드나 클래스 명에 위치시키고 눌러봐라. 파라미터, throws를 분석하여 친절하게 Doc주석을 달어준다.
--------------------------------------------------------------------------------
1. 옮길 문장이 있는 줄을 아무데나 클릭한다.
2. Alt키와 화살표(위로)키를 누른다.
--------------------------------------------------------------------------------
 
18) 리펙토링
1. Source 메뉴에는 재미있는 기능이 많다.
- source =>Generate Getter and Setter를 보면
그동안 여러분을 괴롭혔던 mutator와 accessor를 편하게 구현하실 방법이 들어있다.
- source => Generate Constructors using Fields에서는
class variable만 선언하면 constructor가 자동으로 만들어지게 해준다.

ALT + SHIFT + Z = 블록설정 후 try-catch 문 덮어서 만들어주기

 

19) 디버깅
2. 버그가 있으십니까? 디버깅을 해보세요. (고급기능, 그러나 유용한 기능)
Ctrl+Shift+B를 누르면 breakpoint가 걸리고,
F11을 누르면 디버그 모드로 실행이 된다.
디버그 모드에서는 breakpoint의 위치에서 어떤 변수가 어떤 값을 가지는지 볼 수 있다.
한줄 한줄 실행해가며(보통 F6, 함수로 들어갈때 F5) 볼 수 있다.
아. 디버깅을 하시다보면 perspective(창의 배치)가 달라진다.
이때 디버깅을 마치고 돌아오시려면 오른쪽 위에 Debug / Java라고 쓰인 곳에 가셔서 Java를 선택하든 원하는 작업공간을 선택하면 도니다.
 
20) 주석 처리?
Ctrl + Shift + / - ins?tantly toggling comments
소스를 일일히 주석처리 하는가. 블로 주석이라면 마우스로 긁어서 한번에 주석처리 하자.
 
21) 기타
Alt +Shift + T - Show Refactor Quick Menu
팝업에 Refactor 선택에 명령어 수행 너무많은 시간이 소비된다. 한번에 단축키로 호출하자

 

22) 단축키호출
Ctrl + Shift + L - Hotkeys Table Call
이클립스의 핫키 목록을 볼수있는 핫키
Eclipse 단축키 확인 및 변경
Eclipse의 모든 단축키는 Window >> Preferences >> Workbench >> Keys 메뉴에서 확인 및 변경이 가능하다. 그 동안 다른 툴에서 자신의 손에 익숙한 단축키들이 있다면 이 메뉴에서 단축키들을 변경하는 것이 가능하다.
Java Editor 단축키
Ctrl + Shift + M : 캐럿이 위치한 대상에 필요한 특정 클래스 Import 시키기
Ctrl + Shift + O : 소스에 필요한 패키지를 자동으로 Import 시키기
Ctrl + Shift + F : 소스코드 자동 정리
Ctrl + Shift + G : 특정 메써드나 필드를 Reference하고 있는 곳을 찾는다.
Ctrl + Shift + K : 이전찾기 (또는, 찾고자하는 문자열을 블럭으로 설정한 후 역으로 찾고자 하는 문자열을 찾아감.)
Ctrl + shift + G : 특정 메써드나 필드를 참조하고 있는 곳을 찾는다.
Ctrl + shift + B : 현재커서위치에 Break point설정/해제
Ctrl + 1 : Quick Fix. 에러가 발생했을 경우 Quick Fix를 통해 쉽게 해결이 가능하다.(Rename에 주로 사용)
Ctrl + 2 + R : Rename (리팩토링)
Ctrl + Shift + / : 선택 영역 Block Comment 설정
Ctrl + Shift + : 선택 영역 Block Comment 제거
Ctrl + / : 한줄 또는 선택영역 주석처리 / 제거
Ctrl + S : 저장 및 컴파일
Ctrl + I : 소스 깔끔 정리(인덴트 중심의 자동구문정리)
Ctrl + space : 어휘의 자동완성(Content Assistance)
Ctrl + Q : 마지막 편집위치로 가기
Ctrl + L : 특정줄번호로 가기
Ctrl + D : 한줄삭제
Ctrl + O : Outline 창 열기
Ctrl + H : Find 및 Replace
Ctrl + K : 다음찾기(또는, 찾고자 하는 문자열을 블럭으로 설정한 후 키를 누른다.)
Ctrl + N : 새로운 파일 및 프로젝트 생성
Ctrl + Shift + S : 열려진 모든파일 저장 및 컴파일
Ctrl + 객체클릭(혹은 F3) : 클래스나 메소드 혹은 멤버를 정의한 곳으로 이동(Open Declaration)
Alt + Shift + UP : 커서를 기준으로 토큰단위 블럭지정 (괄호의 열고 닫기 쌍 확인에 유용) ==> 괄호의 뒤에 마우스 커서를 위치시킨 후 더블클릭한 것과 같은 효과
Alt + Shift + DOWN : 커서를 기준으로 토큰단위 블럭해제
Alt + Shift + J : 설정해 둔 기본주석을 자동으로 달기 (메소드나 멤버변수에 포커스 두고 실행)
Alt + / : Word Completion
Alt + Shift + R : Rename
Alt + ->, Alt + <- : 이후, 이전
해당 프로젝트에서 Alt + Enter : Project 속성
sysout > Ctrl + Space : System.out.println();
try > Ctrl + Space : 기본 try-catch문 완성
for > Ctrl + Space : 기본 for문 완성
템플릿을 수정,추가 : Preferences > java > editor > Templates
Ctrl + Alt + R
Ctrl + F11 : 실행
F11 : 디버깅 시작
F5 : step into
F6 : step over
F8 : 디버깅 계속
Ctrl + .
 
23) 에러위치로 이동
Ctrl + '.'
 
24) 키보드로 코드블럭 이동
Alt + 위 화살표 혹은 아래 화살표
 
25) 나의 포맷 적용
Ctrl + Shift + 'F'

 

 

단축키는 몰라도 상관이 없다. 단축키 모른다고 개발을 못하는 건 아니다. 하지만 자주 쓰면서

유요한 단축키들을 알아둔다면 개발을 좀더 편하게 빠르게 할 수 있을 것이다.

Posted by 숏퐁숑
, |

간단하게 정리하기 어려운 내용인것 같다. 토비의 스프링 프레임워크 책을 보아도 이해안가는 부분도 많다.

하지만 현재 전자정부 프레임워크를 쓰면서 기존의 내용을 알고 정리해 놓으면 좋을것 같아서 정리해 보려고 한다.


MVC 개념이란 무엇일까?

Spring이란 무엇일까?  SPRING MVC란? 


MVC 개념은 화면에서 보여주는 V(View), 데이터 처리관리는 M(Model)

V(View)와 M(Model) 를 연결시켜주는 C(Controller)  각 첫글자를 따서 MVC 라고 한다.

MVC개념은 User Interface 부분을 담당하는 부분과 실제 처리가 일어나는 부분을 최대한 서로 분리시켜 디자이너와 프로그래머 사이에 종속성을 최대한 줄이기 위한 방법론 중 하나이다. 또한 웹 개발을 하면서 클라이언트에서 요청시 처리 로직을

거쳐 데이타 처리를 하여 화면에 매핑시켜주는 일련의 반복적인 과정을 MVC 개념이라고 하겠다. 


Spring은 간단히 스프링이라 지칭하지만 정확하게는 스프링 프레임워크 (Spring Framework) 라고 하는 것이 정확한 표현이다.

즉, 스프링은 자바 프레임 워크중 한 종류를 말한다.  프레임 워크에는 스트러츠, 스트러츠2, 스프링 등 여러 종류가 있는데, 처음

회사에 들어오기 전에는 스트러츠와 스트러츠2로 웹개발을 했던 기억이 있다. 회사에 들어와서는 스프링 2.5 부터시작해서 3.0

지금은 전자정부 프레임워크를 사용하기까지 다양한 자바 프레임워크를 경험해본 결과... 자바기반의 프레임 워크 중에는 스프링프레임워크가 가장 확장성이 좋고 사용하기 좋은 것 같다.  프레임워크의 버전이 올라갈 수록 개발자가 할 일과 신경쓸일이 줄어드는 것은 분명하다.(단, 잘 설계되어진 프레임워크를 사용한다는 가정)   많은 기능(보안,로그,라이브러리관리 등등) 들을 지원해 주기 때문에 공통/표준 설계자가 처음 프레임워크 설계만 잘해서 준다면 개발자들은 별 신경 없이 개발에만 집중할 수 있다. 토비의 스프링프레임워크 3.1에서는 자바 엔터프라이즈 개발을 편하게 해주는 오픈소스 경량급 애플리케이션 프레임워크라고 정의하고 있다.   프레임워크란 집을 짓는것을 예로 들면 말 그대로 집의 틀을 구성한다는 의미인데 그 틀을 어떻게 구성하느냐에 따라서 살만 붙히면 집이 완성되기 때문에 중요한 부분을 차지하는 것은 분명하다. 스프링 프레임워크를 정리하기엔 너무 많은 내용(POJO,AOP,DI,IoC 등등)들이 있으니 나중에 다시 보도록 하고, 본론으로 들어가 SPRING MVC 패턴이 무엇인지 정리해 보려 한다.


Spring MVC는 위에서 설명한 기본적인 요소 Model,View,Controller외에도 많은 컴포넌트들이 있다.

DispatcherServlet, HandlerMapping, Controller,Interceptor,Viewresolver,View 등 컴포넌트들이 존재하며

각 역활이 명확하게 분리되어 있다.


아래 설명은 각 컴포넌트들의 역활에 대한 설명이다.

 


아래 그림은 스프링MVC 패턴의 흐름을 잘 설명해주는 그림으로 정말 여러번 보았지만 꾀 오랫동안 이해 가지 않았던 MVC흐름도이다. 지금 전체적인 그림은 아니지만 MVC 각 모듈이 어떤 일들을 하면서 진행되는지 알 수 있다.



클라이언트가 요청을 하면 위 그림처럼 DispatcherServlet이 가장 먼저 요청을 받아 어느 Controller에서 일을 진행할지 정하기위해 HandlerMapping을 통해 리턴 받는다. Controller가 정해지면 해당 컨트롤러에서 인터페이스를 호출하고, 인터페이스 구현부를 호출하여 비즈니스 로직(Impl)을 수행하게 된다. 비즈니스 로직 단계에서 필요한 데이터들은 Dao를 호출하여

데이터 처리를 하며 DB에서 가져온 데이터를 Controller단계까지 가져와 화면과 매핑해주게 된다.

이때 데이터들을 담는 통?을 모델(model)이라고 하며 모델에 담겨온 정보들을 View Resolver에서 해당 화면과 매핑하는

작업을 하여 결과값을 리턴 해주고 마지막으로 데이터가 담겨있는 Model을 View로 던져주면 모든 클라이언트 Request 에 대한 Response 작업이 완료되어진다. 크게 클라이언트 요청이 시작되면 Presentation Layer => Business Layer => Data Layer 순으로 흘러가며 작업이 이루어 지는데 간단하게 정리해 보았다. 참고로 위의 그림은 Presentation Layer에서 클라이

언트 요청이 들어왔을때 이루어지는 흐름만 표현되어져 있다.


정리해 본다고 글을 적어보긴 했는데 정리하면서도 느끼는 것이지만 역시나 어렵다.  정리하자면 프레임워크에는 스트러츠, EJB,

스트러츠2, 스프링 등이 있고, 대부분 프로젝트에서 자바기반 프레임워크로는 가장 효츌적인 스프링프레임워크를 사용하고 있다.

물론 전자정부 프레임워크를 도입해 쓰기 시작했지만...

이 스프링프레임워크를 이해하기위해 Spring MVC 패턴에 대해 공부해 보았는데 더 깊은 이해를 위해서는 토비의 스프링프레임워크 3.5를 추천한다. 앞으로 클라우드 기술 표준을 잡기위해 공부해야할 부분이 많이 있는데~  다음에 시간이 되면 스프링프레임워크가 무엇이며 전자정부 프레임워크가 왜 나오게 되었는지에 대해서 간단히 정리해 보도록 하겠다.

Posted by 숏퐁숑
, |

CONCAT 함수는 입력되는 두 문자열을 연결하여 반환한다.

문자열의 데이터타입은 CHAR, VARCHAR2, NCHAR, NVARCHAR2, CLOB, NCLOB이며, 두 문자열 데이터 타입이 같으면, 그와 같은 데이터타입을 반환한다. 하지만 입력되는 두 문자열의 데이터타입이 다를 경우 NCLOB 데이터타입으로 반환된다.

 

【형식】

CONCAT( char1, char2 )

 

 

【예제】

SQL> select concat('My name is','홍길동') from dual;

-----------------------------------------------------------------

My name is 홍길동

 

 

단순히 문자열을 연결하여 반환하는 함수로? CONCAT는 오라클에서 자주 사용하는 익숙한 함수이다.

오늘 정리하고 싶은 WM_CONCAT 함수는 데이터가 그룹화 되어져 있을 때 여러행(Row)의 값을 하나의 컬럼으로 합쳐서

조회 할 수 있는 막강한 기능이라 정리해 보고자 한다.

 

예제) 아래 예제는 각 부서의 사람들의 이름을 한 ROW에 합쳐서 보여주고 싶을 때 ...

 

table name: dept_tb
dept_name || emp_name
=========================
인사과         영수
인사과         철수
인사과         민수
인사과         길동
=========================
 

SELECT wm_concat(emp_name)
FROM dept_tb
GROUP BY dept_name;
※ 단, 여기서 select 결과가 다음과 같이 'oracle.sql.CLOB@e62121' ? clob의 주소값을 반환하고 있는 경우가 있는데... 
이때, TO_CHAR로 감싸서 반환해주면 해결된다! 혹시 그래도 해결이 안된다면... 전자정부프레엠워크 사용시 
Oracle의 경우는 iBatis를 위한 sqlMapClient bean 설정 시 다음과 같이 lobHandler를 등록해 주어야 한다. 
(ex: context-sqlMap.xml)  보통은 공통 잡는 분들이 프레임워크 잡을떄 당연 추가하겠지만 혹시나..!!! 

<bean id="lobHandler" class="org.springframework.jdbc.support.lob.DefaultLobHandler" lazy-init="true" />

SELECT to_char(wm_concat(emp_name))
FROM dept_tb
GROUP BY dept_name;

 

[결과]

 

===============================
dept_name || emp_name
===============================
인사과         영수,철수,민수,길동
===============================

콤마 제거하고 조회 하고 싶을땐 (replace나 translate 함수) : 문자열을 치환해 주는 기능을 하는 표현식
※ 단순 문자열 치환 : TRANSLATE('대상문자열', '비교문자', '바꿀문자')?
SELECT translate(wm_concat(emp_name),'a,','a ')
FROM dept_tb
GROUP BY dept_name;
[결과]?

==============================
dept_name || emp_name
==============================
인사과     영수철수민수길동
=============================

WM_CONCAT 함수에 대해 정리해 보았다. 알면 정말 유용한 오라클 함수들!! 모르면 정말 어떻게 해야할지 
많은 고민들로 시간을 보내는 경우가 허다한데... 한 번 잘 정리해 놓고 이용하면 좋을 듯 싶다!

'프로그램 > ORACLE' 카테고리의 다른 글

TNS 리스너가 없습니다.  (0) 2016.12.16
오라클 sysdba접속 방법  (0) 2016.12.16
[오라클] TRIGGER 구문 정리  (0) 2016.11.30
[오라클] MERGE INTO 구문 정리  (0) 2016.11.30
[Oracle]오라클 잡 스케줄러 생성  (0) 2016.11.30
Posted by 숏퐁숑
, |
트리거 구문 정리해 보려 한다. 잘 알아두면 유용하게 쓰이는 오라클 구문이기에 이렇게 정리하는 것이 큰 도움이 될 것 같다.

오라클 JOB을 걸면 일정 주기마다 DML(INSERT,UPDATE,DELETE) 작업을 수행하게 하여 TABLE에 데이터 작업을 해줄 수 있다. 일정 주기나 시간이 아니라, TABLE에 어떤 이벤트가 발생했을 때 알아서 오라클에서 내가 정의 해놓은 작업들을 수행해 준다면 얼마나 좋을까? .... 바로 이때 사용 할 수있는 오라클 구문에는 트리거(TRIGGER)가 있다. 

 

1. 트리거(TRIGGER) 정의

 

- 테이블에 어떤 이벤트가 발생했을 때, 자동으로 사용자가 정의한 PL/SQL 명령을 실행 할수 있는 구문이다. 

 

 

2. 트리거(TRIGGER)  생성 구문

 

CREATE [OR REPLACE] TRIGGER 트리거명 [BEFORE | AFTER]
triggering-event[Insert,delete,update] ON 테이블명
[Referencing OLD AS {변경전 값을 참조하는 변수명} NEW AS {변경 후 값을 참조하는 변수명}]
[FOR EACH ROW]

[WHEN (condition)]?
DECLARE
--변수선언
BEGIN
--트리거 PL/SQL 명령 작성
EXCEPTION
END;

 

#구문에 대한 상세 설명#

  • CREATE [OR REPLACE] TRIGGER [schema.]trigger : 트리거 생성, 재생성 명령이다?
  • BEFORE : INSERT, UPDATE, DELETE문이 실행되기 전에 트리거가 실행 된다.
  • AFTER : INSERT, UPDATE, DELETE문이 실행된 후 트리거가 실행 된다.
  • trigger_event : INSERT, UPDATE, DELETE 중에서 한 개 이상 올 수 있다.
  • FOR EACH ROW : 이 옵션이 있으면 행 트리거가 된다.

     - 행수준 트리거(Row -Level Triggers) : 트랜잭션내의 각 행에 대해 한 번만 수행(컬럼의 각각의 행의 데이터 행 변화가 생길 때마다

                                                           실행되며,각 데이터 해의 값을 제어할 수 있다.)
     - 문장수준 트리거(Statement-level Triggers) : 트랜잭션내에서 한번만 수행되며, 컬럼의 각 데이터 행을 제어 할 수 없다.

  • [WHEN (condition)]] : 데이터의 처리유형 이외의 조건을 삽입할 경우에 사용???????????

    ※ 따라서, 위의 옵션을 어떻게 사용하느냐에 따라 만들수 있는 트리거 유형은

    트리거 이벤트(INSERT,UPDATE,DELETE) 3종류, FOR EACH ROW 유무에 따른 2종류, Before와 After에 대해 2종류로

    3*2*2 = 12가지 유형을 만들 수 있다.


    3. 트리거(TRIGGER)  생성시 고려사항

     

    1. 트리거는 각 테이블에 최대 3개까지 가능하다

    2. 트리거 내에서는 COMMIT,ROLLBACK 문을 사용할 수 없다.

    3. 이미 트리거가 정의된 작업에 대해 다른 트리거를 정의하면 기존의 것을 대체한다.

    4. 뷰나 임시 테이블을 참조할 수 있으나 생성 할 수는 없다.

    5. 트리거 동작은 이를 삭제하기 전까지 계속된다.

     

    4. 트리거(TRIGGER)   활성 / 비활성화

     

    ALTER TRIGGER [schema.]trigger DISABLE;   ==> 비활성화

    ALTER TRIGGER [schema.]trigger ENABLE; ==> 활성화

     

    5. 트리거(TRIGGER)  상태  확인

     

    select table_name, status from user_triggers; => 테이블 명과, 트리거 활성 상태를 확인 할 수 있다.

     

    6. 트리거(TRIGGER)  삭제 구문

     

    DROP TRIGGER [schema.]trigger

     

    7. 트리거(TRIGGER)  작성 예문

     

    예문 1) 테이블 변경 이력 관리를 위한 TRIGGER 구문

     

    ?CREATE OR REPLACE TRIGGER NAMDM.RECORD_CHANGE_LOG_TO_MDMTB090
    AFTER DELETE OR INSERT OR UPDATE
    OF VALUE
    ON NAMDM.MDMTB010
    REFERENCING NEW AS NEW OLD AS OLD
    FOR EACH ROW
    BEGIN
      -- your code here
      -- (Trigger template "Default" could not be loaded.)  
     
      IF :NEW.VALUE != :OLD.VALUE THEN   -- 값이 변경된 경우만 저장!!!
        INSERT INTO mdmtb090
        (
          SEQ, ITEM_ID, ATTR_ID, SCOPE,
          OLD, NEW, BIGO, CHG_EMP, DAT 
        )
        VALUES
        (
          MDM_TRIGGER_SEQ.NEXTVAL, NVL(:NEW.ITEM_ID,:OLD.ITEM_ID), NVL(:NEW.ATTR_ID,:OLD.ATTR_ID), NVL(:NEW.SCOPE,:OLD.SCOPE),
          :OLD.VALUE, :NEW.VALUE, '', :NEW.CHG_EMP, SYSDATE
        );
      END IF;
    END;

     

    예문 2) 테이블에 이벤트 발생시 다른 테이블에 MERGE 하기 위한 TRIGGER 구문

     

    CREATE OR REPLACE TRIGGER NATEST.CALL_ACT_CONFIRM
    AFTER DELETE OR INSERT OR UPDATE
    OF IF_FLAG
    ON NATEST.TEST_IF
    REFERENCING NEW AS NEW OLD AS OLD
    FOR EACH ROW
    BEGIN
       
         IF :NEW.IF_FLAG = 'S' AND (:NEW.REVISION_ID <> '000' OR :NEW.REVISION_ID <> 'MRP' OR  :NEW.REVISION_ID <> 'EXT') THEN
            --SP_TESTTB020_PROCESS('ACT', 'CONFIRM',:NEW.M00001,:NEW.REVISION_ID,:NEW.M00069,:NEW.ASSINGEE_ID);
              /* 4-2-1. TESTTB010로 데이터 복사 */
            MERGE INTO TESTTB010 ORG
            USING (
                        SELECT    T1.ITEM_ID,
                                T1.ATTR_ID,
                                T1.SCOPE,
                                T1.VALUE    WORK_VALUE,
                                T1.CHG_EMP,
                                T1.CHG_DATE
                        FROM    TESTTB011    T1,
                                TESTTB020    T2
                        WHERE    T1.ITEM_ID    = T2.ITEM_ID
                        AND        T1.REV_NO    = T2.REV_NO
                        AND        T2.STATUS    = 'A'
                        AND        T1.ITEM_ID    = :NEW.M00001
                        AND        T1.REV_NO    = :NEW.REVISION_ID    
                        AND        T2.PLANT    = :NEW.M00069     
                        AND        (T1.SCOPE = 'G' OR T1.SCOPE = 'C' OR T1.SCOPE = T2.REGION OR T1.SCOPE = T2.COMPANY OR T1.SCOPE = T2.PLANT)
                  ) TMP
              ON  (
                        ORG.ITEM_ID    = TMP.ITEM_ID
                  --AND    ORG.REV_NO     = TMP.REV_NO
                  AND    ORG.ATTR_ID    = TMP.ATTR_ID
                  AND    ORG.SCOPE    = TMP.SCOPE
                  ) WHEN MATCHED THEN
                         UPDATE
                            SET    ORG.VALUE        = TMP.WORK_VALUE,
                                ORG.CHG_EMP        = TMP.CHG_EMP,
                                ORG.CHG_DATE    = TMP.CHG_DATE
                    WHEN NOT MATCHED THEN
                    INSERT
                    (
                      ORG.ITEM_ID, ORG.ATTR_ID, ORG.SCOPE, ORG.VALUE, ORG.CHG_EMP, ORG.CHG_DATE
                    ) VALUES
                    (
                      TMP.ITEM_ID, TMP.ATTR_ID, TMP.SCOPE, TMP.WORK_VALUE, TMP.CHG_EMP, TMP.CHG_DATE
                    );
                   
            /* 4-2-2. ACT 데이터 'Y' */
            MERGE INTO TESTTB020 ORG
            USING (
                    SELECT    TO_CHAR(SYSDATE,'YYYYMMDD') PROC_DATE,
                            ITEM_ID,
                            REV_NO,
                            'A'            STATUS,
                            REGION,
                            MATR_TYPE,
                            FUNC_ROLE,
                            COMPANY,
                            PLANT,
                            'Y'            CONFIRM,
                            :NEW.ASSINGEE_ID   CHG_EMP
                    FROM     TESTTB020
                    WHERE    ITEM_ID    = :NEW.M00001
                    AND        REV_NO = :NEW.REVISION_ID    
                    AND        PLANT    = :NEW.M00069    
                    AND        STATUS    = 'C'
                   
                  ) TMP
              ON  (
                        ORG.ITEM_ID    = TMP.ITEM_ID
                  AND    ORG.REV_NO     = TMP.REV_NO
                  AND    ORG.STATUS    = TMP.STATUS
                  AND    ORG.REGION    = TMP.REGION
                  AND    ORG.MATR_TYPE    = TMP.MATR_TYPE
                  AND    ORG.COMPANY        = TMP.COMPANY
                  AND    ORG.PLANT        = TMP.PLANT
                  ) WHEN MATCHED THEN
                         UPDATE
                            SET    ORG.CONFIRM        = TMP.CONFIRM,
                                   ORG.EMP_NO         = TMP.CHG_EMP,
                                   ORG.CHG_DATE       = SYSDATE
                    WHEN NOT MATCHED THEN
                    INSERT
                    (
                      ORG.PROC_DATE, ORG.ITEM_ID, ORG.REV_NO, ORG.STATUS, ORG.REGION, ORG.MATR_TYPE, ORG.COMPANY, ORG.PLANT, ORG.CONFIRM, ORG.EMP_NO, ORG.CHG_DATE
                    ) VALUES
                    (
                        TMP.PROC_DATE, TMP.ITEM_ID, TMP.REV_NO, TMP.STATUS, TMP.REGION, TMP.MATR_TYPE, TMP.COMPANY, TMP.PLANT, TMP.CONFIRM, TMP.CHG_EMP, SYSDATE
                    );
         END IF;
         IF :NEW.IF_FLAG = 'S' AND (:NEW.REVISION_ID = '000' OR :NEW.REVISION_ID = 'MRP' OR  :NEW.REVISION_ID = 'EXT') THEN  
            MERGE INTO TESTTB010 ORG
            USING (
                    SELECT T1.ITEM_ID,
                            T1.ATTR_ID,
                            T1.SCOPE,
                            T1.VALUE WORK_VALUE,
                            T1.CHG_EMP,
                            T1.CHG_DATE
                    FROM TESTTB011 T1,
                            MDTAT010 T4
                    WHERE T1.ITEM_ID = :NEW.M00001
                    AND     T1.REV_NO = :NEW.REVISION_ID
                    AND  T1.ATTR_ID = T4.ID
                    AND  (T1.SCOPE = 'G' OR T1.SCOPE = 'C' OR T1.SCOPE = :NEW.REGION OR T1.SCOPE||'C' = (SELECT DISTINCT COMPANY FROM MDTCT050 WHERE PLANT = :NEW.M00069)||T4.CONTROL_LEVEL OR T1.SCOPE||'P' = :NEW.M00069||T4.CONTROL_LEVEL)     
                  ) TMP
              ON  (
                        ORG.ITEM_ID = TMP.ITEM_ID
                  --AND ORG.REV_NO  = TMP.REV_NO
                  AND ORG.ATTR_ID = TMP.ATTR_ID
                  AND ORG.SCOPE = TMP.SCOPE
                  ) WHEN MATCHED THEN
                         UPDATE
                            SET ORG.VALUE  = TMP.WORK_VALUE,
                                    ORG.CHG_EMP  = TMP.CHG_EMP,
                                    ORG.CHG_DATE         = TMP.CHG_DATE
                    WHEN NOT MATCHED THEN
                    INSERT
                    (
                      ORG.ITEM_ID, ORG.ATTR_ID, ORG.SCOPE, ORG.VALUE, ORG.CHG_EMP, ORG.CHG_DATE
                    ) VALUES
                    (
                      TMP.ITEM_ID, TMP.ATTR_ID, TMP.SCOPE, TMP.WORK_VALUE, TMP.CHG_EMP, TMP.CHG_DATE
                    ); 
         END IF;
                    
        END;

  •  

    Posted by 숏퐁숑
    , |

    최근에 달린 댓글

    글 보관함