* "ALL_" 대신에 "USER_"를 사용하고 OWNER 조건을 빼서 사용할 수도 있다.


--전체 계정 전체 테이블 조회

SELECT * FROM ALL_TABLES;


--사용자계정 전체 테이블 조회

SELECT * FROM ALL_TABLES WHERE OWNER = 'SUBINTO';

 

 --사용자계정 전체 테이블 커멘트 조회

 SELECT * FROM ALL_TAB_COMMENTS WHERE OWNER = 'SUBINTO';


--사용자계정 전체 컬럼 조회

 SELECT * FROM ALL_TAB_COLUMNS WHERE OWNER = 'SUBINTO';

 

 --사용자계정 전체 컬럼 커멘트 조회

 SELECT * FROM ALL_COL_COMMENTS WHERE OWNER = 'SUBINTO';


* 위 쿼리를 활용하여 쿼리 생성 쿼리를 만들수도 있다.(아래는 SELECT 쿼리를 생성하는 쿼리 참조)


--쿼리 생성 쿼리(SELECT)

SELECT DECODE(ROWNUM, 1, 'SELECT ' ||  CHR(13), ', ')

    || UPPER(COLUMN_NAME) || ' AS ' ||LOWER(SUBSTR(COLUMN_NAME, 1,1))||SUBSTR(REPLACE(INITCAP(LOWER(COLUMN_NAME)), '_',''), 2)    

    || DECODE(ROWNUM, (COUNT(1) OVER()), CHR(13) || '  FROM '|| TABLE_NAME ||';', '') AS "SELECT Query"

 FROM ALL_TAB_COLUMNS

WHERE OWNER = 'SUBINTO'

  AND TABLE_NAME = UPPER('TB_MENU');


반응형

테이블 스크립트를 가지고 있다면 Erwin의 Reverse Engineer 기능을 이용하여 Erd를 생성할 수 있다.

(일일이 Erd를 그리기에는 실수도 있을 수 있고 시간과 노력이 아깝지 아니한가^-^;;;)

 

1. Erwin을 실행하고 메뉴에서 File > New 를 클릭하여 아래와 같은 창이 나타나면 Logical/Physical 을 선택하고 OK를 클릭하여 Erd 파일을 생성한다.

 

 

2. 생성된 새파일에 기본 Logical로 세팅되어져 있을 것이고 메뉴에서 Tools > Reverse Engineer을 선택하면 아래와 같은 창이 나오고 Logical/Physical을 선택하고 Next를 클릭한다.

 

 

3. Reverse Engineer From 항목에서 Script FIle을 선택하고 테이블 스크립트가 있는 파일을 선택하고 Next 버튼을 클릭한다.

 

 

4. 아래와 같이 Erd가 생성된것을 확인할 수 있다. 번외로 Comment의 명칭을 Logical의 Name으로 세팅을 하려면 아래 Model Type이 Physical 상태에서 Ctrl + A를 눌러 전체 테이블을 선택한 후 빈 공간에서 오른쪽 마우스를 클릭하고 "Harden Physical Names" 를 선택한다. (이렇게 하는 이유는 논리명을 바꿀때 물리명은 고정시키기 위함이다.)

 

 

5. Model Type을 Logical을 바꾼뒤 메뉴 Model > Domain Dictionary를 선택한뒤 나오는 팝업창에서 Macro Toolbox를 클릭한다.

 

 

6. Macro Toolbox 팝업창에서 Macros항목의 Attribute Macro > %ColumnComment를 선택하고 Insert Macro를 클릭하고 Close를 눌러 창을 닫는다.

 

 

7. Name Inherited by Attribute 항목에 %ColumnComment 가 입력된 것을 확인하고 OK버튼을 클릭한다.

 

8. Erd 화면에서 아무 테이블이나 하나 선택한뒤 메뉴 Model > Attributes를 선택한뒤 나오는 팝업창에서 Reset 버튼을 클릭한다.

9. Remove overridden properties for 항목에서 Reset all attributes in mode을 선택하고 Select Properties to Rest 항목에서 Name만을 체크한뒤 OK 버튼을 클릭한다.

10. 해당 Attributes의 Attribute의 명이 한글로 바뀐것을 확인할 수 있고 OK버튼을 클릭한다.

11. Erd의 Model Type이 Logical의 테이블이 한글로 바뀐것을 확인할 수 있다.

 

 

cf. 1) 9번을 실행하다보면 아래와 같은 오류창이 뜰때가 있다. 생성스크립트에서 해당 테이블에 대한 Comment 스크립트가 빠져있을때 발생하였다.

cf. 2) 해결방법으로는 테이블 컬럼에 대한 Comment 스크립트를 다 달아주고 진행하면 된다.

cf. 3) 또 다른 해결방법으로는 7번의 Name Inherited by Attribute 항목에 %ColumnComment 가 아닌 아래와 같은 조건문을 사용하면 된다.

%if(%>(%Len(%ColumnComment),0)){%ColumnComment}%ELSE{%ColName}

cf. 4) 아래와 같은 오류창이 나타나는 또 다른 유형은  테이블 안에서 컬럼명은 다른Comment 명은 동일하게 사용하는 경우 발생하였다.

 

 

 

반응형

오라클 문자열 byte 구하기

 

SELECT VSIZE('1234'), VSIZE('와우') FROM DUAL;           ->    결과 : 4, 4

 

오라클 문자열 글자수 구하기

 

SELECT LENGTH('1234'), LENGTH('와우') FROM DUAL;    ->    결과 : 4, 2

 

 

반응형

오라클에서 업데이트를 여러건을 처리할때 아래와 같이 사용할 수 있다.

주의할 점은 여러건을 동시에 처리하기 때문에 쿼리가 맞는지 확인후에 사용하길 권고한다.

이외 set절의 건수는 단건의 조건이기 때문에 "="을 사용하고

where절의 건수는 다건의 조건이기에 "IN")을 사용한다.

 

UPDATE USER_INFO A
    SET (USER_TYPE, USER_NM) = (SELECT LOGIN_TYPE, LOGIN_NM

FROM LOGIN_INFO

    WHERE USER_ID = A.USER_ID)

WHERE (ETC_TYPE, ETC_DIV) IN (SELECT ETC_TYPE, ETC_DIV

    FROM LOGIN_INFO

  WHERE USE_YN = 'Y')

 

반응형

WITH와 PIVOT, CONNECT BY, GROUP 등을 이용한 메뉴별 권한 조회하는 쿼리 예제

(엑셀로 손으로 작업하는 것보다 실수가 없이 정확하다.)

 

SELECT 
            '메뉴ID' AS MENU_ID
          , 'NO' AS NO
          , '1 Depth' AS DEPTH_1
          , '2 Depth' AS DEPTH_2
          , '3 Depth' AS DEPTH_3
          , '4 Depth' AS DEPTH_4
          , '5 Depth' AS DEPTH_5
          , 'Url' AS MENU_URL
          , (SELECT USER_GROUP_NM FROM TB_USER_GROUP WHERE USER_GROUP_ID = '001') AS GROUP_001
          , (SELECT USER_GROUP_NM FROM TB_USER_GROUP WHERE USER_GROUP_ID = '002') AS GROUP_002
          , (SELECT USER_GROUP_NM FROM TB_USER_GROUP WHERE USER_GROUP_ID = '003') AS GROUP_003
          , (SELECT USER_GROUP_NM FROM TB_USER_GROUP WHERE USER_GROUP_ID = '004') AS GROUP_004
FROM DUAL
UNION ALL
SELECT
            A.MENU_ID
          , ROWNUM||'' AS NO
          , CASE WHEN A.MENU_LEVEL = '1' THEN A.MENU_NAME ELSE NULL END AS DEPTH_1
          , CASE WHEN A.MENU_LEVEL = '2' THEN A.MENU_NAME ELSE NULL END AS DEPTH_2
          , CASE WHEN A.MENU_LEVEL = '3' THEN A.MENU_NAME ELSE NULL END AS DEPTH_3
          , CASE WHEN A.MENU_LEVEL = '4' THEN A.MENU_NAME ELSE NULL END AS DEPTH_4
          , CASE WHEN A.MENU_LEVEL = '5' THEN A.MENU_NAME ELSE NULL END AS DEPTH_5
          , A.MENU_URL
          , GROUP_001
          , GROUP_002
          , GROUP_003
          , GROUP_004
FROM TB_MENU_INFO A
        , (
            WITH TUG AS (
                SELECT USER_GROUP_ID
                  FROM TB_USR_GRP
                WHERE USE_AT = 'Y'
            )
            SELECT
                        MENU_ID
                      , MAX(CASE WHEN GROUP_001 = USER_GROUP_ID THEN 'O' ELSE NULL END)  AS GROUP_001
                      , MAX(CASE WHEN GROUP_002 = USER_GROUP_ID THEN 'O' ELSE NULL END)  AS GROUP_002
                      , MAX(CASE WHEN GROUP_003 = USER_GROUP_ID THEN 'O' ELSE NULL END)  AS GROUP_003
                      , MAX(CASE WHEN GROUP_004 = USER_GROUP_ID THEN 'O' ELSE NULL END)  AS GROUP_004
              FROM TUG
              PIVOT(MAX(USER_GROUP_ID) FOR USER_GROUP_ID IN ('001' AS GROUP_001, '002' AS GROUP_002, '003' AS GROUP_003, '004' AS GROUP_004) )
                    , TB_GRP_MENU TGM
            WHERE TGM.USE_AT = 'Y'
            GROUP BY MENU_ID
          ) B
WHERE A.USE_YN = 'Y'
AND A.DEL_YN = 'N'
AND A.MENU_ID = B.MENU_ID
START WITH A.MENU_UPPER_ID IS NULL
CONNECT BY PRIOR A.MENU_ID = A.MENU_UPPER_ID

반응형

SELECT TO_CHAR(SYSDATE, 'YYYY') - 5 + LEVEL AS YEAR
  FROM DUAL
 CONNECT BY LEVEL < 11

반응형

LEFT JOIN과 LEFT OUTER JOIN는 같다....

 

자주 쓰지 않는 방식이라 헷갈려서 찾아봤더니 결과는 동일하다고 한다.

 

길어서 쓰기가 불편하니 줄인 표현이라고 한다.

반응형

오라클 쿼리결과 이전 행데이터와 이후 행데이터 조회

 

SELECT
            LAG(A.MENU_ID) OVER(ORDER BY A.MENU_ID ASC) AS PRE_MENU_ID --이전 메뉴ID
          , A.MENU_ID --현재 메뉴ID
          , LEAD(A.MENU_ID) OVER(ORDER BY A.MENU_ID ASC) AS NEXT_MENU_ID --다음 메뉴ID
FROM TB_SF_MENU_INFO A
ORDER BY MENU_ID ASC

반응형

--다중 LIKE 검색(오라클 10g부터 가능)

SELECT  * 
  FROM TB_MENU_INFO 
 WHERE  REGEXP_LIKE(MENU_NM, '참여업체|수집안내|메뉴정보')
 
--세번째 변수에 'i'를 추가하면 대소문자 구분하지 않고 검색
SELECT  * 
  FROM TB_MENU_INFO 
 WHERE  REGEXP_LIKE(MENU_URL, 'MYPAGE|user', 'i')

 

--시작하는 문자가 "전 or 지 or 스 or 마" 로 시작하는 데이터 검색
SELECT  * 
  FROM TB_MENU_INFO 
 WHERE  REGEXP_LIKE(MENU_NM, '^[전지스마]')
 
--"분석"으로 끝나는 데이터 검색
SELECT  * 
  FROM TB_MENU_INFO 
 WHERE  REGEXP_LIKE(MENU_NM, '분석$')

반응형

--최근 수정된 데이터조회(수정된지 오래되었으면 오류발생)

SELECT
ORA_ROWSCN AS SCN
, TO_CHAR(SCN_TO_TIMESTAMP(ORA_ROWSCN),'YYYY-MM-DD HH24:MI:SS') AS TM
, MENU_ID
FROM TB_MENU_INFO;

 

 

--10분전 데이터 조회

SELECT  * 
  FROM TB_MENU_INFO  AS OF TIMESTAMP(SYSTIMESTAMP - INTERVAL '10' MINUTE) 
 WHERE  MENU_ID LIKE 'SC_%'

 

cf) SECOND, MINUTE, HOUR, DAY 로 조회 가능

 

--특정 날짜 시간 데이터 조회
SELECT  * 
  FROM TB_MENU_INFO  AS OF TIMESTAMP(TO_TIMESTAMP('2018-11-12 08:30:10', 'YYYY-MM-DD HH24:MI:SS')) 
 WHERE  MENU_ID LIKE 'SC_%'

반응형

/*
 * MENU_ID가 PK임
 * MENU_CATE데이터가 'B', 'I', 'P' 인것의 MENU_TYPE별 개수 구하기
 */
WITH PV AS (
    SELECT MENU_ID
              , MENU_CATE
              , MENU_TYPE
      FROM TB_SF_MENU_INFO
)
SELECT *
  FROM PV
  PIVOT(COUNT(MENU_ID) FOR MENU_TYPE IN ('B' AS TYPE_B, 'I' AS TYPE_I, 'P' AS TYPE_P));

 

--조회결과 중 일부 : MENU_CATE 가 'M'이고 MENU_TYPE가 'P'인 데이터가 9건 조회됨

 

--확인쿼리

 

SELECT COUNT(MENU_ID)
  FROM TB_SF_MENU_INFO
WHERE MENU_CATE = 'M'
     AND MENU_TYPE = 'P';

 

--조회결과 : 9건

반응형

여러행을 하나의 컬럼으로 합치기

 

--Oracle version : 11g
SELECT LISTAGG(CODE, ',') WITHIN GROUP(ORDER BY CODE DESC) AS PLUS_COLUMN 
  FROM COM_CODE
WHERE ROWNUM < 5;

 

--Oracle version : 10g
SELECT WM_CONCAT(CODE) AS PLUS_COLUMN
  FROM COM_CODE
WHERE ROWNUM < 5;

 

--Oracle version : 9i
SELECT SUBSTR(XMLAGG(XMLELEMENT(X, ',', CODE) ORDER BY CODE).EXTRACT('//text()'), 2) AS PLUS_COLUMN
  FROM COM_CODE
WHERE ROWNUM < 5;

 

반응형

--캐릭터셋 조회
SELECT * FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER = 'NLS_CHARACTERSET';

 

--CONVERT( '대상 문자열', '타겟 인코딩', '소스 인코딩')
SELECT COMMENTS
          , CONVERT(COMMENTS, 'AL32UTF8', 'KO16KSC5601') AS COMMENTS_CONVERT
    FROM ALL_COL_COMMENTS WHERE TABLE_NAME = 'COM_CODE';

반응형

--1시간전
SELECT * FROM TABLE_NAME AS OF TIMESTAMP((SYSDATE-1/24));

 

--특정시간
SELECT * FROM TABLE_NAME AS OF TIMESTAMP(TO_DATE('20181101140000', 'YYYYMMDDHH24MISS'));

반응형

SELECT * FROM v$version WHERE banner LIKE 'Oracle%';

반응형

+ Recent posts