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. 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. 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

2020. 9. 9. 14:32

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

posted by 지긋이 2020. 8. 6. 15:00

최근 오라클만 계속 사용하다 보니, 정말 기본정보이지만 MySql을 제대로 해 본 적이 없어
자주 사용하는 명령어의 기본적인 차이점과 문법에 대해 공부겸 기록한다.

1. 현재 시간
! oracle은 sysdate
1) DATE 타입의 컬럼에 현재 날짜를 입력하고 싶을 때 
NOW() 함수를 사용하는 방법
ex)  select now() as time from dual;
: 2020-08-06 14:57:06.02) 날짜가 들어갈 컬럼(BOARD_YMD)의 데이터 타입을 TIMESTAMP DEFAULT NOW()를 주고
INSERT 시 DEFAULT값을 입력하는 방법
ex)  CREATE TABLE USER(
     USER_ID    VARCHAR(20) NOT NULL,
     USER_TYPE VARCHAR(10) NOT NULL,
     CRE_DATE  TIMESTAMP DEFAULT NOW(),
     PRIMARY KEY(USER_ID)
    );
insert into user values("rosebay","1",DEFAULT);
1-1. 현재 날짜 +- 처리(1년전/현재/1년후)
1-1-1) Oracle : select sysdate -365 as A, sysdate as B, sysdate+365 as C from dual;
19/09/08 | 20/09/07 | 21/09/07
1-1-2) Mysql
select date_add(now(),interval -365 day) as A, now() as B, date_add(now(),interval 365 day) as C from dual;
select date_add(now(),interval -12 Month) as A, now() as B, date_add(now(),interval 12 Month) C from dual;
select date_add(now(),interval -1 Year) as A, now() as B, date_add(now(),interval 1 Year) C from dual;
2019-09-08 15:06:01.0 | 2020-09-07 15:06:01.0 | 2021-09-07 15:06:01.0

2. NULL 치환
1) oracle 
ex) select nvl(user_id,'1234') as id from dual;
2) mysql
ex) select infull(user_id,'1234') as id from dual;

3. 날짜 포맷 변환
1) oracle 
ex) select to_char(sysdate,'YYYY-MM-DD HH:MI:SS') as time from dual;
  => 2020-08-06 04:00:50

2) mysql
! %Y는 4자리년도(2020)이고, %y는 2자리년도(20)이다. 즉, 대소문자에 따라 다르게 표기됨.
ex)
select date_format(now(),'%Y-%m-%d %H:%i:%s') as time from dual;
  => 2020-08-06 15:59:56

4. 문자 합치기
1) oracle
select '**'||'test'||'**' as text from dual;
  => **test**
2) mysql
select concat('**','test','**') as text from dual; 
  => **test**

posted by 지긋이 2020. 7. 2. 10:06

--컬럼명 사용하는 테이블 찾기
SELECT * FROM ALL_TAB_COLUMNS
WHERE COLUMN_NAME = '컬럼명'
-- DB에서 사용하는 Table, Procedure, Function 등에서 원하는 단어 위치 찾기
SELECT * FROM SYS.ALL_SOURCE
WHERE TYPE='PACKAGE'
AND TEXT LIKE '%소스에서 검색할 단어%';
-- DB 레퍼런스 확인
SELECT * FROM USER_DEPENDENCIES WHERE REFERENCED_NAME = 'P_IF_PCOFF';
SELECT * FROM DBA_DEPENDENCIES WHERE REFERENCED_NAME = 'TB111';
-- 세션 lock, kill
select a.sid, a.serial# from v$session a, v$lock b, dba_objects c 
where a.sid = b.sid 
and b.id1=c.object_id 
and b.type='TM' 
and c.object_name='오브젝트네임';

alter system kill session '337, 59059';

--1. 오라클 데이타베이스명을 확인하는 방법
SELECT NAME, DB_UNIQUE_NAME FROM v$database;
--2. 오라클 SID를 확인하는 방법
SELECT instance FROM v$thread;

중복 체크 ----------------------------------------------------------------------
SELECT T1.컬럼명
           , COUNT(*)
  FROM 테이블명 T1
 GROUP BY T1.KIKB_DONG_NM
 HAVING COUNT(*) > 1 ;

posted by 지긋이 2020. 7. 2. 10:02

DECLARE
  P_SQLCODE VARCHAR2(1000);  -- 오류 로그 기록을 위함
  P_SQLERRM VARCHAR2(1000);  -- 오류 로그 기록을 위함
  P_변수1 VARCHAR2(20);
  P_변수2 VARCHAR2(20);
BEGIN /*시작*/
FOR PER_CHG in(
                      select *
                      from 테이블명
                      WHERE 조건부
                      ) /* FOR문 안에는 ; 세미콜론이 들어가지 않는다. */ 
  Loop
  BEGIN
/* FOR문의 조회 데이터 파라미터를 이용한 프로시저 실행이나
 * insert/update/delete와 같은 DML 명령어 실행시 사용에 용의하다.
*/
                      P_PAPN_TPAP350_UPDATE(P_SQLCODE,P_SQLERRM,변수1,변수2,PER_CHG.변수a,PER_CHG.변수b); 
  EXCEPTION
  WHEN OTHERS THEN
/*화면 ERROR 로그 확인*/
  DBMS_OUTPUT.PUT_LINE( 'SABUN='||PER_CH.SABUN );
    P_SQLERRM := 'SABUN='||PER_CH.SABUN||'의 P_PAPN_TPAP350_UPDATE => ' || SQLERRM;
    P_COM_SET_LOG_NOCOMMIT('변수1,변수2','구분자','위치','SABUN='||PER_CH.SABUN ||SQLERRM,생성자);
  RETURN;
  END;
  END Loop;
END;