문제 65. dba 일을 편하게 하는 자동화 스크립트에 alert log file 분석을 4번으로 추가하세요
while True:
print( """ === dba 작업을 편하게 수행하기 위한 스크립트 총모음 ====
0. 프로그램을 종료하려면 0번
1. 테이블 스페이스 사용량을 확인하려면 1번
2. 현재 데이터베이스 락(lock) 발생했는지 확인하려면 2번
3. 오라클와 연동하게 싶으면 3번
4. alrrt log file에서 가장 많이 발생하는 에러번호를 확인하려면 4번
""")
num = int( input('원하는 번호를 입력하세요 ~' ) )
if num == 0:
break
elif num == 1:
import cx_Oracle
import pandas as pd
dsn = cx_Oracle.makedsn( 'localhost' , 1521, 'xe')
db = cx_Oracle.connect('c##scott','tiger', dsn)
cursor = db.cursor()
cursor.execute(""" select t.tablespace_name,
round(((t.total_size - f.free_size) / t.total_size),2) * 100 usedspace
from (select tablespace_name, sum(bytes)/1024/1024 total_size
from dba_data_files
group by tablespace_name) t,
(select tablespace_name, sum(bytes)/1024/1024 free_size
from dba_free_space
group by tablespace_name) f
where t.tablespace_name = f.tablespace_name(+) """)
row = cursor.fetchall()
col=[]
for i in colname:
col.append( i[0].lower() )
df = pd.DataFrame (list(row), columns=col)
print(df)
break
elif num == 2:
continue
elif num ==3:
import cx_Oracle # 오라클과 파이썬을 연동하기 위한 모듈
import pandas as pd
dsn = cx_Oracle.makedsn( 'localhost' , 1521, 'xe')
db = cx_Oracle.connect('c##scott','tiger', dsn)
cursor = db.cursor()
cursor.execute(""" select * from emp """)
row = cursor.fetchall()
colname = cursor.description
col=[]
for i in colname:
col.append( i[0].lower() )
emp = pd.DataFrame (list(row), columns=col)
print(' 잘 연동되었습니다')
break
elif num == 4:
jobs = open("C:\\app\\ITWILL\\product\\18.0.0\\diag\\rdbms\\xe\\xe\\trace\\alert_xe.log", encoding='cp949', errors='ignore')
data = jobs.read()
data2= data.split()
k = []
for i in data2:
if 'ora-' in i.lower():
k.append(i)
import pandas as pd
df = pd.DataFrame( k, columns=['col1'] )
from pandasql import sqldf
pysqldf = lambda q : sqldf( q, globals() )
q = """
select col1, count(*) as 갯수
from df
group by col1
order by 2 desc;
"""
print(pysqldf(q))
break
✅ 리스트의 주요 함수들!
✅ 리스트의 특징들
✏️ 리스트의 데이터는 순서대로 저장
된다.
✏️ 리스트에는 서로 다른 데이터 유형을 같이 저장
할 수 있다. ( 파이썬의 장점 )
✏️ 리스트는 리스트 안의 요소를 변경할 수 있다.
(튜플은X)
예제1.
아래와 같이 리스트를 구성하세요
a = [7788, 'scott', 3000, '81/12/17', 20]
print(a)
예제2.
a 리스트에서 scott을 smith로 변경하기
a[1] = 'smith'
a
문제 66. a리스트에서 숫자 20을 30으로 변경하세요
a[4] = 30 a
문법
a = ['소', '중', '한', '것', '을', '먼', '저', '하', '라' ]
- a[자리번호1 : 자리번호2 ] : 자리번호1 이상부터 자리번호2 미만까지 슬라이싱
- a[ : 자리번호1 ] : 처음부터 자리번호1 미만까지 슬라이싱
- a[ 자리번호1 : ] : 자리번호1 이상부터 끝까지 슬라이싱
예제1.
아래의 리스트에서 "소중한것" 을 슬라이싱 하시오 !
a = ['소', '중', '한', '것', '을', '먼', '저', '하', '라' ]
a[ : 4 ]
문제67. 아래의 리스트에서 '바위' 만 슬라이싱 하시오 !
a = ['낙', '숫', '물', '이', '바', '위', '를', '뚫', '는', '다']
결과: ['바', '위']
답: a[4:6]
문법
리스트에 값 추가하는 리스트 함수 3가지
- 리스트.append(요소명) : 리스트의 '맨 마지막'에 요소를 추가
- 리스트.insert(자리번호, 요소명) : 리스트의 해당 자리번호에 요소명을 추가
- 리스트.extend(리스트명) : 리스트의 여러개의 요소들을 한번에 추가
예제1.
아래의 a 리스트 맨 마지막에 5000을 추가하시오
a = [1000, 2000, 3000, 4000]
a.append(5000)
a
예제2.
아래 코인 리스트의 첫번째 요소로 '앞면' 을 추가하시오
coin = ['뒷면']
coin.insert(0,'앞면')
coin
예제3.
아래와 같이 a리스트, b리스트를 만들고 a리스트에 요소들로 b리스트를 구성하세요
a = [1000,2000,3000,4000]
b = [5000,6000,7000,8000]
a.extend(b)
a
결과
문제 68. 아래의 dice라는 리스트를 만들고 dice리스트에 숫자 5를 추가하기
dice = [1,2,3,4,6]
dice.insert(4, 5)
dice
문제 69. 아래의 a 리스크의 요소들을 하나씩 뽑아서 다음과 같이 출력하기
a = [4,2,6,2,1]
for i in a: # a자리는 원래 범위 자리인데 리스트명을 쓰면 된다.
print(i)
문제 70. 아래의 a 리스트 요소들을 하나씩 전부 b 리스트에 추가하시오
a = [4,2,6,2,1]
b = [] # 빈 리스트 만들기
for i in a :
b.append(i)
print(b)
프린트를 어펜드 바로 밑에쓰면 추가되는 과정을 볼 수 있다.
리스트의 값을 정렬하는 4가지 방법
1. (리스트의 함수) 리스트.sort() : 리스트의 요소들을 실제로 정렬시킴
2. (파이썬 내장함수)sorted
(리스트) : 리스트의 요소들은 그냥 그대로 두고 리스트를 정렬한 상태로 출력
3.(리스트의 함수) 리스트.reverse() : 리스트 요소들을 실제로 역순으로 정렬
4. (파이썬 내장함수)reversed
(리스트) : 리스트의 요소들은 그대로 두고 리스트의 요소들을 역순을 정렬된 상태로 출력
✅ 리스트를 쓰고 함수명을 썼다면 리스트의 함수, 함수명을 먼저쓰고 리스트를 썼다면 파이썬 내장함수이다.
예제1.
다음 a 리스트의 요소들을 정렬해서 출력
a = [2000,1000,4000,5000,3000]
a.sort()
a
✅ a.sort()는 정렬을 하는 작업을 수행하는것이지 수행된 결과를 보여주는것은 아니다. 리스트의 결과를 보려면 따로 실행해야 한다.
예제2.
아래의 a리스트를 a리스트의 요소의 순서는 변경하지 말고 정렬해서 출력하기
✍🏻 sorted(리스트) -> 파이썬 내장함수
a = [2000,1000,4000,5000,3000]
sorted(a)
✅ 위 코드에서 다시 a리스트를 보고싶으면
a = [2000,1000,4000,5000,3000]
sorted(a)
print(a)
문제 71. 지금까지 배운 2가지 중 하나를 사용해서 아래의 결과를 구현하시오
아래의 a리스트의 요소를 정렬해서 b 리스트를 구성하기
a = [2000,1000,4000,5000,3000]
b = sorted(a)
print(b)
예제3.
아래의 a리스트의 요소를 역순으로 출력하기
-> 실제로 a리스트의 요소들의 순서를 역순으로 변경하기!
a = [2000,1000,4000,5000,3000]
a.sort(reverse=True)
print(a)
문제 72. 아래의 b리스트의 요소들을 abcd 순서대로 정렬해서 출력
b = ['carrot', 'banana', 'lemon', 'apple', 'guaba']
b.sort()
print(b)
결과: [ 'apple', 'banana', 'carrot', 'guaba', 'lemon']
예제4.
아래의 요소들의 순서를 역순으로 정렬하시오
b = ['carrot', 'banana', 'lemon', 'apple', 'guaba']
b.reverse()
b
예제5.
아래의 리스트의 요소를 실제로 역순으로 변경시키지 않고 출력만 역순으로 되게 하세요
b = ['carrot', 'banana', 'lemon', 'apple', 'guaba']
# reversed(b) 이렇게만 쓰면 이상한 메모리 주소가 뜬다. 리스트에 담아서 출력해주기
list(reversed(b) )
# 역순으로 변경된 결과를 리스트에 담아서 출력
문제 73. 아래의 b 리스트의 결과를 역순으로 출력하는데, d라는 리스트에 담아서 출력
b = ['carrot', 'banana', 'lemon', 'apple', 'guaba'] d = list(reversed(b) ) print(d)
문제 74. 아래의 b리스트의 결과를 a,b,c,d가 아니라 다음과 같이 decending하게 출력
b = ['carrot', 'banana', 'lemon', 'apple', 'guaba']
결과 : ['lemon','guaba', 'carrot', 'banana', 'apple']
b = ['carrot', 'banana', 'lemon', 'apple', 'guaba'] b.sort(reverse = True) b
문법
1. 리스트.count('요소명') : 리스트 안에서 요소명의 갯수 출력
1. 리스트.index('요소명') : 리스트 안에서 요소명의 자리번호 출력
예제1.
아래의 리스트에서 불량품이 몇개가 있는지 출력하기
box = ['정상품','정상품','불량품','정상품','불량품']
box.count('불량품')
예제2.
아래의 리스트에서 불량품 자리번호를 출력
box = ['정상품','정상품','불량품','정상품','불량품']
box.index('불량품')
# 2만 출력된다. 그런데 불량품은 4에도 있음.
✅ 리스트함수 인덱스를 가지고 두번째로 나오는 불량품의 자리번호를 출력할 수 없다. 두번째로 나오는 불량품의 자리번호를 출력하려면 enumerate
라는 함수를 이용해야한다.
box = ['정상품','정상품','불량품','정상품','불량품']
for num, i in enumerate(box) :
print(num,i)
num에는 자리번호, i는 요소번호가 들어간다.
✅ 리스트의 요소명과 자리번호를 동시에 뽑아낼 수 있다.
문제 75. 아래의 스크립트를 가지고 불량품에 해당하는 자리번호 2와 4를 출력하시오 !
box = ['정상품','정상품','불량품','정상품','불량품'] for num, i in enumerate(box) : if i == '불량품': print(num,i)
- 리스트.remove('요소명') : 리스트의 요소를 요소명으로 삭제
- del 리스트[자리번호] : 리스트의 요소를 자리번호로 삭제 (파이썬 내장함수)
- 리스트.clear() : 리스트의 모든 요소를 다 삭제한다.
예제1.
아래의 box 리스트에서 요소명이 불량품을 지우시오!
box = ['정상품','정상품','불량품','정상품','불량품']
box.remove('불량품')
box
✅ 불량품 2개중 하나만 지워졌다!
예제2.
아래의 박스 리스트에서 요소명 불량품을 지우는데, 4번 불량품을 지우기
box = ['정상품','정상품','불량품','정상품','불량품']
del box[4]
box
문제 76. 아래의 박스 리스트에서 불량품 2개를 다 지우시오
box = ['정상품','정상품','불량품','정상품','불량품'] for num, i in enumerate(box) : if i == '불량품': del box[num] print(box)
문제 77. 아래의 박스 리스트 모두 지우기
box = ['정상품','정상품','불량품','정상품','불량품'] box.clear() box
- len(리스트) : 리스트의 요소의 갯수 출력
- sum(리스트) : 숫자로된 리스트 요소들의 합
- map(함수, 리스트) : 리스트의 요소들의 값을 순서대로 함수에 적용
- filter(함수, 리스트) : 리스트의 요소들의 값을 순서대로 함수에 적용
- zip(리스트1, 리스트2) : 리스트1, 리스트2의 요소들을 동시에 for loop문으로 불러올 수 있게 해주는 함수
- enumerate(리스트) : 리스트 요소들을 자리번호와 함께 짝지어주는 함수
예제1.
아래 리스트 요소들의 갯수 확인 (5개)
box = ['정상품','정상품','불량품','정상품','불량품']
len(box)
문제 78. 아래 요소들의 숫자들 합을 출력
box2 = [1000,2000,3000,4000,5000] sum(box2)
문제 79. 다음과 같이 몸무게 데이터인 weight리스트를 생성하고 몸무게의 평균값을 출력하시오
weight = [72,81,91,78,84,65] a = sum(weight) / len(weight) round(a,1) # 소수점 첫번째 자리를 기준으로 두고 두번째 자리에서 반올림
예제2.
아래의 몸무게 리스트에서 몸무게가 80 이상이면 비만
, 아니면 정상
이 출력되게 하기
weight = [72,81,91,78,84,65]
# 1.함수를 생성합니다.
def f(x):
if x >= 80:
return '비만'
else :
return '정상'
print(f(84))
----------------------------------------------------
# 2. 위 함수를 map 함수를 이용해서 weigth 리스트의 값으로 결과 출력
weight = [72,81,91,78,84,65]
list(map(f,weight))
문제 80. 아래의 리스트에서 몸무게 80이상인 데이터만 아래와 같이 출력되게 하시오
def f2(x): if x >= 80: return x else : return print(f(80)) #%% weight = [72,81,91,78,84,65] list(map(f2,weight) )
맵은 무조건 매핑시켜야 하기 때문에 none 이 나오는 것을 확인할 수 있다. 그래서 이문제는 map으로 하면 안된다. 이럴때는 필터를 사용하면 된다.weight = [72,81,91,78,84,65] list(filter(f2,weight) )
⭐ 이것이 map, filter함수의 차이 !!
문제 81. 다음 weight 리스트의 데이터를 가지고 체중이 90 이상이면 '비만', 80이상이면 '과체중' 나머지는 '정상'이라고 해서 result리스트에 담아 출력하기
weight = [72,81,91,78,84,65] def f3(x): if x >= 90: return '비만' elif x >=80: return '과체중' else : return '정상' list(map(f3,weight) )
예제3.
아래의 weight 리스트의 요소와 result 리스트의 요소를 서로 짝지어서 출력하기
weight = [72,81,91,78,84,65]
result = ['정상', '과체중', '비만', '정상', '과체중', '정상']
for i, k in zip (weight, result):
print (i,k)
✅ 3개도 된다 !
아래의 result 리스트의 요소들을 for loop문으로 출력하는데 자리번호도 같이 출력
result = ['정상', '과체중', '비만', '정상', '과체중', '정상']
for num, i in enumerate(result):
print(num,i)
문제 82. 아래의 두개 리스트를 가지고 아래의 결과를 출력하시오 !
몸무게가 70kg 대 이면서 정상인것만 출력
weight = [72,81,91,78,84,65]
result = ['정상', '과체중', '비만', '정상', '과체중', '정상']
결과
72 정상
78 정상
result = ['정상', '과체중', '비만', '정상', '과체중', '정상'] for w,r in zip(weight, result): if (w >= 70 and w <=79) and r =='정상': print(w,r)
db감사가 있으니 db 테이블 정의서를 엑셀로 주니!
예제1.
emp 테이블에 대한 설명이 있는 all_tab_comments를 조회
select *
from all_tab_comments
where table_name = 'EMP' and owner = 'C##SCOTT';
예제2.
emp 테이블에 대한 설명을 데이터베이스에 저장하시오 !
comment on table emp is '사원에 대한 정보를 담고있는 테이블';
예제3.
dept 테이블에 대한 설명을 데이터베이스에 저장하시오 !
comment on table dept is '부서에 대한 정보인 부서번호, 부서위치, 부서명을 담고있는 테이블';
--------------------------------------------------
select *
from all_tab_comments
where table_name = 'DEPT' and owner = 'C##SCOTT';
예제3.
EMP테이블의 EMPNO에 대해 주석설명을 데이터베이스에 저장
-- 물리명 논리명
-- ↓ ↓
comment on column emp.empno is '사원번호';
---------------------------------------------------
select *
from all_col_comments
where table_name = 'EMP' and owner = 'C##SCOTT';
데이터 베이스 모델 그림 그리는 erwin 프로그램에서 아래의 스크립트를 버튼 클릭 몇번으로 뽑아낼 수 있다!
comment on column emp.empno is '사원번호'; comment on column emp.ename is '사원이름'; comment on column emp.sal is '월급'; comment on column emp.job is '직업'; comment on column emp.mgr is '관리자 번호'; comment on column emp.hiredate is '입사일'; comment on column emp.comm is '커미션'; comment on column emp.deptno is '부서번호';
예제5.
emp테이블에 대해서 테이블 정의서를 출력하는 sql 수행
COMMENT ON TABLE EMP IS '사원 테이블';
COMMENT ON COLUMN EMP.EMPNO IS '사원번호';
COMMENT ON COLUMN EMP.DEPTNO IS '부서번호';
COMMENT ON COLUMN EMP.ENAME IS '사원명';
COMMENT ON COLUMN EMP.JOB IS '직업';
COMMENT ON COLUMN EMP.MGR IS '관리자의 사원번호';
COMMENT ON COLUMN EMP.HIREDATE IS '고용일자';
COMMENT ON COLUMN EMP.SAL IS '월급';
COMMENT ON COLUMN EMP.COMM IS '커미션';
COMMENT ON TABLE DEPT IS '부서 테이블';
COMMENT ON COLUMN DEPT.DEPTNO IS '부서번호';
COMMENT ON COLUMN DEPT.LOC IS '부서위치';
COMMENT ON COLUMN DEPT.DNAME IS '부서명';
COMMENT ON TABLE SALGRADE IS '급여 테이블';
COMMENT ON COLUMN SALGRADE.GRADE IS '급여등급';
COMMENT ON COLUMN SALGRADE.LOSAL IS '최저월급';
COMMENT ON COLUMN SALGRADE.HISAL IS '최고월급';
SELECT A.COLUMN_ID AS NO
, B.COMMENTS AS "논리명"
, A.COLUMN_NAME AS "물리명"
, A.DATA_TYPE AS "자료 형태"
, A.DATA_LENGTH AS "길이"
, DECODE(A.NULLABLE, 'N', 'No', 'Y', 'Yes') AS "Null 허용"
, A.DATA_DEFAULT AS "기본값"
, B.COMMENTS AS "코멘트"
FROM ALL_TAB_COLUMNS A
LEFT JOIN ALL_COL_COMMENTS B
ON A.OWNER = B.OWNER
AND A.TABLE_NAME = B.TABLE_NAME
AND A.COLUMN_NAME = B.COLUMN_NAME
WHERE A.TABLE_NAME = 'EMP' AND A.OWNER='C##SCOTT'
ORDER BY A.COLUMN_ID;
✅ EMP테이블에 대한 테이블 정의서를 출력해보았습니다.
위 결과를 엑셀에 붙여야하는데, DB 에 있는 모든 테이블들에 대하여 다 작업해주어야 합니다.
예제6.
DB 에 테이블이 뭐가있는지 DB에 있는 모든 테이블 이름을 조회하시오
select table_name
from dba_tables;
예제7.
c##scott, hr,sh,oe 유저에 대한 테이블들만 조회하기(101개)
select table_name
from dba_tables
where owner in ('C##SCOTT', 'HR','SH','OE')
and table_name not like 'DR%';
✅ 101개나 되는 테이블들에 대해 테이블 정의서를 엑셀로 모두 만들어주어야 합니다.
예제8.
오라클 디비와 파이썬을 연동하여 오라클 디비의 테이블들을 파이썬에서 출력하기
import cx_Oracle import pandas as pd dsn = cx_Oracle.makedsn( 'localhost' , 1521, 'xe') db = cx_Oracle.connect('c##scott','tiger', dsn) cursor = db.cursor() #나의 오라클 디비에 있는 테이블명 리스트를 CURSOR라는 메모리에 올린것이다! cursor.execute(""" select table_name from dba_tables where owner in ('C##SCOTT', 'HR', 'SH', 'OE') and table_name not like 'DR%' """) #커서에 있는 데이터를 불러와서 row변수에 담아냄. row = cursor.fetchall() row # len(row) 쓰면 갯수가 나온다. 101개!
예제9.
위 row리스트에 담긴 요소들을 하나씩 뽑아서 출력하기
for i in row:
print(i)
--------------
for i in row:
print(i[0])
[오늘 마지막 문제] 위 테이블 명을 table_list라는 리스트에 담고 a,b,c,d 순서대로 정렬해서 담아내기
import cx_Oracle import pandas as pd dsn = cx_Oracle.makedsn( 'localhost' , 1521, 'xe') db = cx_Oracle.connect('c##scott','tiger', dsn) cursor = db.cursor() #나의 오라클 디비에 있는 테이블명 리스트를 CURSOR라는 메모리에 올린것이다! cursor.execute(""" select table_name from dba_tables where owner in ('C##SCOTT', 'HR', 'SH', 'OE') and table_name not like 'DR%' """) #커서에 있는 데이터를 불러와서 row변수에 담아냄. row = cursor.fetchall() len(row) ---------------------------------아래 정답---------------------------------- table_list = [] for i in row: table_list.append(i[0]) table_list.sort() print(table_list)
아래는sorted
를 사용한 답 !