Tag Archives: ORACLE

Classic ASP with Oracle Database

Classic ASP는 아직도 많이 사용된다. (cba)
일반 웹사이트에서는 많이 없어졌지만 Legacy System.에는 아직도…
새로 만드는 곳도 간혹 그냥 ASP로 하기도 한다.

용도는 주로 관리자 사이트, 소규모 쇼핑몰.

 

소규모 SI업체에서 일을 하다보면 이 꼴도보기 싫은 Legacy System을 설치/수정해야 할 일이 생긴다.
(새로 만들고 – 메뉴얼 문서작성한 다음에 유지보수팀에 인수인계 하기 싫으면 그냥 해야지)

시스템 엔지니어도 Windows서버 잘 하는 사람도 잘 없고.. ClassicASP와 얽혀있는 문제는 잘 해결이 되지 않는다. IIS설정과 DB연결에서부터 심각한 문제가 발생한다.

잘 알지도 못하면서 보다보니 순수 투입시간만 10시간은 여기저기 찾아보고 삽질 반복한 것 같다.

 

WebServer(IIS)

IIS설정은 그래도 검색하면서 하면 금방 처리 된다.
http://tutorial.beansugar.org/w/WindowsServer:IIS

Database(ODBC)

보통 IIS설치하고 ASP첫화면 뜨는거 보고 끝난줄 알지만…
사실 여기서 고생 시작이다.

ConnectionString은 다음과 같다.

ASP는 윈도우 기반 언어답게 윈도우 커넥션을 사용하는데… ODBC, OleDB, ADODB, ADONET.. .뭐 등등 있는 것 같은데… 사실 뭐가뭔지 잘 모르겠다.

ADO.NET 닷넷용이고 ODBC는 JDBC처럼 윈도우 구형 커넥션 프로토콜… ADODB는 ODBC Wrapper정도 아닐까? 생각해본다. (따로 찾아봐야겠다)

Oracle Provider에는 두가지가 있다.
Provider=msdaora.1 (32bit)
Provider=OraOLEDB.ORacle.1.1 (32bit, 64bit)
이름에서 알 수 있듯이 MS에서 제공하는 것과 Oracle에서 제공하는 것.
내가 설치한 프로젝트에서는 이 두가지를 함께 쓰고 있었다.

왜 두가지를 함께 쓰는지 이해할 수가 없었는데…
같은 프로시저를 실행시켜도 커넥션 스트링에 따라 돌아가기도 안돌아가기도 하더라..
OraOLEDB.Oracle.1.1을 이용해서 접속한경우에 아래의 쿼리를 돌리면 파라미터 개수가 안 맞는다고 오류가 난다.

out OUT_RESULT 이외에 out SYSREFCURSOR이 있는데 이것을 못 받아오고
이런 오류를 낸다.
PLS-00306: wrong number or types of arguments in call to ‘{procedure name}’

다른방법으로 호출을 해야되나보다.. LegacyCode를 그대로 쓰려면 커넥션 스트링을 두개 생성할 수 밖에… msdaora를 쓰려면 32bit Client를 써야한다.

Client 설치

Oracle.com에서 Server 버전에 맞는 클라이언트를 다운받는다. 내 경우에는 서버가 11gr2 11.2.0.4.0버전이었다.
(클라이언트 버전은 크게 상관없을지도 모르겠다. 어느정도 호환이 되니까)
32bit – win32_11gR2_client.zip – http://www.oracle.com/technetwork/database/enterprise-edition/downloads/112010-win32soft-098987.html
64bit – win64_11gR2_client.zip – http://www.oracle.com/technetwork/database/enterprise-edition/downloads/112010-linx8664soft-100572.html

설치할 때 instantclient로 설치하면 개발에 필요한 요소가 다 설치되지 않는다.(network/admin)
관리자 또는 런타임으로 설치하자.
그런데 마지막으로 성공했을 때 관리자로 했기 때문에 런타임으로 해도 잘 될지 모르겠다.

대강 경로는 비슷하다
C:\app\useruser\product\11.2.0\client_1\network\admin\tnsnames.ora

여기서 설치 완료

32비트 클라이언트를 사용하려면 IIS(인터넷 정보 서비스) 관리자에서 – 응용 프로그램 풀고급설정32비트 응용 프로그램 사용 = True로 변경해줘야한다. 기본값이 False로 되어 있다.
변경 후 IIS를 재시작 해보고.. 안되면 재부팅 해야한다.

 

ODBC 데이터 원본(32비트,64비트)

윈도우에서 이걸 설정 해 줘야 하는 줄 알았는데.. 안해도 된다.

 

 

ERRORS

 

*** 실패하면 완전 삭제 후 위 삽질을 반복하도록 한다

삭제는 D:\app\useruser\product\11.2.0\client_1\deinstall\deinstall.bat를 실행

제대로 안될때도 있는데 그 때는

1 서비스 종료
Oracle 관련 서비스 다 종료

2 레지스트리 삭제
시작 – regedit – Oracle 찾아서 삭제
HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\ODBC Drivers
HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\Oracle in OraClient11g_home2
HKEY_LOCAL_MACHINE\SOFTWARE\Oracle
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Oracle11
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet002\Services\Oracle11

3 설치파일 삭제
C:\Program Files (x86)\Oracle
C:\Program Files\Oracle
C:\ProgramData\Oracle

4 D:\app\useruser\product\11.2.0\client_1\
이 경로 통째로 삭제

MSSQL2008 -> Oracle12c Sqldeveloper이용 데이터 대강이전

어쩌다 보니 어느패션업체의 디비 마이그레이션업무를 처리하게 됐다.
직접 말한것은 아니고 기획자를 통해서 한다리 건너서 협의가 이뤄져서 정확히는 모르겠지만
전달받기로는 마이그레이션이 쉬운게 아니라고 설명을 하면 “그냥 해주면 안되요?” 라는 반응을 보였다는 것 같다.

고객사에서는 마이그레이션을 그냥 파일 카피 정도로 생각하는 것 아닐까?
내가 갔으면 말도안되다는것을 좀 더 강하게 어필했을 것 같은데…

디비 전환 이유는 …. 정확히 전달받지는 못했지만 데이터를 보니까 이해가 갔다.
데이터 상태를 보니 속도가 매우 느렸을 것 같다.
검색도 하지 않을 것 같은 로그테이블이 동일한 데이터베이스에 수백기가 쌓여 있었다
MSSQL이 느리니까 짷좋은 오라클로 옮기면 빨라지겠지? 정도의 판단이 아니었을까

그리고 기왕 마이그레이션을 하기로 마음을 먹었으면 안쓰는 테이블이라던가 프로시저들을 파악해서 정리를 하면 좋을텐데…

대~애충 빨리 해다라고 하니 그럴 수 밖에…

마이그레이션은 툴을 이용해서 처리하기로 했다.
유료는 안 써봐서 모르겠고 이전에도 몇 번 돌려봤는데 특정 쿼리문은 번역도 안되고 테이블도 몇 개씩 빼먹고 하는 경우가 많았다.
각 데이터베이스에 의존적인 키워드를 사용하는 경우 오류도 발생하고

툴은 SqlDeveloper 4.1.5를 사용하기로 결정
(고객사에서 추가비용 지출을 저언혀 생각하지 않고 있어서)

SqlDevelop – Tools – Database – Third Party JDBC Driver에 추가

jtds-1.3.1-dist

이래저래 필요한 셋팅하고서 마이그레이션 실행
오류가 이것저것 많이 발생했는데 주로 발생하는 문제는 인코딩 오류, 쿼리오류
인코딩은 초반에 잡아줘서 해결했지만.. 쿼리는… 일부는 포기하고 넘어갔다.

MSSQL 2008 -> Oracle12c
결과 : 쓸데없는 테이블을 생성 해 놓는다. 마이그레이션 결과기록 테이블인가?
데이터는 제대로 옮겨지지 않는다. (뭘 잘못한 것 같진 않고 12는 아직 지원되지 않는것 같다)

MSSQL2008 -> Oracle11gr2
결과 : 테이블과 데이터는 잘 옮겨졌다

Oracle11gr2 -> Oracle12c
여기서는 자동화 툴이 안돌아가고 쿼리로 백업받은 후에 다시 올렸다.
덤프는 뭔가 호환이 안되는 것 같다.
이 방법으로 하는경우 Clob은 이전이 안된다. Oracle Clob은 쿼리 insert가 안되서 Varchar4000으로 변경할 수 있는 부분은 변경하고 안되는 부분은 python script를 이용해서 처리했다.

 

야매이전 완료 후

Function, Procedure – 거의 다 깨진다.
View – 거의못쓸지경.. 다 지우는게 나을 것 같다
Table-Clob제외하고는 정상

처참하네.. 마이그레이션이라고 할 수 있을까?
오류가 날 대 마다 거의 다 손으로 처리해야하지 않을까 싶다.

일 해 놓고도 미안한 상황이다
정식 프로젝트가 아니라 더 시간을 할애할 수는 없으니 대강 마무리할 수 밖에…

Oracle 디비 백업 – expdp

expdp system/oracle@orcl directory=MY_DATA_PUMP dumpfile=shopmall.dump logfile=shopmall.dump schemas=shopmalljob_name=shopmall001

이 명령을 실행시키면..

다음 경고가 뜨면서 처리되지 않는다.

 

1. 이미 처리중이던 녀석이 남아있으면 안될 수 있다고

이걸 확인 해 보라는데…

 

또 안되네

2. 스트림 풀 사이즈를 늘려보라는데

안된다

3. DBA 디렉토리 등록

 

아직안됨…디비 깨짔나

 

질문할만한사이트가…

http://www.gurubee.net/
http://www.dator.co.kr/
http://www.dbguide.net/
http://database.sarang.net/

 

몇가지 더 확인 필요해 보이는 부분

http://www.dba-oracle.com/t_ora_31623_job_not_attached_to_session_via_specified_handle.htm

http://theone79.tistory.com/837

Oracle – python 연동

Oracle은 별로 쓰고싶지 않은데…  또…

이번엔 clob 데이터 문제… mssql의 데이터를 oracle로 옮겨야되는데… clob자료형이다.
sql developer에서 insert query로 뽑아내서 옮기려고 하는데 clob라서 안된다.
python으로 스크립트를 짜서 처리를 하려고 하는데~~

Oracle은 만만한 녀석이 아니다.

프로세스 진행상황을 순차적으로 기록하면

1. MS-SQL 연동(은 덤으로)

pymssql을 설치하니까 간단히 연동이 된다.

바로 잘 돌아간다.

단, 내 컴퓨터에는

Visual Studio 2015, MSSQL(sql server 2008 r2)서버가 설치되어 있다. 조건이 다르다면 바로 안될수도 있다.

 

 

2. Oracle 연동

샘플코드는 이렇다.

도큐먼트 : http://cx-oracle.readthedocs.io/en/latest/index.html

 

오라클답게 쉽게 설치되지 않는다.
pip install cx_Oracle

pip로 설치후에 발견되는 에러
ImportError:DLL load failed:지정된 프로시저를 찾을 수 없습니다.
InterfaceError:Unable to acquire Oracle environment handle

 

위에러가 자꾸 나와서.

oracle instant client설치
C:\oracle\instantclient_12_1 이 경로에 설치 해 주고 path 잡아줬다.

cx_Oracle 설치
https://pypi.python.org/pypi/cx_Oracle/5.2.1 여기서 받아다가 설치

설치할 때 32/64비트 그리고 파이썬 버전을 잘 맞춰야된다.
오라클 버전도..

며칠 지났다고 기억이 안나네

DatabaseMetaData 클래스로 메타데이터 확인

코드

 

 

으~ 오라클 – Call Stored Procedure from Java Code 하는중에 생긴 중대한 호환성 오류

제목은 영어지만 내용은 한국어로

http://viralpatel.net/blogs/java-passing-array-to-oracle-stored-procedure

좋은 샘플 발견해고 코드 수정해서 돌려봤는데…

아무리 해도 응답값이 ARRAY.lengh() == 빵트루

뭐가 잘못된건가 싶어서 할 수 있는 모든코드에 디버깅을 돌려봤지만…

오라클은 디버깅이 안되지…

 

이런경우가 오랜만이라 쓸데없이 디버깅 하느라 반나절을 날려먹었다.

Solution : http://stackoverflow.com/questions/14998299/oracle-array-filled-with-null-data-in-java

 

이걸 항상 명심해야하는데말이지

알 수도 없고 디버깅 해도 안되는 오류는… 블랙박스 라이브러리의 버전 문제다.
이 프로젝트에는 오라클 ojdbc14.jar을 쓰고 있었는데
ojdbc6.jar + orai18n 이걸로 교체 해 주니 해결됐다.
코드에는 문제가 없었던걸로…

자바 개발을 하다보면 오픈소스만 쓰다보니 모든걸 직접 디버깅하고 오류를 발견할 수 있으리라는 착각에 빠지게 된다. 라이브러리도 정 맘에안드는 부분은 소스 수정하고 jar 패키징 다시해서 쓰기도 하고 하니까… github forking 해서 쓰기도 하고

오라클이나 SAP 등등 상용툴과 마주하게 되면 다른 개발습관이 필요한데

 

Oracle 프로시저 – 오브젝트 어레이 선언해서 돌리기

테스트코드 짜다가 버리기 아까워서 저장.

 

타입선언

테이블

 

 

그냥 실행문

 

 

프로시저

 

프로시저 호출코드

 

 

 

 

제일 도움된 페이지 :

https://oracle-base.com/articles/8i/collections-8i

오라클 12c 설치 후 재시작할 때 오류

기본설치 했는데 왜 자동실행이 안되는걸까

오라클DB 12c는 미완성품인가

init.ora 파일을 복사해서 설정파일을 만들어준다

그리고 다시 실행

주석을 원래 잘 안읽는데 갑자기 눈에 들어와서…

init.ora에 보면 다음내용이 보인다

Change ‘<ORACLE_BASE>’ to point to the oracle base (the one you specify at install time)

기본 경로대로 설치했다면

ORACLE_BASE = /u01/app/oracle

12버전을 깔았는데 왜 11.2.0이 나와있는걸까… 의아하지만 오류가 나진 않을테니 넘어감

또 오류발생

디렉토리를 수동으로 만들어줬다

그리고 실행

실행은 되었으나..

오류가 나는거 보면 제대로 실행될리가 없다.

찾아보니

http://database.sarang.net/?inc=read&aid=23564&criteria=oracle&subcrit=&id=&limit=&keyword=&page=

컨트롤파일 오류라는 것 같다.

아까 설정 아래쪽에

control_files = (ora_control1, ora_control2)

이부분 수정이 필요해보인다.

 

control_files = (“/u01/app/oracle/oradata/orcl/control01.ctl”, “/u01/app/oracle/oradata/orcl/control02.ctl”)

여기는 찾아서 추가는했는데 이걸로 해도 되는지 확신이 없다

11.2버전? 무슨소린지 모르겠다

자동설치로 그냥 클릭클릭만 했을 뿐인데…

initcdb1.ora > compatible = 12.1.0.2.0 으로 변경해봤더니

다음 오류

#db_name=’cdb1′
db_name=’orcl’

이거 다시 변경하고 서버 실행

에러확인

진짜 이것만 하면 되는건가

되네

 

오라클은 엔지니어 쓰게 만들라고 어렵게 해놓나보다

오라클 안 쓰는 회사나 SE있는 회사로 이직 해야겠다

Mybatis – Oracle Procedure 연동해서 사용해서 여러개의 ResultSet을 받아오는 케이스

인터넷에 한개짜리는 많이 나오는데

여러개를 받아야 하는 경우에 대한 케이스.
한참 디버깅해서 알아냈지만
알고보면 간단하다

 

솔루션부터… Mybatis Mapper파일
매퍼를 여러개 지정 해 줘야한다. 한곳에서 result가 다 담겨나오지 않네.. 생각해보면 당연한데

 

또 Mybatis Mapper파일이지만 이번엔 프로시저 호출부분

 

Java – Mybatis 호출 코드

 

 

 

Oracle 토막상식 내 테이블 검색하기

쿠리는 어디선가 퍼옴

CLOB와 BLOB 데이터타입을 사용하는 키워드를 검색할 때 쓰는 쿼리

값을 좀 바꾸면 컬럼명이나 이런걸로도 찾아볼 수 있다.

SELECT OWNER, TABLE_NAME, COLUMN_NAME, DATA_TYPE
FROM ALL_TAB_COLUMNS
WHERE DATA_TYPE IN (‘CLOB’, ‘BLOB’) and owner = ‘디비오너’;

SELECT DISTINCT table_name
FROM user_tab_cols
WHERE data_Type IN (‘CLOB’, ‘LOB’, ‘BLOB’);