문제 상황
Oracle에서 생성한 DB는 2개. web 부분과 core 부분을 분리하여 쓰고 있다.
하지만 구조 문제로 web db값 쿼리 시 core db의 데이터를 끌어다가 쓰는 부분이 많다.
MySQL에서는 그냥 "coreDB.testTable" 이라는 형태로 바로 가져올 수 있었는데, oracle은 아래와 같은 에러가 뜨면서 그게 되지 않았다.
에러 코드
### Error querying database. Cause: java.sql.SQLSyntaxErrorException: ORA-00942: 테이블 또는 뷰가 존재하지 않습니다
문제 해결
DB Link 라는 기능을 사용해서, web db에서 core db 값을 가지고 오도록 수정했다.
0.문제 코드
<select id="getDatabaseInfo" parametertype="java.lang.String" resultmap="DatabaseInfo">
SELECT
a.ID,
a.TYPE,
b.JOB,
c.SCHOOL,,
c.USER_NAME
FROM NON_INFO a, JOB_INFO b, core.USER_INFO c <!-- c 값에서 에러 발생! -->
WHERE a.ID= #{id} AND a.ID= b.BID AND a.ID= c.CID
</select>
1.tnsnames.ora 파일 수정
파일 위치 : $ORACLE_HOME/NETWORK/ADMIN
$ORACLE_HOME은 PC 설정마다 다르겠지만, 나는 c:\oracle\product\(version)\dbhome 이었다.
web =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = TESTPC)(PORT = 1001))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = web)
)
//추가한다
(CONNECT_DATA =
(SID = core)
)
)
core =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = TESTPC)(PORT = 1001))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = core)
)
)
2.DB Link 설정 (DBA 권한이 있는 계정 사용)
CREATE DATABASE LINK testdbconn CONNECT TO testuser IDENTIFIED BY "testpwd" USING 'core'
3.쿼리 변경
테이블@DBLink명
<select id="getDatabaseInfo" parametertype="java.lang.String" resultmap="DatabaseInfo">
SELECT
a.ID,
a.TYPE,
b.JOB,
c.SCHOOL,,
c.USER_NAME
FROM NON_INFO a, JOB_INFO b, USER_INFO@testdbcon c <!-- c 값을 변경 -->
WHERE a.ID= #{id} AND a.ID= b.BID AND a.ID= c.CID
</select>
4.기타 커맨드
DB Link 확인 : SELECT * FROM ALL_DB_LINKS;
DB Link 삭제 : DROP DATABASE LINK DBLink명;
참고 사이트
ORA-00918: 열의 정의가 애매합니다 (0) | 2013.12.16 |
---|---|
[Oracle][ORA-02067] 트랜잭션 또는 저장점 롤백이 요구됩니다, 등 (0) | 2013.11.14 |
[Oracle] Error setting null for parameter #4 with JdbcType OTHER (0) | 2013.11.14 |
[Oracle][ORA-01017] invalid username password logon denied (0) | 2013.11.12 |
[Oracle] 오라클 명령어 간단 정리 (0) | 2013.11.12 |
댓글 영역