posted by 지긋이 2021. 3. 2. 14:55

Mysql에서 Oracle을 생각하고 UPDATE를 진행하다 발생한 오류이다;
You can't specify target table '테이블명' for update in FROM clause

원인은 아래와 같이 같은 테이블을 참조. 즉, Where에 같은 테이블을 참조하면 발생되는 에러이다.

UPDATE 테이블명1 BB
SET BB.PASSWORD = (select AA.password from 테이블명1 AA WHERE AA.user_id = 'rosebay'), 
      BB.UPDATED_BY = 'rosebay', BB.UPDATE_DATE = now()
WHERE BB.user_id = 'wildflower'   ;

해결방법은 subquery 절을 한번 더 감싼 후(임시테이블로 처리) UPDATE 한다.

posted by 지긋이 2021. 2. 15. 14:34

데이터 누락건이 있어 누락된 데이터를 엑셀에 다운로드한 후 데이터를 입력하는 계기가 있었다.
이 때 날짜 데이터를 DB에 넣어야하는데... 자꾸 21/1/144197과 같은 숫자로 표기되었다.

사실 입력 단계에서부터 시행착오는 있었는데...
INSERT INTO 후 데이터를 입력하려하면 '이 수식에 문제가 있습니다.'가 자꾸 뜨는것!

알아보니 텍스트와 실제Cell값을 함께 쓰기 위해서는 &구분자와 '" "'의 활용이 필요했다.

예시를 들자면, 아래와 같은 날짜가 있고 실제 날짜를 입력하기 위해서는

21-1-1

아래와 같이 입력하면 된다.

INSERT INTO 테이블명 values('44197',sysdate);

여기서 44197의 숫자가 문제였는데, TEXT(Cell위치,변환형식) 함수를 이용해서 해결이 가능했다.
나의 경우 여러개의 값을 입력하는 문제로 자체적으로 실제 문장에 쓸때 수식문제가 자주 발생하여,
별도의 셀에 TEXT변환을 입력 후 해당 값을 가져오는 형태로 했으나,
값이 별로 없는 경우 그냥 사용하면 될듯하다.

예시는 아래와 같다.

1. 실제 날짜

21-1-1

2. 변환 날짜

=TEXT(F55,"yyyy-mm-dd") ==> 엑셀에 표기되는 형식 2021-01-01

3. 응용

1) 형태 : INSERT INTO 테이블명 values(텍스트데이터,넘버형데이터 ,날짜,텍스트데이터,sysdate);
2) 시트입력 :
="INSERT INTO 테이블명 
values('"&B55&"',100,'Y',trunc(to_date('"&I55&"')),'2021.02.15 입력',sysdate);"
3) 보여지는 화면 :
INSERT INTO 테이블명
values('text데이터',100,'Y',trunc(to_date('2021-01-01')),'2021.02.15입력',sysdate);
posted by 지긋이 2021. 2. 3. 17:12

엑셀의 특정 값을 특정 범위의 값과 비교하여 변경하고 싶다면?

이러한 기준표가 있다면!

점수 점수표기 범주
0    F 0~59
60  D0 60~64
65  D+ 65~69
70  C0 70~74
75   C+ 75~79
80   B0 80~84
85  B+ 85~89
90  A0 90~94
95   A+ 95~100

VLOOKUP 처리 후 나오는 값
표기1 =VLOOKUP(E:E,A:C,2,0)
표기2 =VLOOKUP(F:F,B:D,2,0)

기준값 표기1 표기2
0 F 0~59
60 D0 60~64
65 D+ 65~69
70 C0 70~74
75 C+ 75~79
80 B0 80~84
85 B+ 85~89
90 A0 90~94
95 A+ 95~100

 

posted by 지긋이 2021. 1. 28. 13:44

# mysql
db.database=mysql
#Local set
#db.url=jdbc:log4jdbc:mysql://localhost:3306/#DBName 
db.url=jdbc:log4jdbc:mysql://IP:Port/#DBName
db.username=#ID db.password=#PW
db.driverClassName=com.mysql.db.Driver
#mysql DB config
db.conn.maxTotal=50 db.conn.maxIdle=5
db.conn.maxWaitMillis=30
db.conn.validationQuery=SELECT 1;
db.conn.validationInterval=30000
db.conn.testWhileIdle=true
db.conn.removeAbandoned=true
db.conn.removeAbandonedTimeout=60
#######################################################

# mssql
jdbc.db.driver=com.microsoft.sqlserver.jdbc.SQLServerDriver jdbc.db.url=jdbc:sqlserver://IP:Port;DataBaseName=#DBName
jdbc.db.username=#ID
jdbc.db.password=#PW
jdbc.db.conn.maxTotal=50
jdbc.db.conn.maxIdle=5
jdbc.db.conn.maxWaitMillis=30
jdbc.db.conn.validationQuery=SELECT 1;
jdbc.db.conn.removeAbandonedTimeout=60
#######################################################

# oracle
jdbc.db.driver=oracle.jdbc.driver.OracleDriver
jdbc.db.url=jdbcc:oracle:thin:@IP:Port:#DBName
jdbc.db.username=#ID
jdbc.db.password=#PW
#oracle DB config
jdbc.db.conn.maxTotal=50
jdbc.db.conn.maxIdle=5
jdbc.db.conn.maxWaitMillis=30
jdbc.db.conn.validationQuery=SELECT 1;
jdbc.conn.removeAbandonedTimeout=60

posted by 지긋이 2021. 1. 22. 17:35

[SQL]
select cast('202101'+'31' as date) as 원하는달마지막날표기
,dateadd(month,5,cast('202101'+'31' as date)) as 원하는달5개월후마지막날표기
,left(REPLACE(dateadd(month,5,cast('202101'+'31' as date)),'-',''),6) as 원하는달5개월후년월표기기호생략

[view]
2021-01-31 원하는달마지막날표기 
2021-06-30 원하는달5개월후마지막날표기 
202106      원하는달5개월후년월표기기호생략

 

posted by 지긋이 2020. 12. 10. 16:22

[Error 구문] SQL 오류: ORA-00984: 열을 사용할 수 없습니다
00984. 00000 -  "column not allowed here"

1. 상황 : 파라미터 개수에 맞춰 insert 도중 발생
2. 원인 : varchar2(문자열) 컬럼에 문자열을 입력하지 않음
ex) NVL(UPPER('rosebay'),admin)
=> NVL(UPPER('rosebay'),'admin') or (UPPER('rosebay'),'') 로 변경시 정상 동작
1) insert 문에서 문자열에 작은따옴표(')  누락(문자열 인식)
- 작은따옴표 대신에 큰따옴표를 사용할 경우
2) 오타(함수 이름 등)

2020. 10. 21. 09:25

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

posted by 지긋이 2020. 10. 16. 11:19

프로젝트별 순수 개발자로 있다가 사내 전산팀으로 바꿨더니 할게 참 많아졌다.

그 중 요즘 제일 곤역인것은 다양한 DB... 10년간 오라클만 썼더니 하하;;
기본적인 문법은 다 비슷한데 약간씩 다른게 있었다. 별거아닌것으로 시간 소비했을때의 기분이란.. 

1. 테이블 생성/수정시 DATA TYPE
1) Numeric(p,[s]) : p 소수점 이하 자리수 포함한 총 자릿수, s 소수점 이하 자릿수[생략가능]
cf) 오라클은 Number, Mysql은 int, bigint, tinyint
2) timestamp, date
cf) 오라클은 date, Mysql은 timestamp
3) char, varchar
cf) 오라클은 char(??Byte), varchar2(??Byte), Mysql은 varchar

2. 테이블 복사
select 컬럼명 into new테이블명 from 원본테이블명 where 조건
cf) 오라클은 create table new테이블명 as select * from 원본테이블명

3. 날짜 기본형 : 현재 날짜 시간을 나타내는 명령어
getdate()
cf) 오라클은 sysdate, Mysql은 now()

4. 형타입 변환
1) CAST(필드명 AS 바꿀 타입) 
ex) cast((필드명) as varchar)
2) CONVERT(바꿀 타입(필드명))
ex1) convert(varchar(필드명))
ex2) convert(char(10),getdate(),102) => 2020.10.12
      convert(char(10),getdate(),112) => 20201012
      convert(char(10),getdate(),126) => 2020-10-16

5. 트랜잭션 기본
- 실행내용 보고 최종반영 하기
begin tran
.. 실행문
commit; 혹은 rollback;

6. NULL처리 isNull
오라클에서 흔히 쓰는 nvl은 mssql에서는 존재하지 않는다.
그럼 어떻게? 이렇게 ISNULL(A.aa, ''
ex) select isnull(left('20200226Ae',9),'') aa ,isnull(null,'없어') bb, isnull(left('ABCDEFGdate',6),'') cc

aa          bb cc
20200226A 없어 ABCDEF


7. 기타

MS-SQL은 Oracle과 같은 가상 테이블을 사용하지 않는다.
즉, from 이하를 생략하고 함수 그대로 사용이 가능하다.
ex1) Oracle 현재 시간 구하기
select sysdate() from dual;
ex2) MS-SQL 현재 시간 구하기
select getdate(); 

** 스크립트 작성
declare @변수명 타입
set @변수명 = 변수값

본문 내용

posted by 지긋이 2020. 10. 12. 15:06

자주 사용할 때는 이런거 찾아보지도 되새겨보지 않아도 잘 썼는데...
역시 근 5년 이상 사용하지 않았더니 vi만 기억이.. 편집기 종료도 기억이 안 나서 인터넷검색이라니...

정보를 정리하는겸 다시 끄적여본다.

1. 터미널의 내가 원하는 파일의 내용을 확인하기 위해 편집기모드로 들어가자.
vi 파일명 ex) vi server.xml
1) 처음 편집기에 들어가게 되면 명령모드로 진입하게 된다.
- 모드는 3가지가 있는데 명령, 입력, ex 명령이 있다.
! 일반적으로 내용을 살펴볼때는 명령모드에서, 내용 수정을 위해서는 입력모드를 사용한다.
입력모드는 명령모드 상태에서 I(현재 커서 위치부터 입력)을 보통 사용하게 되는데 입력모드 전환 명령어는
~~~ 가 있다.
2) 블라블라 내용이 text로 적혀있을 것이고, 내용이 길 경우 다음 페이지를 넘기기 위해서는 pgdn/pgup키를, 한줄씩 이동하여 보고 싶을때는 키보드의 4개 화살표를 이용하여 이동하여 볼 수 있다.
여기에도 키가 다양하게 있는데 ~~~
2. 터미널에서 종료하려면 명령모드에서 일반적으로 :q 후 엔터를 치면 되는데 종료명령어도 여러개다.
1) 종료 명령어
- :q 아무 동작 없이 내용을 보기만 했을때 일반적으로 사용하는 명령어로 vi 편집기 종료
- :q! 변경된 내용이 있어도 무시하고 종료
- :wq 변경된 내용을 저장하고 종료

 

posted by 지긋이 2020. 9. 23. 17:55

오라클과 같은듯 다른점이 많은 MySQL.
회사 주요 사이트가 MySQL로 구성이 되어있어서, 관련 정보를 기록해둔다.

1. DDL
1) 생성
2) 수정
ALTER
 TABLE 테이블명
MODIFY COLUMN 컬럼명 DECIMAL(7,2);

※ 참고 오류 : Data truncation: Out of range value for column '컬럼명' at row 1 와 같은 오류 발생시
입력된 Data가 데이터 타입 크기를 초과해서일 수 있다. 이 경우 크기를 변경해준다.
-- 기존 DECIMAL(5,2) 에서 문제 발생 => DECIMAL(7,2)

2. DML