[접속]

윈도우 command에서 sqlplus / as sysdba 명령어 입력하여 접속

 

[작업 테이블 스페이스 지정]

기존에 만들어진 tablespace 정보 확인

SQL> SELECT tablespace_name, bytes, file_name FROM dba_data_files;

 

저장된 곳을 확인했으면 그곳에 200M 정도의 테이블스페이스를 만든다.

SQL > CREATE TABLESPACE 테이블스페이스명

2 DATAFILE 'C:\ORACLE\PRODUCT\10.2.0\ORADATA\PIWMDB\PIWM01.DBF' size 200M;

 

 

[계정 생성]

SQL> CREATE USER 생성할 계정 이름 

2 IDENTIFIED BY 계정 비밀번호

3 DEFAULT TABLESPACE 테이블스페이스명

3 QUOTA UNLIMITED ON 테이블스페이스명;  // 테이블스페이스의 제한량 무한대

 

[계정에 대한 권한 설정]

GRANT CREATE SESSION, CREATE TABLE, CREATE SEQUENCE, CREATE VIEW TO 권한을 줄 계정명;

  

 

 

 

[테이블 스페이스 조회]

SELECT * FROM DBA_TABLESPACES;

 

[접속 권한 부여 (DML, DDL)]

GRANT RESOURCE, CONNECT TO 권한 받을 계정;

 

[SYNONYM 생성 권한 부여]

GRANT SYNONYM TO 권한 줄 계정명;

 

[테이블 권한 부여]

GRANT SELECT, INSERT, UPDATE, DELETE ON 권한 줄 테이블명 TO 권한 받을 계정;

 

[SYNONYM 생성]

CREATE SYNONYM 계정명.테이블명 FOR 테이블 소유자 계정명.테이블명;

  

[FUNCTION 실행 권한 부여]

GRANT EXECUTE ON 권한 줄 함수명 TO 권한 받을 계정;

 

[계정 삭제]

DROP USER  삭제할 계정 CASCADE;

 

[현재 계정 조회]

SELECT USER FROM DUAL;

 

[오라클 전체 테이블 권한 부여]

SELECT 'GRANT SELECT ON 테이블소유계정.'||TABLE_NAME || ' TO 권한을 줄 계정명;'

FROM ALL_TABLES WHERE OWNER = '테이블소유계정'



출처: https://artwook.tistory.com/244 [나비의 블로그]

 

------------------------------------------------------------------------------

티베로 작업시 필요로한 내용이다. 우연히 구글링하다 좋은 포스팅 발견하여 퍼왔다.


WRITTEN BY
테네시왈츠
항상 겸손하게 항상 새롭게 항상 진실하게

,

오라클 패키지 혹은 프로시저 호출시 동일하게 여러건 반복적으로 호출하는 경우가 있다.

이는 트랜잭션에 문제가 될 소지도 있고 DB처리 시간도 고려해 문자형 변수에 ';' 을 끝에 붙여

한방에 처리하는 구조가 훨씬 간결하다고 판단된다.


FOR C1 IN ( SELECT LEVEL AS R_INDEX
                        , REGEXP_REPLACE (REGEXP_SUBSTR ('AAA;BBB;CCC;DDD;','(.*?)' || ';', 1, LEVEL), '[;]', '') AS ABCD
                 FROM DUAL X1
            CONNECT BY REGEXP_INSTR ('AAA;BBB;CCC;DDD;', '(.*?)' || ';', 1, LEVEL) > 0 )
LOOP
 --
END LOOP;


WRITTEN BY
테네시왈츠
항상 겸손하게 항상 새롭게 항상 진실하게

,

-- 특정 기간 표시(2018-08-19 ~ 2018-08-29)

SELECT TO_CHAR( TO_DATE( '20180819', 'YYYYMMDD' ) + LEVEL-1, 'YYYYMMDD' ) AS DAY    

FROM DUAL 

CONNECT BY LEVEL <=( TO_DATE( '20180829', 'YYYYMMDD' ) - TO_DATE( '20180819', 'YYYYMMDD' ) +1 )


DAY

20180819

20180820

20180821

20180822

20180823

20180824

20180825

20180826

20180827

20180828

20180829


-- 금일 24시간 표시

SELECT TO_CHAR(SYSDATE, 'YYYYMMDD')||LPAD(LEVEL-1, 2, '0') AS DT 

FROM DUAL CONNECT BY LEVEL-0 < 25;


DT

2018082900

2018082901

2018082902

2018082903

2018082904

2018082905

2018082906

2018082907

2018082908

2018082909

2018082910

2018082911

2018082912

2018082913

2018082914

2018082915

2018082916

2018082917

2018082918

2018082919

2018082920

2018082921

2018082922

2018082923



-- 다음과 같이 JOIN 을 이용하여 단순화(?) 할 수 있음

SELECT TO_CHAR( TO_DATE( S, 'YYYYMMDD' ) + LEVEL-1, 'YYYYMMDD' ) AS DAY

FROM (SELECT '20180819' S, '20180829' E FROM DUAL)

CONNECT BY LEVEL <=( TO_DATE( E, 'YYYYMMDD' ) - TO_DATE( S, 'YYYYMMDD' ) +1 );


WRITTEN BY
테네시왈츠
항상 겸손하게 항상 새롭게 항상 진실하게

,

SELECT A1.TABLE_COMMENTS

     , A1.TABLE_NAME

--     , A1.COLUMN_ID

     , A1.COLUMN_NAME AS COLUMN_ID

     , A1.COLUMN_COMMENTS AS COLUMN_NAME

     , A1.DATA_TYPE AS DATA_TYPE     

     , (CASE A1.DATA_TYPE WHEN 'NUMBER' THEN TO_CHAR(A1.DATA_LENGTH)

                                        WHEN 'DATE'   THEN ' ' 

                                        ELSE TO_CHAR(A1.DATA_LENGTH) END) AS DATA_LENGTH

     , NVL(A1.NULL_FLAG, 'N') AS NULL_FLAG                              

     , (CASE WHEN B1.CONSTRAINT_TYPE = 'P' THEN 'PK' END) PK_FLAG

  FROM (SELECT B.COMMENTS TABLE_COMMENTS

             , A.TABLE_NAME TABLE_NAME

             , C.COMMENTS COLUMN_COMMENTS

             , A.COLUMN_NAME COLUMN_NAME

             , (CASE A.NULLABLE WHEN 'Y' THEN 'Y' END) NULL_FLAG

             , A.DATA_TYPE DATA_TYPE

             , A.DATA_LENGTH 

             , A.COLUMN_ID AS COLUMN_ID

             , A.DATA_PRECISION

        FROM USER_TAB_COLUMNS A

           , USER_TAB_COMMENTS B

           , USER_COL_COMMENTS C

       WHERE (A.TABLE_NAME = B.TABLE_NAME)

         AND (A.TABLE_NAME = C.TABLE_NAME AND A.COLUMN_NAME = C.COLUMN_NAME )

         AND B.TABLE_TYPE = 'TABLE') A1

           , ( SELECT A.TABLE_NAME

                    , A.COLUMN_NAME

                    , B.CONSTRAINT_TYPE

                 FROM USER_CONS_COLUMNS A

                    , USER_CONSTRAINTS B

                WHERE (A.CONSTRAINT_NAME = B.CONSTRAINT_NAME)

                  AND B.CONSTRAINT_TYPE IN ('P', 'R')) B1

 WHERE (A1.TABLE_NAME = B1.TABLE_NAME(+)

   AND A1.COLUMN_NAME = B1.COLUMN_NAME(+))

  --AND A1.TABLE_NAME LIKE 'TBL%'

 ORDER BY A1.TABLE_NAME, A1.COLUMN_ID;


WRITTEN BY
테네시왈츠
항상 겸손하게 항상 새롭게 항상 진실하게

,

오늘 급히 오라클 세션을 강제로 종료할 일이 발생했다.

오라클 Job의 다음 실행일시를 변경해 주는 작업인데

나는 주로 SqlDeveloper를 사용하는데 이 Tool로 변경해 주었더니 제대로 먹히지가 않았었다.

난 당연히 잘 돌았겠지 했는데 좌절감을 맛 보았다.

 

그래서 Toad를 이용하여 다음 실행일시를 변경할려고 하는데 오랫만에 Toad를 열어보니 이 마저도 만만치 않는거다

다시 SqlDeveloper로 돌아와 변경을 하고 Toad에서 확인을 해보려 강제 실행을 했더니...

그 순간 아무런 반응이 없더니 늘 그렇듯 또 어..어.. 왜 이러지... 왜 이러지... db에 문제 생길까봐 얼른 강제로 세션

종료하는 구문을 찾아야만 했다.

 

그래서 나온 답이 아래와 같다.

SELECT * FROM V$SESSION WHERE STATUS = 'ACTIVE' AND USERNAME IS NOT NULL;
ALTER SYSTEM KILL SESSION '4,9839'; -- 'SID, SERIAL#'


WRITTEN BY
테네시왈츠
항상 겸손하게 항상 새롭게 항상 진실하게

,

힌트다 힌트!


사용방법은 아래와 같다.


SELECT /*+ INDEX( IDX_COL_1 ) */

       NAME

     , AGE

     , HOBBY

  FROM MEMBER;


힌트의 종료와 사용방법은 아주 다양하고 무수히 많다.

물론 다 이해하고 사용하는 것이 맞겠지만


우선 쉬운 개념부터 잡아 나가자.

힌트를 잘못 쓰면 안쓰느만 못하는 그런 사태가 안벌어 지게 잘 이해하고 잘 사용하도록 하자.


WRITTEN BY
테네시왈츠
항상 겸손하게 항상 새롭게 항상 진실하게

,

오라클 LOCK 걸린 SQL을 찾아라

 


SELECT /*+ ORDERED */
       A.SID SID
     , TO_CHAR(B.SERIAL#) SEQ
     , ID1 ID1
     , TO_CHAR(B.AUDSID) AUD
     , B.USERNAME UNAME
     , B.OSUSER OSUSER
     , C.SQL_TEXT SQLSTMT
  FROM V$LOCK A
     , V$SESSION B
     , V$SQL C
 WHERE A.TYPE = 'TM'
   AND A.SID = B.SID
   AND C.HASH_VALUE(+) = B.SQL_HASH_VALUE;

 

 

SESSION KILL을 아래와 같이

ALTER SYSTEM KILL SESSION 'SID, SERIAL#'

 

 

 

 

참고 : http://nizistyle.tistory.com/4

 


WRITTEN BY
테네시왈츠
항상 겸손하게 항상 새롭게 항상 진실하게

,

--■■■ 프로시져(PROCEDURE) ■■■--

-- 1. PL/SQL 에서 가장 대표적인 구조인 스토어드 프로시저는

--    개발자가 자주 작성해야 하는 업무 흐름을

--    미리 작성하여 데이터베이스 내에 저장해 두었다가

--    필요할때 마다 호출하여 실행할 수 있도록 한다.

-- 2. 형식 및 구조

/*

CREATE [OR REPLACE] PROCEDURE 프로시저명

[(

    매개변수 IN  자료형,

    매개변수 OUT 자료형,

    매개변수 IN OUT 자료형

)]

IS

  [변수 선언;]

BEGIN

    실행 구문;

    [EXCEPRION

        ...;]

END;        

*/



--■■■ 프로시져 내에서의 예외처리 ■■■--

CREATE OR REPLACE PROCEDURE PRC_CHULGO_INSERT

( V상품코드   IN TBL_상품.상품코드%TYPE

, V출고수량   IN TBL_출고.출고수량%TYPE

, V출고단가   IN TBL_출고.출고단가%TYPE

)

IS 

  V출고번호  TBL_출고.출고번호%TYPE;    -- 출고번호

  V재고수량  TBL_상품.재고수량%TYPE;    -- 재고수량

  

  user_define_error EXCEPTION;         -- 사용자 정의 예외

  

BEGIN

  -- TBL_상품 테이블의 재고수량 파악(출고 대상이 되는 상품에 한해...)

  SELECT 재고수량 INTO V재고수량

  FROM TBL_상품

  WHERE 상품코드 = V상품코드;

  

  -- 파악한 재고수량보다 출고수량이 많으면 예외 발생

  IF(V출고수량 > V재고수량)

    THEN RAISE user_define_error;

  END IF;

  

  -- 선언된 변수에 값 담아내기

  SELECT NVL(MAX(출고번호), 0) INTO V출고번호

  FROM TBL_출고;

  

  -- 쿼리문 구성 (INSERT)    → TBL_출고

  INSERT INTO TBL_출고(출고번호, 상품코드, 출고일자, 출고수량, 출고단가)

  VALUES((V출고번호+1), V상품코드, SYSDATE, V출고수량, V출고단가);

  

  -- 쿼리문 구성 (UPDATE)    → TBL_상품

  UPDATE TBL_상품

  SET 재고수량 = 재고수량-V출고수량

  WHERE 상품코드 = V상품코드;

  

  -- 커밋

  COMMIT;

  

  -- 예외처리

  EXCEPTION

        WHEN user_define_error THEN RAISE_APPLICATION_ERROR(-20002, '재고부족~!!!');

                               ROLLBACK;

        WHEN OTHERS THEN 

            ROLLBACK;

END;

--==>> PROCEDURE PRC_CHULGO_INSERT이(가) 컴파일되었습니다.


[출처] 20150603_오라클(프로시져정의,예외처리)|작성자 smvtr123

http://blog.naver.com/smvtr123/220378688004


WRITTEN BY
테네시왈츠
항상 겸손하게 항상 새롭게 항상 진실하게

,

이전 회사에 한 후배가 With 문을 쓰는걸 보고 VB.NET의 기능이 오라클에도 있구나 생각했었는데 배워두면 좋을 것 같단 생각에 공부삼에 한번 시도해 보았다.


WITH TOTAL AS (

  SELECT *

    FROM TABLES

   WHERE OPER = '1000' AND WORK_DATE BETWEEN '20151201' AND '20151231' 

)

SELECT * FROM TOTAL;


간단해 보이면서도 복잡하게 느껴지는 이유는 뭘까?


복잡한 서브쿼리에서는 도움이 좀 될려나?


WRITTEN BY
테네시왈츠
항상 겸손하게 항상 새롭게 항상 진실하게

,

대용량 테이블을 새로 만들경우나 백업할 경우에 유용하게 쓰일 구문


CREATE TABLE EMP_1

UNRECOVERABLE

AS

SELECT * FROM EMP3;


롤백 세그먼트 없이 처리 하는 구문이란다.


참고 : http://blog.naver.com/speedsky98


WRITTEN BY
테네시왈츠
항상 겸손하게 항상 새롭게 항상 진실하게

,