728x90

-- 분석 함수

    -- RANK OVER()

    -- ROW_NUMBER() OVER() ** 중요  제일 많은 씀 **

      -- 순위를 구함. 

      -- RANK() OVER()는 동일 순위인 경우 1,1,3, 형식으로 출력하지만

      -- ROW_NUMBER() OVER()는 동일 순위인 경우 1,2,3, 형식으로 출력

      -- DENSE_RANK() OVER()는 동일 순위인 경우 1,1,2 형식으로 출력

      -- ROW_NUMBER() OVER()는 매우매우매우 중요한 함수이므로 반드시 알아 둘것 !!!!!!!!!!!!!!!!!!!!!!!

      

      --기본급 내림차순으로 순위를 구하기

      SELECT name, basicpay, RANK() OVER(ORDER BY basicpay DESC) 순위 FROM insa; -- 비교데이타가 똑같으면 순위를 건너뜀

      

      SELECT name, basicpay, ROW_NUMBER() OVER(ORDER BY basicpay DESC) 순위 FROM insa; -- 비교데이타가 똑같아도 순위를 차례대로 매김

      

      -- 기본급 내림차순으로 순위. 단, 기본급이 같으면 수당 내림차순.

      SELECT name, basicpay, sudang, RANK() OVER(ORDER BY basicpay DESC, sudang DESC) 순위 FROM insa;

      

       SELECT name, basicpay, sudang, ROW_NUMBER() OVER(ORDER BY basicpay DESC, sudang DESC) 순위 FROM insa;

      

      -- 부서별 기본급의 내림차순 순위 구하기

      SELECT name, basicpay, buseo, 

        RANK() OVER(PARTITION BY buseo ORDER BY basicpay DESC, sudang DESC) 순위 

        FROM insa;

      

      SELECT name, basicpay, buseo, 

        ROW_NUMBER() OVER(PARTITION BY buseo ORDER BY basicpay DESC, sudang DESC) 순위 

        FROM insa;

      

      -- 출신도별 부서별 순위(학년의 반별)

      SELECT name, basicpay, city, buseo, 

        RANK() OVER(PARTITION BY city ORDER BY basicpay DESC, sudang DESC) 순위 

        FROM insa;

        

      -- 여자 인원수가 가장 많은 부서는?

      SELECT buseo, COUNT(*) FROM insa

        WHERE SUBSTR(ssn,8,1) IN (2,4,6)

        GROUP BY buseo;

        

      SELECT buseo FROM(

      SELECT buseo, COUNT(*) cnt, RANK() OVER(ORDER BY COUNT(*) DESC) 순위

        FROM insa WHERE SUBSTR(ssn,8,1) IN (2,4,6) GROUP BY buseo

        ) WHERE 순위 =1;

        

      -- 기본급여 많이 받는 1~10등 까지 출력(name, basicpay)

      SELECT name, basicpay,RANK() OVER(ORDER BY basicpay DESC) 순위 FROM(

      SELECT name, basicpay, RANK() OVER(ORDER BY basicpay DESC) 순위 FROM insa 

      ) WHERE 순위 <=10;

      

      -- 기본급 상위 10% 출력(name, basicpay)

       SELECT name, basicpay FROM(

        SELECT name, basicpay, RANK() OVER(ORDER BY basicpay DESC) 순위 FROM insa 

        )WHERE 순위<=TRUNC((SELECT COUNT(*) FROM insa) *0.1);

      

      -- 기본급 하위 10% 출력(

      SELECT name, basicpay FROM(

        SELECT name, basicpay, RANK() OVER(ORDER BY basicpay) 순위 FROM insa 

        )WHERE 순위<=TRUNC((SELECT COUNT(*) FROM insa) *0.1);

      

      -- 부서별 기본급여 가장 높은 사람들 출력( name, buseo, jikwi)

      SELECT name, buseo,basicpay, RANK() OVER(PARTITION BY buseo ORDER BY basicpay DESC) 순위

      FROM insa; -- 일단 부서별 순위를 매기는 쿼리

      

      SELECT name, buseo,basicpay FROM(

        SELECT name, buseo,basicpay,

        RANK() OVER(PARTITION BY buseo ORDER BY basicpay DESC) 순위 

        FROM insa

        ) WHERE 순위=1;

        

    -- ***** 나중에 게시판 작성 할 때 사용하는 쿼리 형식이므로 반드 암기 해야함. *****

    -- ROW_NUMBER()를 이용한 쿼리가 아래 ROWNUM을 사용한 쿼리보다 우수

      SELECT num,name,basicpay FROM(

        SELECT num, name, basicpay, ROW_NUMBER() OVER(ORDER BY num DESC) rnum FROM insa

        ) WHERE rnum>= 10 AND rnum <=15 ORDER BY num DESC;

        

     SELECT num,name,basicpay FROM(

      SELECT ROWNUM rnum, num, name, basicpay FROM(

        SELECT num, name, basicpay FROM insa ORDER BY num DESC

      )

    )WHERE rnum>=10 AND rnum<=15;



출처: http://tibang.tistory.com/entry/오라클-분석-함수-RANK-OVER-ROWNUMBER-OVER [T없이맑은날]

반응형
728x90

출처 - http://kalipso.tistory.com/80 

출처 - http://mentor75.tistory.com/entry/ORACLE-TABLE-SPACE-%EC%82%AC%EC%9A%A9%EB%9F%89-%ED%99%95%EC%9D%B8%EC%BF%BC%EB%A6%AC

출처 - https://kldp.org/node/34801

출처 - http://stackoverflow.com/questions/264914/how-do-i-calculate-tables-size-in-oracle

 

1. 테이블스페이스 정보 조회

SELECT * FROM DBA_TABLESPACES;

 

 

2. 테이블스페이스별 용량 확인 쿼리문(MB 단위)

select   substr(a.tablespace_name,1,30) tablespace,
         round(sum(a.total1)/1024/1024,1) "TotalMB",
         round(sum(a.total1)/1024/1024,1)-round(sum(a.sum1)/1024/1024,1) "UsedMB",
         round(sum(a.sum1)/1024/1024,1) "FreeMB",
         round((round(sum(a.total1)/1024/1024,1)-round(sum(a.sum1)/1024/1024,1))/round(sum(a.total1)/1024/1024,1)*100,2) "Used%"
from
         (select   tablespace_name,0 total1,sum(bytes) sum1,max(bytes) MAXB,count(bytes) cnt
          from     dba_free_space
          group by tablespace_name
          union
          select   tablespace_name,sum(bytes) total1,0,0,0
          from     dba_data_files
          group by tablespace_name) a
group by a.tablespace_name
order by tablespace;

 

조회결과를 다음과 같이 살펴볼 수 있다.

TABLESPACE명총용량(TotalMB)사용용량(UsedMB)여유용량(FreeMB)사용율(Used%)
SYSAUX1024514.4509.650.23
SYSTEM102439063438.09
TS_SEND_DATA7096059890.611069.484.4
TS_SEND_TEMP10240.11023.90.01
UNDOTBS1451855.74462.31.23
USERS1000.199.90.1

 

 

3. 테이블스페이스별 현황 확인 쿼리문(MB 단위)

SELECT TABLESPACE_NAME, FILE_NAME, BYTES/1024 AS MBytes, RESULT/1024 AS USE_MBytes FROM
  (
  SELECT E.TABLESPACE_NAME,E.FILE_NAME,E.BYTES, (E.BYTES-SUM(F.BYTES)) RESULT
  FROM DBA_DATA_FILES E, DBA_FREE_SPACE F
  WHERE E.FILE_ID = F.FILE_ID
  GROUP BY E.TABLESPACE_NAME, E.FILE_NAME, E.BYTES
  ) A;

 

TABLESPACE_NAMEFILE_NAMEMBYTESUSE_MBYTES
SYSTEMC:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST\SYSTEM01.DBF14643201458816
SYSAUXC:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST\SYSAUX01.DBF471040450048
USERSC:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST\USERS01.DBF51203328
TESTC:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST\TEST2073395218843264
EXAMPLEC:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST\EXAMPLE01.DBF10240079552
UNDOTBS1C:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST\UNDOTBS01.DBF691712017856
ORCLC:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST\ORCL10485761600

 

 

4.  테이블스페이스별, 파일별 현황 확인 쿼리문(바이트 단위)

SELECT    A.TABLESPACE_NAME "테이블스페이스명",
          A.FILE_NAME "파일경로",
           (A.BYTES - B.FREE)    "사용공간",
            B.FREE                 "여유 공간",
            A.BYTES                "총크기",
            TO_CHAR( (B.FREE / A.BYTES * 100) , '999.99')||'%' "여유공간"
      FROM
       (
         SELECT FILE_ID,
                TABLESPACE_NAME,
                FILE_NAME,
                SUBSTR(FILE_NAME,1,200) FILE_NM,
                SUM(BYTES) BYTES
           FROM DBA_DATA_FILES
         GROUP BY FILE_ID,TABLESPACE_NAME,FILE_NAME,SUBSTR(FILE_NAME,1,200)
       ) A,
       (
         SELECT TABLESPACE_NAME,
                FILE_ID,
                SUM(NVL(BYTES,0)) FREE
           FROM DBA_FREE_SPACE
        GROUP BY TABLESPACE_NAME,FILE_ID
       ) B
      WHERE A.TABLESPACE_NAME=B.TABLESPACE_NAME
         AND A.FILE_ID = B.FILE_ID;

 

테이블스페이스명파일경로사용공간여유공간총크기여유공간
TS_TEST_DATA/oradata/TEST/ts_test_data02.dbf16148332544532650393621474836480  24.80%
TS_TEST_DATA/oradata/TEST/ts_test_data03.dbf16073621504540121497621474836480  25.15%
TS_TEST_DATA/oradata/TEST/ts_test_data.dbf3057785241687942758431457280000   2.80%
SYSAUX/oradata/TEST/sysaux01.dbf5393612805343805441073741824  49.77%
USERS/oradata/TEST/users01.dbf65536104792064104857600  99.94%
SYSTEM/oradata/TEST/system01.dbf4089446406647971841073741824  61.91%
UNDOTBS1/oradata/TEST/undotbs01.dbf5314969646843166724737466368  98.88%
TS_TEST_TEMP/oradata/TEST/ts_test_temp.dbf6553610736762881073741824  99.99%

 

 

5. 테이블 용량 조회

SELECT
   owner, table_name, TRUNC(sum(bytes)/1024/1024/1024) GB
FROM
(SELECT segment_name table_name, owner, bytes
FROM dba_segments
WHERE segment_type in  ('TABLE','TABLE PARTITION')
UNION ALL
SELECT i.table_name, i.owner, s.bytes
FROM dba_indexes i, dba_segments s
WHERE s.segment_name = i.index_name
AND   s.owner = i.owner
AND   s.segment_type in ('INDEX','INDEX PARTITION')
UNION ALL
SELECT l.table_name, l.owner, s.bytes
FROM dba_lobs l, dba_segments s
WHERE s.segment_name = l.segment_name
AND   s.owner = l.owner
AND   s.segment_type IN ('LOBSEGMENT','LOB PARTITION')
UNION ALL
SELECT l.table_name, l.owner, s.bytes
FROM dba_lobs l, dba_segments s
WHERE s.segment_name = l.index_name
AND   s.owner = l.owner
AND   s.segment_type = 'LOBINDEX')
---WHERE owner in UPPER('&owner')
GROUP BY table_name, owner
HAVING SUM(bytes)/1024/1024 > 10  /* Ignore really small tables */
ORDER BY SUM(bytes) desc


반응형
728x90

Pragma Autonomous_Transaction 사용방법

출처 : http://nagid.egloos.com/2597143

Pragma Autonomous_Transaction

-- 자율 트랜잭션
-- 부모 트랜잭션의 승인/롤백 여부에 상관없이 자신의 작업을 승인하거나 롤백할 수 있다.


-- 프로시저 생성

CREATE OR REPLACE PROCEDURE LOG_MESSAGE( P_MESSAGE VARCHAR2 )
AS
    PRAGMA AUTONOMOUS_TRANSACTION;
    -- 자율 트랜잭션
    -- 부모 트랜잭션의 승인/롤백 여부에 상관없이 자신의 작업을 승인하거나 롤백할 수 있다.
BEGIN
    INSERT INTO LOG_TABLE( USERNAME, DATE_TIME, MESSAGE )
                  VALUES ( USER, CURRENT_DATE, P_MESSAGE );
    COMMIT;
END LOG_MESSAGE;

-- 테이블 생성
CREATE TABLE LOG_TABLE( USERNAME VARCHAR2(30),
                        DATE_TIME TIMESTAMP,
                        MESSAGE VARCHAR2(4000) );

CREATE TABLE TEMP_TABLE( N NUMBER );


-- 프로시저 실행
BEGIN
    LOG_MESSAGE('INSERT INTO TEMP_TABLE');

    INSERT INTO TEMP_TABLE VALUES(12345);

    LOG_MESSAGE('ROLLBACK INSERT');

    ROLLBACK;
END;


반응형
728x90

1. 계정의 테이블 스페이스 생성

create tablespace [tablespace_name] 
datafile '/home/oracle/oradata/DANBEE/[file_name].dbf' size 500m;

예)
CREATE TABLESPACE ADMIN DATAFILE 'D:\ORACLE\ORADATA\XE\ADMIN.dbf' SIZE  500M ;


2. 오라클 유저 만들기

CREATE USER [user_name] 
IDENTIFIED BY [password]
DEFAULT TABLESPACE [tablespace_name]
TEMPORARY TABLESPACE TEMP;

예)
CREATE USER nextree IDENTIFIED BY nextree DEFAULT TABLESPACE NEXTREE TEMPORARY TABLESPACE TEMP;


3. 생성한 USER에 권한주기

GRANT connect, resource, dba TO [user_name];

예)
grant connect, dba, resource to 유저명; (모든 권한 주기)

GRANT CREATE SESSION TO 유저명         // 데이터베이스에 접근할 수 있는 권한
GRANT CREATE DATABASE LINK TO 유저명
GRANT CREATE MATERIALIZED VIEW TO 유저명
GRANT CREATE PROCEDURE TO 유저명
GRANT CREATE PUBLIC SYNONYM TO 유저명
GRANT CREATE ROLE TO 유저명
GRANT CREATE SEQUENCE TO 유저명
GRANT CREATE SYNONYM TO 유저명
GRANT CREATE TABLE TO 유저명             // 테이블을 생성할 수 있는 권한
GRANT DROP ANY TABLE TO 유저명         // 테이블을 제거할 수 있는 권한
GRANT CREATE TRIGGER TO 유저명 
GRANT CREATE TYPE TO 유저명 
GRANT CREATE VIEW TO 유저명

GRANT  
 CREATE SESSION
,CREATE TABLE
,CREATE SEQUENCE   
,CREATE VIEW
TO 유저명;

4. 생성한 USER로 ORACLE에 접속하기

sqlplus nextree/nextree[@db_sid]


5. 계정 삭제하기

drop user 사용자계정 cascade;

-- 테이블 스페이스 크기 확장해주는 쿼리문
alter database 
datafile 'D:\oracle\oradata\XE\ADMIN.DBF'  resize 900M;

--테이블 스페이스 정보 보는 쿼리문 
SELECT file_name, tablespace_name, bytes, status FROM  DBA_DATA_FILES;

--테이블 명시적 인덱스 생성
--1번째 방법
CREATE INDEX MSID_IDX1 ON TEST(MSID)
--2번째 방법
create index test1_test on test1(test) 
tablespace users 
storage 

initial 10k 
next     10k 
pctincrease 0) 
pctfree 10

--테이블 정보 보는 쿼리
select * from user_constraints-- where table_name = upper('test1');

--ORA-00054: 자원이 사용중이고, NOWAIT가 지정되어 있습니다 해결 방법 
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='CAR_INFO';

alter system kill session '12, 27846';

-- CAR_INFO에는 있는 값을 DASH_BOARD에 넣기
INSERT INTO DASH_BOARD(CAR_LICEN_NUM)
SELECT CAR_LICEN_NUM FROM CAR_INFO
MINUS
SELECT CAR_LICEN_NUM FROM DASH_BOARD


SYSTEM 계정 패스워드 변경하기
사용자계정 : /as sysdba

alter user system identified by "암호";
일반 스트링은 관계없지만 특수문자가 있을경우 반드시 "" 따옴표로 감싸준다.


반응형
728x90

05 11, 2010 11:03

DB Table에 난수(Random)값 입력하기

Posted by kimstar Posted in " DATABASE "


통계성 DB Table을 보는 프로그램을 작성시..

입력값이 없어서 개발을 못할경우 랜덤값으로 입력해주는 PL/SQL 입니다.


begin 

for i in 1 .. 100

loop 

insert into s_scpi values 

(

TO_CHAR(sysdate+1/(24*60)*i, 'yyyymm'),   -- s_yyyymm            varchar2(6)  

TO_CHAR(sysdate+1/(24*60)*i, 'dd'),       -- s_dd                varchar2(2)  

TO_CHAR(sysdate+1/(24*60)*i, 'HH24'),     -- s_hh                varchar2(2)  

TO_CHAR(sysdate+1/(24*60)*i, 'MI'),       -- s_mi                varchar2(2)  

'smsg1a',                                 -- system_name         varchar2(16) 

'test_'||dbms_random.string('L', 1),      -- scpi_name           varchar2(16) 

rpad(ABS(dbms_random.random),1),          -- entity_id           number(7)    

rpad(ABS(dbms_random.random),4),          -- scp_request         number(7)    

rpad(ABS(dbms_random.random),4),          -- scp_request_rsp     number(7)    

rpad(ABS(dbms_random.random),4),          -- scp_request_succ    number(7)    

rpad(ABS(dbms_random.random),4),          -- scp_request_fail    number(7)    

rpad(ABS(dbms_random.random),4),          -- scp_cancel          number(7)    

rpad(ABS(dbms_random.random),4),          -- scp_cancel_rsp      number(7)    

rpad(ABS(dbms_random.random),4),          -- scp_cancel_succ     number(7)    

rpad(ABS(dbms_random.random),4)           -- scp_cancel_fail     number(7)    

); 

end loop;

commit; 

end; 

/

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


dbms_random.string('U', 5)  ->   대문자로 5개의 랜덤한 글자 만들기 ( 이름 만들기 힘들어서-_-;)

dbms_random.value(1,9)  ->  1~9까지 난수 발생으로

abs(rpad(dbms_random.random,4))  -> 랜덤한 숫자 4자리 발생

sysdate+1 : 현재+1일

sysdate+1/(24*60)*10 : 현재+10분 

sysdate+1/(24*60)*i -> 현재시간+i분



반응형

'DataBase > Oracle' 카테고리의 다른 글

Select Interval  (0) 2015.10.05
테이블단위 백업과 복구  (0) 2015.10.05
오라클 기동과 정지  (0) 2015.10.05
옵티마이저(Optimizer) 최적화  (0) 2015.10.05
TableSpace 조회하고 생성하기  (0) 2015.10.05

+ Recent posts