운영서버에서 테스트 서버로 데이터 데이터 이관시, 가끔 시퀀스가 안맞아서 중복오류가 발생하곤 한다.

시퀀스 시작 번호를 지정숫자로 변경하는 방법은 다음과 같다.

예 1-> 1000으로 변경

alter sequence SEQ_01 increment by 1000;   // 증가번호를 1000으로 변경

select SEQ_01.nextval from dual;    // 적용

alter sequence SEQ_01 increment by 1;   // 증가번호를 1로 변경

 

select

'ALTER TABLE ' || TABLE_NAME || ' ADD ( ' || COLUMN_NAME || '_TMP VARCHAR2(' || DATA_LENGTH || ')); ' ||
'UPDATE ' || TABLE_NAME || ' SET ' || COLUMN_NAME || '_TMP = ' || COLUMN_NAME || '; ' ||
'UPDATE ' || TABLE_NAME || ' SET ' || COLUMN_NAME || ' = NULL; '||
'ALTER TABLE ' || TABLE_NAME || ' MODIFY ( ' || COLUMN_NAME || ' VARCHAR2(' || DATA_LENGTH || ')); ' ||
'UPDATE ' || TABLE_NAME || ' SET ' || COLUMN_NAME || ' = ' || COLUMN_NAME || '_TMP; ' ||
'ALTER TABLE ' || TABLE_NAME || ' DROP COLUMN ' || COLUMN_NAME || '_TMP; ' AS SQL

from all_tab_columns
where data_type like 'NVARCHAR%'
and OWNER = 'LLC'
ORDER BY TABLE_NAME;

 
a5m2.mmatsubara.com

SQL서버 CLR 활성화 시키기

SQL서버에서 .NET 으로 만든 사용자 함수를 실행 시키려고 하는데 다음과 같은 오류가 발생하면 .NET Framework에서 사용자 코드를 실행할 수 없습니다. "clr enabled" 구성 옵션을 설정하십시오. 먼저 아래와 같..

hackhyun.tistory.com

자주 사용하는 Orange Hotkey(단축키) .

공통

F4: Object Info Ddisplay

Alt + C : Table 에서 마우스 포커스 > Column Display

.SQL-Tool : DDL, DML 가능

F5: 실행

Explain Plan 정보 View는 가능.PL/SQL Tool : PL/SQL Compile, Edit

Plan 에서 더블클릭 > Statics 정보

복사

코드 선택 > 오른쪽버튼 > copy to clipboard > 언어선택 : ctrl+shift + c

코드 선택 > 오른쪽버튼 > paste from clipboard > 언어선택 : ctrl+shift + c

실행

.Plan Tool : Explain Plan, Trace , Schema Display

F5: Plan 보기

F9: Trace 보기

ctrl + L : 선택만

ctrl + M : 현재라인 아래로

ctrl + J : 현재라인

ctrl + K : 현재커서

화면분할

Alt + Down : script editore 전체

Alt + Up : 밑에 정보만

Alt + Right : ..

Alt + Shift + 방향키 : 블럭 복사

Ctrl + D : 현재 라인 복사(아래로)

MAX, MIN은 한 컬럼의 최대값 최소값

GREATEST, LEAST는 복수 컬럼중 최대값, 최소값

Ex)
MAX(COL) or MIN(COL)
GREATEST(COL1,COL2,COL3) or LEAST(COL1,COL2,COL3)

'데이터베이스 > Oracle' 카테고리의 다른 글

[ORACLE] 테이블 컬럼 유형 변경시 참고 쿼리  (0) 2019.04.09
Orange for Oracle 단축키  (0) 2019.01.28
[oracle]GREATEST, LEAST 함수  (0) 2018.06.22
Oracle 달력 쿼리  (0) 2016.10.13
[오라클]그룹별 순번 만들기  (0) 2013.06.21
[오라클]유저생성  (0) 2013.04.09


날짜관련 함수 사용법

# YEAR
# %Y [2010]
# %y [10]

# MONTH
# %M [january-december]
# %b jan-dec[]
# %m [01-12]
# %c [1-12]

# DAY
# %D [1st-31th]
# %d [01-31]
# %j [001-365]

#HOUR
# %r [00:00:00-23:59:59 PM]
# %T [00:00:00-23:59:59]
#MINUTE

#SECOND
# %S [00-59]

(예문)
SELECT
now() AS 'now',
YEAR(now()) AS 'year',
MONTH(now()) AS 'month',
DAY(now()) AS 'day',
DAYOFWEEK(now()) AS 'dayofweek',
HOUR(now()) AS 'hour',
MINUTE(now()) AS 'minute',
SECOND(now()) AS 'second',
DATE_FORMAT(now(),'%Y-%m-%d')


 

 


숫자만 들어있는 컬럼이 있는데, 정렬을 해 보니, 

1
11
12
13
2
21

이런씩으로 정렬되는 경우를 본 적이 있을 것이다. 
컬럼의 정의가 INT가 아닌 VARCHAR로 되어 있어서 그런 경우가 있다.
업무상 이렇게 데이터베이스를 설계할 경우도 있으니 잘잘못은 패스~ 하고

이렇경우 어떻게 정렬하면 재대로 표현될까.. 하니...
MySQL에는 (CAST)연산자라는게 있다.

cast type의 종류는 
binary
char
signed (부호있는 숫자)
date
datetime
time
unsigned (부호없는 숫자)
등이 있다.

이용 방법은 

정렬할 때에는 
select * from customers order by cast(customers_id as unsigned);

문자를 숫자로 변환할 때에는
select cast('1' as unsigned) as test
숫자를 문자로 변환할 때에는
select cast(2 as char(1)) as test

이렇게 이용하면 된다.

 


웹페이지에 문자열을 출력할때
상황에 따라 대문자로 혹은.. 소문자로 출력해야 하는 경우가 있다.
단, 알파벳만 대상이 되니.. 주의해야 한다.

PHP는 각 상황에 대한 함수를 제공한다. 단, 알파벳만 대상이 되니.. 주의해야 한다.

string strtolower($str) - 대문자를 소문자로 변환하여 반환한다.

string strtoupper ($str) - 소문자를 대문대로 변환하여 반환한다.

string mb_strtoupper ( string $str [, string $encoding = mb_internal_encoding() ] 
소문자를 대문대로 변환하여 반환한다.
예) mb_strtoupper('john은 외국인이다.', 'UTF-8');

string mb_strtolower ( string $str [, string $encoding = mb_internal_encoding() ] )
문자를 문대로 변환하여 반환한다.
예) mb_strtolower('john은 외국인이다.', 'UTF-8');

이둘은 인코딩을 지정할 수 있다. 지정하지 않으면 내부 문자인코딩을 이용한다.

정확하게는 모르겠는데... 
mb_XXX 이것은 2바이트 문자가 있을때 글자깨짐 방지를 위해 인코딩을 지정할 수 있게 해 둔 함수가 아닌가 생각된다. 
일본어 사이트 개발할 때 문자열 조작할때 글짜깨짐 형상이 발생하여 
mb_XXX 이런 함수로 대체해서 작업한 경험이 있어서... (완전 개인적 생각임,) 

string mb_convert_case ( string $str , int $mode = MB_CASE_UPPER [, string $encoding = mb_internal_encoding() ] )
이 함수도 위의 함수와 비슷한데 
$mode값에 따라 대문자에서 소문자로 소문자에서 대문자로 변환이 가능하다.
(인코딩 지정도 가능하다)

MB_CASE_UPPER(소문자를 대문자로) 
MB_CASE_LOWER(대문자롤 소문자로)
MB_CASE_TITLE(단어별 첫번째 문자를 대문자로) 


그외에 함수로는 

string ucfirst($str) - 문자열의 첫 문자를 대문자로 변환하여 반환 한다. 
string cfirst($str) - 문자열의 첫 문자를 소문자로 변환하여 반환 한다. 
string ucwords($str) - 문자열 중의 단어별 첫 문자를 대문자로 변환하여 반환한다.

등이 있다.

 

년도와 월이 주어졌을 경우, 해당 월의 달력을 생성해주는 쿼리를 만들어 보자.
쿼리는 아래와 같다. (2000년 01월이 주어졌을 경우)


SELECT   MIN (DECODE (TO_CHAR (days, 'd'), 1, TO_CHAR (days, 'fmdd'))) 일,
         MIN (DECODE (TO_CHAR (days, 'd'), 2, TO_CHAR (days, 'fmdd'))) 월,
         MIN (DECODE (TO_CHAR (days, 'd'), 3, TO_CHAR (days, 'fmdd'))) 화,
         MIN (DECODE (TO_CHAR (days, 'd'), 4, TO_CHAR (days, 'fmdd'))) 수,
         MIN (DECODE (TO_CHAR (days, 'd'), 5, TO_CHAR (days, 'fmdd'))) 목,
         MIN (DECODE (TO_CHAR (days, 'd'), 6, TO_CHAR (days, 'fmdd'))) 금,
         MIN (DECODE (TO_CHAR (days, 'd'), 7, TO_CHAR (days, 'fmdd'))) 토
    FROM (SELECT     base_mon + LEVEL - 1 days,
                         (  TRUNC (base_mon + LEVEL - 1, 'd')
                          - TRUNC (TRUNC (base_mon + LEVEL - 1, 'y'), 'd')
                         ) / 7 + 1 week_grp
                FROM (SELECT TO_DATE ('200001', 'yyyymm') base_mon
                        FROM DUAL)
          CONNECT BY base_mon + LEVEL - 1 <= LAST_DAY (base_mon))
GROUP BY week_grp
ORDER BY week_grp 



connect by level 절을 사용하지 못하는 버전일 경우에는, 아래와 같이 dict 테이블을 이용한다.
아래 예는 위의 쿼리 와는 다르게 오늘로부터 몇달 후인지를 나타내는 변수 :n에 따라 달력을 생성한다.
(:n=-1 일 경우 지난달, 0은 이번달, 1은 다음달, 2는 다다음달,...)


SELECT   MIN (DECODE (TO_CHAR (days, 'd'), 1, TO_CHAR (days, 'fmdd'))) 일,
         MIN (DECODE (TO_CHAR (days, 'd'), 2, TO_CHAR (days, 'fmdd'))) 월,
         MIN (DECODE (TO_CHAR (days, 'd'), 3, TO_CHAR (days, 'fmdd'))) 화,
         MIN (DECODE (TO_CHAR (days, 'd'), 4, TO_CHAR (days, 'fmdd'))) 수,
         MIN (DECODE (TO_CHAR (days, 'd'), 5, TO_CHAR (days, 'fmdd'))) 목,
         MIN (DECODE (TO_CHAR (days, 'd'), 6, TO_CHAR (days, 'fmdd'))) 금,
         MIN (DECODE (TO_CHAR (days, 'd'), 7, TO_CHAR (days, 'fmdd'))) 토
    FROM (SELECT base_mon + ROWNUM - 1 days,
                     (  TRUNC (base_mon + ROWNUM - 1, 'd')
                      - TRUNC (TRUNC (base_mon + ROWNUM - 1, 'y'), 'd')
                     )
                   / 7
                 + 1 week_grp
            FROM (SELECT TRUNC (ADD_MONTHS (SYSDATE, :n), 'mm') base_mon
                    FROM DUAL), dict
           WHERE base_mon + ROWNUM - 1 <= LAST_DAY (base_mon))
GROUP BY week_grp
ORDER BY week_grp

'데이터베이스 > Oracle' 카테고리의 다른 글

Orange for Oracle 단축키  (0) 2019.01.28
[oracle]GREATEST, LEAST 함수  (0) 2018.06.22
Oracle 달력 쿼리  (0) 2016.10.13
[오라클]그룹별 순번 만들기  (0) 2013.06.21
[오라클]유저생성  (0) 2013.04.09
행을 열로 표시하기  (2) 2011.10.14

+ Recent posts