환경 : Oracle 11g (local),   SQL Server 2019(Remote),   Springfamework

필요사항 : Oracle에 입력된 데이터를 SQL Server로 insert

오류 : db link를 이용한 insert 시 ORA-02025 오류 발생

해결 : 1. SQL developer에서 db link를 이용하여 하드 코딩 후 단건 insert 시도 -> 성공
           2. SQL developer에서 db link를 이용하여 하드 코딩 후 Oracle DB에서 데이터 select 후 insert 시도 -> ORA-02025 오류 발생 
           3. " SQL 문의 모든 데이터베이스가 Oracle 서버인 경우에만 원격 업데이트를 수행할 수 있습니다. "라는 Oracle 홈페이지 내용 확인. https://docs.oracle.com/en/error-help/db/ora-02025/?r=23ai

 

ORA-02025 - Database Error Messages

The user's SQL statement references tables from multiple databases. The remote database is not Oracle V7 or above, and can perform updates only if it can reference all tables in the SQL statement.

docs.oracle.com

           4. table select 후 건건이 insert.... (일단 사용자 요구가 급해서 서비스 오픈 후 추후 수정해야 할 것 같다 ㅠㅠ)

Posted by 知彼知己百戰不殆
,

본점 라이센스가 SQL Server 2019라고 해서 부랴부랴 기존 셋팅된 것들을 2019로 그대로 이관해야 했다.

환경 : (local) SQL Server 2019
          (remote) Oracle 11g

기존에는 SQL Server 2022 -> Oracle 이었는데 이번엔 버전이 다운된 2019에서 Oracle이었다.

2019랑 2022는 크게 바뀐 내용이 없어서 별 문제 없겠지 했는데, 또 linked server 설정 시 무한 에러 발생 ㅠㅠㅠ

7302 오류 발생 ㅠㅠ.....

4일간 삽질 후 일단 작년에 Local PC에 Oracle 설치 시 64bit로 설치했는데, 이번 설치는 32bit로 설치가 돼있었다.(당연히 64bit 파일이겠거니....)

SQL Server 7302 Error code 발생 시

1. SQL Server에 설치한 Oracle Client bit 확인

2. SSMS -> Provider -> OraOLEDB.Oracle 속성 -> Allow InProcess 체크 확인

Posted by 知彼知己百戰不殆
,

상황 : local Database임에도 불구하고 sqlplus / as sysdba 접속 시 insufficient privilege 에러가 발생

해결 : 유저&그룹(Users and Groups) 들어가서 Users 폴더의 현재 실행중인 계정 속성창에서 
          Member Of(그룹) 탭에서 Add 버튼 클릭, advanced 클릭, Find Now 클릭, Search results에서 
         ora_dba 추가

Posted by 知彼知己百戰不殆
,

오류 : CLIENT_PLUGIN_AUTH is required

원인 : 원인이 몇 가지 있으나 나는 mysql-connector 버전이 맞지 않는 경우에 해당. 기존에 사용하던 connector는 mysql-connector-8.2버전(최신)이었으나 오래된 현 회사 시스템에는 맞지 않는 connector였음.

해결 : mysqlconnctor-5버전대로 낮추고 진행

Posted by 知彼知己百戰不殆
,

key를 ident 값으로 주는게 있었고, 양쪽 테이블을 동일하게 맞춰났다. 하지만 프로시저에서 로직 오류가 있어서 사용하다 보니 어느 순간 두 테이블의 ident 값이 틀어져 있었고, key값으로 비교 시 이상하게 비교가 되었다.

필요: dbcc checkident(테이블명, noreseed) 는 현재 테이블의 ident 값을 가져오는 것이지만 if문에서 양쪽 값 비교 필요

해결: select IDENT_CURRENT(테이블명) 으로 하면 현재 테이블의 ident 값을 select로 가져올 수 있음

Posted by 知彼知己百戰不殆
,

데이터 양이 매우 많은 테이블들이 여러개 조인되고 그 안에서 조건을 넣어 조인을 하다 보면 SQL 속도가 상당히 느려짐.

이 때 임시 테이블이나 신규로 통계 데이터를 저장하는 테이블을 만들어서 작업 외 시간에 해당 테이블에 저장을 미리 시킨 후 해당 쿼리 결과가 필요할 땐 신규 테이블에서 값을 가져와서 보여주는 형태로 하면 빠름.

단점 : 실시간 확인해야 하는 통계 SQL에는 적용하기 힘듦. 이 땐 SQL 튜닝이나 다른 방법을 찾아야 함

Posted by 知彼知己百戰不殆
,

Table A (group by 한 값들이 모두 들어있는 테이블)
select '1' from dual union all
select '2' from dual union all
select '3' from dual union all
select '4' from dual union all

Table B (실제 값 가져오는 쿼리)

이런 식으로 group by 했을 때 무조건 나와서 통계 표와 맞춰야 하는 값들 강제 작성 후 left join 

Posted by 知彼知己百戰不殆
,

변동값을 group by 하는 tip

예를 들어 각 나이대별 00 건수 데이터를 뽑고 싶을 때

구분 5년이상 10년이하 10년이상 15년이하 15년이상 20년이하 ~~~
20세 ~ 30세        
30세 ~ 40세        
40세~ 80세        
         

위와 같은 표의 데이터를 뽑을 때 처음에 어떻게 데이터를 뽑아야 할지 머리가 안 돌아갔다.
구분값이 다 변동값인데 이걸 어떻게 group by로 뽑아내지 하다가 문득 든 생각 

20세와 30세를 그룹으로 묶고 30세~40세를 그룹으로 묶어 버리자.

그래서 gruop by를 하기 전 case when 컬럼1 between 20 and 30 then '1'
when 컬럼1 between 30 and 40 then '2' 
...

이런 방식으로 그룹핑을 지어주었다. 그리고 또한 기간도 case when 컬럼2 between 5년 between 10년 then '1'
when 컬럼2 between 10년 and 15년 then '2'

이렇게 변동값을 그룹으로 한정해버리고 쿼리 추출!!

쿼리는 항상 너무 어렵다 ㅠㅠ

Posted by 知彼知己百戰不殆
,

A조건 : 건수
B조건 : 건수
C조건 : 건수

위와 같이 각 조건별로 건수를 한 방에 출력하고 싶을 때 

select count(case when ~~~~ then 1 end ) as column1
        , count(case when ~~~~ then 1 end ) as column2  
        , count(case when ~~~~ then 1 end ) as column3
  from 테이블명

Posted by 知彼知己百戰不殆
,

0원 초과 1만원 미만 데이터를 구하고 싶은데 >, <를 쓰자니 쿼리가 길어질 거 같고 간단한 건 뭐 없을까 고민하다가 검색

NOT BETWEEN A AND B
=> A 미만 B 초과  

Posted by 知彼知己百戰不殆
,