[Python]2023.08.09

망ꡬ씨·2023λ…„ 8μ›” 9일
0

Python

λͺ©λ‘ 보기
6/7
post-thumbnail

μ „μ—­λ³€μˆ˜μ™€ μ§€μ—­λ³€μˆ˜

πŸ’‘ λ³€μˆ˜λŠ” μžμ‹ μ΄ μƒμ„±λœ λ²”μœ„(μ½”λ“œλΈ”λŸ­)μ•ˆμ—μ„œλ§Œ μœ νš¨ν•˜λ‹€.
ν•¨μˆ˜ μ•ˆμ—μ„œ λ§Œλ“  λ³€μˆ˜λŠ” ν•¨μˆ˜ μ•ˆμ—μ„œ μ‚΄μ•„μžˆλ‹€κ°€ ν•¨μˆ˜ μ½”λ“œμ˜ 싀행이 μ’…λ£Œλ˜λ©΄ 생λͺ…을 λ‹€ν•œλ‹€. 이것을 μ§€μ—­λ³€μˆ˜ 라고 ν•©λ‹ˆλ‹€.

μ΄μ™€λŠ” λ°˜λŒ€λ‘œ ν•¨μˆ˜ μ™ΈλΆ€μ—μ„œ λ§Œλ“  λ³€μˆ˜λŠ” ν”„λ‘œκ·Έλž¨μ΄ μ‚΄μ•„μžˆλŠ” λ™μ•ˆμ— ν•¨κ»˜ μ‚΄μ•„μžˆλ‹€κ°€ ν”„λ‘œκ·Έλž¨μ΄ μ’…λ£Œλ˜λ©΄ 같이 μ†Œλ©Έν•©λ‹ˆλ‹€. μ΄λ ‡κ²Œ ν”„λ‘œκ·Έλž¨ 전체λ₯Ό μœ νš¨λ²”μœ„λ‘œ κ°€μ§€λŠ” λ³€μˆ˜λ₯Ό μ „μ—­λ³€μˆ˜λΌκ³  ν•©λ‹ˆλ‹€.

λ¬Έλ²•μ˜ˆμ œ1.

def StarBucks():
  mug_cup = 'Americano' # μ§€μ—­λ³€μˆ˜
  return mug_cup
  
print(StarBucks())  
print(mug_cup) # β˜… μ΄λ ‡κ²Œ λ¨Έκ·Έμ»΅(μ§€μ—­λ³€μˆ˜)λ₯Ό ν•¨μˆ˜ λ°–μœΌλ‘œ κ°€μ Έμ˜€λ©΄ μ—λŸ¬κ°€ λ‚œλ‹€. 

λ¬Έλ²•μ˜ˆμ œ2. μ „μ—­λ³€μˆ˜

tumbler = 'water' # λ§Œμ•½ λΉ„μ–΄μžˆλŠ” μƒνƒœλ‘œ 두고싢닀면 None을 ν• λ‹Ή. noneν• λ•ŒλŠ” μΏΌν…Œμ΄μ…˜λ§ˆν¬ x

def StarBucks():
    global tumbler # μ „μ—­λ³€μˆ˜λ₯Ό ν•¨μˆ˜ λ‚΄μ—μ„œ μ‚¬μš©ν•˜λ €λ©΄ global을 λΆ™μ—¬μ€€λ‹€.
    tumbler = 'Americano' 
    return tumbler

print(StarBucks())  # Americano
print(tumbler)      # Americano

블루보틀에 κ°€λ³΄μž

tumbler = 'water' 

def StarBucks():
    global tumbler 
    tumbler = 'Americano' 
    return tumbler

def BlueBottle():
    global tumbler
    tumbler = 'Cappuccino'
    return tumbler

print (StarBucks())   # Americano
print (BlueBottle())  # Cappuccino
print (tumbler)       # Cappuccino

πŸ€” μ§€μ—­λ³€μˆ˜λŠ” ν•¨μˆ˜λ‚΄μ—μ„œ μ‚¬μš©ν•˜λŠ” λ³€μˆ˜λΌμ„œ ν•„μš”ν•œλ°, μ „μ—­λ³€μˆ˜λ₯Ό μ‚¬μš©ν•΄μ•Όν•˜λŠ” μ§„μ§œμ΄μœ κ°€ λ¬΄μ—‡μΌκΉŒ ?

πŸ’‘ λ³€μˆ˜μ— λ‹΄κΈ΄ 값이 ν•¨μˆ˜λ§ˆλ‹€ κ³΅ν†΅μ μœΌλ‘œ μ‚¬μš©λ˜μ–΄μ•Ό ν•˜λŠ” κ²½μš°μ— μœ μš©ν•˜λ‹€.

ex) μ›μ˜ 넓이λ₯Ό κ³„μ‚°ν•˜λŠ” λ‹€μ–‘ν•œ ν•¨μˆ˜λ“€μ΄ μžˆλ‹€λ©΄ κ·Έ ν•¨μˆ˜λ“€μ΄ μ „λΆ€ λ™μΌν•œ μ›μ£Όμœ¨μ„ μ‚¬μš©ν•΄μ•Ό ν•œλ‹€. 

문제 96. μ›μ˜ 넓이λ₯Ό κ΅¬ν•˜λŠ” ν•¨μˆ˜λ₯Ό μƒμ„±ν•˜μ‹œμ˜€

def cycle_function(num1):
    pi = 3.14
    return pi * num1 * num1 # 원 넓이 곡식 : 3.14 * λ°˜μ§€λ¦„ * λ°˜μ§€λ¦„
    
print(cycle_function(5))    # 78.5

문제 97. λΆ€μ±„κΌ΄μ˜ 넓이λ₯Ό κ΅¬ν•˜λŠ” ν•¨μˆ˜λ₯Ό μƒμ„±ν•˜μ‹œμ˜€

def cycle_function2(num1):
    pi = 3.14159 # μ—¬κΈ° μ΄λ ‡κ²Œ 일관성 μ—†μœΌλ©΄ 결과값이 달라진닀.
    return 1/4 * pi * num1 * num1 
    
print(cycle_function2(5))  # 19.6349375    

βœ… μ›μ˜ 넓이λ₯Ό κ΅¬ν• λ•ŒλŠ” piκ°€ 3.14μ˜€κ³  λΆ€μ±„κΌ΄μ˜ 넓이λ₯Ό ꡬ할 λ•ŒλŠ” piκ°€ 3.1459λ©΄ 결과적으둜 같은 ν”„λ‘œκ·Έλž¨ λ‚΄μ—μ„œ λ™μΌν•œ piλ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šμ€ κ²°κ³Όκ°€ λ©λ‹ˆλ‹€.

문제 98. μœ„ λ‘κ°œμ˜ ν•¨μˆ˜κ°€ 같은 piλ₯Ό μ‚¬μš©ν•  수 μžˆλ„λ‘ μ „μ—­λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜μ‹œμ˜€

pi = 3.14
def cycle_function(num1):
    global pi
    return pi * num1 * num1 
    
def cycle_function2(num1):   
    global pi
    return 1/4 * pi * num1 * num1
    
print(cycle_function(5))
print(cycle_function2(5))

βœ… μœ„μ™€κ°™μ΄ pi값이 μ–΄λŠ ν•¨μˆ˜μ—μ„œ 쓰이든 λ™μΌν•œ pi값을 μ‚¬μš©ν•˜λ €λ©΄, μ „μ—­λ³€μˆ˜λ‘œ λ§Œλ“€μ–΄μ„œ ν•¨μˆ˜λ‚΄μ—μ„œ global둜 ν˜ΈμΆœν•˜μ—¬ μ‚¬μš©!

μ΄λ¦„μ—†λŠ” ν•œμ€„μ§œλ¦¬ ν•¨μˆ˜ lambda μ‚¬μš©λ²•

<문법>


def my_abs(x):
    if x < 0 :
        return x * -1
    else :
        return x
print (my_abs(-7))

μœ„ my_abs ν•¨μˆ˜λ₯Ό lambdaμ‹μœΌλ‘œ λ³€κ²½

my_abs2 = lambda x : x * -1 if x < 0 else x
        # lambda μž…λ ₯λ³€μˆ˜ : 좜λ ₯을 μœ„ν•œ μ‹€ν–‰λ¬Έ
print(my_abs2(-7))


# 1. μ›λž˜ ifλ¬Έ                    vs            # ν•œμ€„μ§œλ¦¬ ifλ¬Έ
# if x < 0:                                    # x * -1 if x < 0 else x
#     return x * -1
# else :
#     return x

문제 99. μ•„λž˜μ˜ ν•¨μˆ˜λ₯Ό lambdaμ‹μœΌλ‘œ κ΅¬ν˜„ν•˜μ‹œμ˜€

def add_func(a,b) :
 return a + b
print (add_func(3,5)) 
 
# lambdaμ‹μœΌλ‘œ
add_func = lambda a,b : a + b
print (add_func(3,5)) 

문제 100. db μžλ™ν™” ν•¨μˆ˜μ— 4λ²ˆμ½”λ“œμ˜ 버그λ₯Ό μˆ˜μ •ν•˜μ‹œμ˜€!

# 1. 였라클 연동 ν•¨μˆ˜

def   oracle_table(table_name):
    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()   
    
    query = f"SELECT * FROM {table_name}"
    
    cursor.execute(query )  

    row = cursor.fetchall()   

    colnames = cursor.description

    col = [ ] 
    for  i   in   colnames:
        col.append( i[0].lower()  )

    df = pd.DataFrame(row , columns = col )
    return ( df )

#2. dba μžλ™ν™” 슀크립트

def  easy_dba():

    while   True:
        print( """ ===  dba μž‘μ—…μ„ νŽΈν•˜κ²Œ μˆ˜ν–‰ν•˜κΈ° μœ„ν•œ 슀크립트 총λͺ¨μŒ ====

            0.   ν”„λ‘œκ·Έλž¨μ„ μ’…λ£Œν•˜λ €λ©΄ 0λ²ˆμ„ λˆ„λ₯΄μ„Έμš”.
            1.   ν…Œμ΄λΈ” 슀페이슀  μ‚¬μš©λŸ‰μ„ ν™•μΈν•˜λ €λ©΄ 1λ²ˆμ„ λˆ„λ₯΄μ„Έμš”
            2.  ν˜„μž¬ λ°μ΄ν„°λ² μ΄μŠ€ 락(lock) λ°œμƒν–ˆλŠ”μ§€ ν™•μΈν•˜λ €λ©΄ 2λ²ˆμ„ λˆ„λ₯΄μ„Έμš”
            3.  μ˜€λΌν΄μ™€ μ—°λ™ν•˜κ²Œ μ‹ΆμœΌλ©΄ 3λ²ˆμ„ λˆ„λ₯΄μ„Έμš”
            4.  alert 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    
         

            q = """  select  col1, count(*)
                            from  df
                            group by  col1
                            order by 2 desc;   """

            print(sqldf(q) )
            break

πŸ“– 8μž₯ μ˜ˆμ™Έμ²˜λ¦¬

개발자의 λ°©μ–΄κΈ°μ œ μ˜ˆμ™Έμ²˜λ¦¬λž€?

πŸ’‘ μ˜ˆμ™Έμ²˜λ¦¬λž€ 이름 κ·ΈλŒ€λ‘œ μ˜ˆμ™Έμ‚¬ν•­μœΌλ‘œ μ²˜λ¦¬ν•˜κ² λ‹€! λΌλŠ” 것. 파이썬 μ½”λ“œμ— λ¬Έμ œκ°€ μžˆμ–΄μ„œ λ‚˜λŠ” 였λ₯˜κ°€ μ•„λ‹ˆκ³  μž…λ ₯λ˜λŠ” 데이터가 잘λͺ»λ˜μ–΄ λ‚˜λŠ” 였λ₯˜μ— λŒ€ν•œ μ˜ˆμ™Έμ²˜λ¦¬μ΄λ‹€.

λ¬Έλ²•μ˜ˆμ œ1. λ‘κ°œμ˜ 숫자λ₯Ό 물어보고 λ‚˜λˆ„κΈ°λ₯Ό ν•˜λŠ” ν•¨μˆ˜λ₯Ό μƒμ„±ν•˜κΈ°

def my_devide():
    x = input('λΆ„μžμ˜ 숫자 μž…λ ₯')
    y = input('λΆ„λͺ¨μ˜ 숫자 μž…λ ₯')
    return int(x) / int(y)
    
print (my_devide())    

βœ… my_devide ν•¨μˆ˜λ₯Ό μ‹€ν–‰ν•  λ•Œ μ‚¬μš©μžκ°€ 숫자λ₯Ό λ„£μ§€ μ•Šκ³  λ¬Έμžμ—΄μΈ 'a'λ₯Ό λ„£μœΌλ©΄ μ—λŸ¬κ°€ λ‚œλ‹€. 이럴 λ•Œ μ˜ˆμ™Έμ²˜λ¦¬λ₯Ό 해야함.

λ¬Έλ²•μ˜ˆμ œ2. 잘λͺ»λœ 값을 μž…λ ₯ν–ˆμ„ λ•Œ μ˜ˆμ™Έμ²˜λ¦¬ ν•˜λŠ”μ½”λ“œ (try ~ except)

try:

   μ‹€ν–‰ 될 μ£Όμš” μ½”λ“œ
 
except:
 
   try와 exceptμ‚¬μ΄μ˜ μ½”λ“œμ— λ¬Έμ œκ°€ 생겼을 λ•Œ 싀행될 μ½”λ“œ

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

def my_devide():
    try:
        x = input('λΆ„μžμ˜ 숫자 μž…λ ₯')
        y = input('λΆ„λͺ¨μ˜ 숫자 μž…λ ₯')
        return int(x) / int(y)
    except:
        return '잘λͺ»λœ 값을 μž…λ ₯ν•΄μ„œ λ‚˜λˆ„κΈ°λ₯Ό ν•  수 μ—†μ–΄μš”'
print (my_devide())  

문제 101. λ‹€μŒμ˜ gegop() ν•¨μˆ˜λ₯Ό λ§Œλ“€κ³  μ‹€ν–‰ν•˜μ„Έμš”

def gegop() :
    num = int(input('숫자λ₯Ό μž…λ ₯ν•˜μ„Έμš”'))
    return num ** 2
    
print(gegop())    

문제 102. μœ„ μ˜ˆμ™Έμ²˜λ¦¬

def gegop() :
    try:
        num = int(input('숫자λ₯Ό μž…λ ₯ν•˜μ„Έμš”'))
        return num ** 2
    except:
        return '잘λͺ»λœ 값을 μž…λ ₯ν–ˆμŠ΅λ‹ˆλ‹€.'
    
print(gegop())   

try ~ except ~ else

<문법>

def gegop() :
    try:
        num = int(input('숫자λ₯Ό μž…λ ₯ν•˜μ„Έμš”'))
        print( num ** 2 )
    except:
        print( '잘λͺ»λœ 값을 μž…λ ₯ν–ˆμŠ΅λ‹ˆλ‹€.' ) 
    else:
        print( '계산에 μ„±κ³΅ν–ˆμŠ΅λ‹ˆλ‹€.' )
-------------------------------------------------------------------  
gegop() 


βœ… return은 ν•˜λ‚˜λ‚˜μ˜€κ³  λλ‚΄λ²„λ €μ„œ print둜 λ°”κΏ”μ€Œ!

문제 103. my_devide() ν•¨μˆ˜λ₯Ό μˆ˜μ •ν•΄μ„œ λ‹€μŒκ³Όκ°™μ΄ 계산이 μ„±κ³΅ν–ˆμŠ΅λ‹ˆλ‹€ λΌλŠ” λ©”μ„Έμ§€κ°€ 좜λ ₯되게 ν•˜κ³ , 잘λͺ»λœ 값을 μž…λ ₯λ°›μœΌλ©΄ 잘λͺ»λœ 값을 μž…λ ₯ν–ˆλ‹€λŠ” λ©”μ„Έμ§€ 좜λ ₯되게 ν•˜κΈ°

def my_devide():
    try:
        x = input('λΆ„μžμ˜ 숫자 μž…λ ₯')
        y = input('λΆ„λͺ¨μ˜ 숫자 μž…λ ₯')
        print (int(x) / int(y))
    except:
        print ('잘λͺ»λœ 값을 μž…λ ₯ν•΄μ„œ λ‚˜λˆ„κΈ°λ₯Ό ν•  수 μ—†μ–΄μš”')
    else:
        print ('계산 μ™„λ£Œ!')

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

my_devide()

λ¬Έμ œκ°€ 생기기전에 문제λ₯Ό λ§Œλ“€μ§€ μ•ŠκΈ°! (raise Exception)

μ•žμ—μ„œλŠ” 데이터 였λ₯˜λ‘œ 인해 ν”„λ‘œκ·Έλž¨μ΄ μ’…λ£Œλ˜μ§€ μ•Šλ„λ‘ μ˜ˆμ™Έμ²˜λ¦¬λ₯Ό ν–ˆλ‹€. 그런데 μ˜ˆμ™Έμ²˜λ¦¬κ°€ κΌ­ ν”„λ‘œκ·Έλž¨μ„ μ’…λ£Œμ‹œν‚€μ§€ μ•ŠκΈ°μœ„ν•΄μ„œλ§Œ μ‚¬μš©ν•˜λŠ”κ²ƒμ€ μ•„λ‹ˆλ‹€. ν”„λ‘œκ·Έλž¨μ„ μΌλΆ€λŸ¬ μ’…λ£Œμ‹œμΌœλ²„λ¦¬κΈ° μœ„ν•΄μ„œλ„ μ‚¬μš©ν•œλ‹€.

<문법> ν”„λ‘œκ΅¬λž¨μ΄ μ’…λ£Œλ˜κΈ° 전에 μœ μ„œλ₯Ό 남기고 μ’…λ£Œλ˜κ²Œν•˜λŠ” μ˜ˆμ™Έμ²˜λ¦¬ μ½”λ“œ

def my_devide():
        x = input('λΆ„μžμ˜ 숫자 μž…λ ₯')
        y = input('λΆ„λͺ¨μ˜ 숫자 μž…λ ₯')
        if y == '0':
            raise Exception ('λΆ„λͺ¨μ— 0을 μž…λ ₯ν•˜λ©΄ λ‚˜λˆ„κΈ°λ₯Ό ν•  수 μ—†μ–΄μš”.')
        else:
            print (int(x) / int(y))
            print ('μ„±κ³΅μ μœΌλ‘œ 계산이 μ™„λ£Œλ˜μ—ˆμŠ΅λ‹ˆλ‹€.')

였라클 dbμ—μ„œ λ§Œλ“  ν”„λ‘œμ‹œμ €

<문법>
1. μ‚¬μ›λ²ˆν˜Έλ₯Ό μž…λ ₯ν•˜κ³  ν”„λ‘œμ‹œμ €λ₯Ό μˆ˜ν–‰ν•˜λ©΄ ν•΄λ‹Ή μ‚¬μ›μ˜ 월급이 좜λ ₯λ˜λŠ” ν”„λ‘œμ‹œμ €λ₯Ό μƒμ„±ν•˜μ‹œμ˜€

create or replace procedure find_sal
( p_empno   in     number,
  p_sal     out    number  )
is
begin 
 select sal into p_sal
    from emp
    where empno = p_empno;
end;
/

SQL> variable  v_result  number;
SQL>
SQL> exec  find_sal( 7788, :v_result );

PL/SQL μ²˜λ¦¬κ°€ μ •μƒμ μœΌλ‘œ μ™„λ£Œλ˜μ—ˆμŠ΅λ‹ˆλ‹€.

SQL> print  v_result

  V_RESULT
----------
      3000
 
  1. oracleμ—μ„œ λ§Œλ“  find_salν”„λ‘œμ‹œμ €λ₯Ό νŒŒμ΄μ¬μ—μ„œ ν˜ΈμΆœν•΄μ„œ μ‚¬μš©
import  cx_Oracle  # 였라클과 νŒŒμ΄μ¬μ„ μ—°λ™ν•˜κΈ° μœ„ν•œ λͺ¨λ“ˆ
dsn = cx_Oracle.makedsn( 'localhost' , 1521, 'xe') 
db = cx_Oracle.connect('c##scott','tiger', dsn)
cursor  = db.cursor()

v_result = cursor.var(cx_Oracle.STRING)
cursor.callproc('find_sal',(7788,v_result))
             # ν”„λ‘œμ‹œμ €μ΄λ¦„ / v_result에 값이 담길것이닀 !
             
result = v_result.getvalue()
print(result)

문제 104. μ‚¬μ›λ²ˆν˜Έλ₯Ό μž…λ ₯ν•˜λ©΄ ν•΄λ‹Ή μ‚¬μ›μ˜ 직업이 좜λ ₯λ˜λŠ” ν”„λ‘œμ‹œμ €λ₯Ό find_jobμ΄λΌλŠ” μ΄λ¦„μœΌλ‘œ μƒμ„±ν•˜κΈ°

create   or   replace   procedure   find_job
(   p_empno    in     number,
    p_job     out     emp.job%type  )
is
begin 
 select   job   into   p_job
    from   emp
    where    empno = p_empno;
end;
/

SQL> variable  v_result  varchar2(20);
SQL>
SQL> exec  find_job( 7788, :v_result );
SQL> print  v_result

문제 105. 파이썬으둜

import  cx_Oracle  # 였라클과 νŒŒμ΄μ¬μ„ μ—°λ™ν•˜κΈ° μœ„ν•œ λͺ¨λ“ˆ
dsn = cx_Oracle.makedsn( 'localhost' , 1521, 'xe') 
db = cx_Oracle.connect('c##scott','tiger', dsn)
cursor  = db.cursor()

v_result = cursor.var(cx_Oracle.STRING)
cursor.callproc('find_job',(7788,v_result))
             # ν”„λ‘œμ‹œμ €μ΄λ¦„ / v_result에 값이 담길것이닀 !
             
result = v_result.getvalue()
print(result)

문제 106. μœ„ μ½”λ“œλ₯Ό ν•¨μˆ˜λ‘œ λ§Œλ“€μ–΄μ„œ λ‹€μŒκ³Ό 같이 μˆ˜ν–‰λ  수 있게 ν•˜κΈ°

oracle_find_job(7788)
def oracle_find_job(num):
    import  cx_Oracle  # 였라클과 νŒŒμ΄μ¬μ„ μ—°λ™ν•˜κΈ° μœ„ν•œ λͺ¨λ“ˆ
    dsn = cx_Oracle.makedsn( 'localhost' , 1521, 'xe') 
    db = cx_Oracle.connect('c##scott','tiger', dsn)
    cursor  = db.cursor()
    
    v_result = cursor.var(cx_Oracle.STRING)
    cursor.callproc('find_job',(num,v_result))
                 # ν”„λ‘œμ‹œμ €μ΄λ¦„ / v_result에 값이 담길것이닀 !
                 
    result = v_result.getvalue()
    print(result)  
    
oracle_find_job(7788) # ANALYST    

문제 107. μœ„ ν•¨μˆ˜λ₯Ό μˆ˜μ •ν•΄μ„œ μ—†λŠ” μ‚¬μ›λ²ˆν˜Έλ₯Ό λ„£κ³  μ‹€ν–‰ν•˜λ©΄ 'ν•΄λ‹Ή μ‚¬μ›λ²ˆν˜ΈλŠ” μ—†λŠ” μ‚¬μ›λ²ˆν˜Έμž…λ‹ˆλ‹€' 라고좜λ ₯ν•˜κΈ°
oracle_find_job(9999)
'ν•΄λ‹Ή μ‚¬μ›λ²ˆν˜ΈλŠ” μ—†λŠ” μ‚¬μ›λ²ˆν˜Έμž…λ‹ˆλ‹€'

def oracle_find_job(num):
    try:
        import  cx_Oracle  
        dsn = cx_Oracle.makedsn( 'localhost' , 1521, 'xe') 
        db = cx_Oracle.connect('c##scott','tiger', dsn)
        cursor  = db.cursor()

        v_result = cursor.var(cx_Oracle.STRING)
        cursor.callproc('find_job',(num,v_result))    

        result = v_result.getvalue()
        print(result)    
    except:
        print('μ—†λŠ” μ‚¬μ›λ²ˆν˜Έ μž…λ‹ˆλ‹€.') 
  
 --------------------------------------------------------------
 oracle_find_job(9999)

dbaμ—κ²Œ μœ μš©ν•œ ν”„λ‘œκ·Έλž¨ λ§Œλ“€κΈ° (lock waiting μ„Έμ…˜ λ°œκ²¬ν•˜κΈ°)

  1. λͺ…λ Ή ν”„λ‘¬ν”„νŠΈ 창을 2개 μ—΄κ³  각각 c##scottμœ μ €λ‘œ μ ‘μ†ν•˜μ—¬ lock이 λ°œμƒλ˜λŠ” 상황 μ—°μΆœν•˜κΈ°
  2. sql developer μ°½μ—μ„œ lock holder, lock waiter μ„Έμ…˜μ„ μ°ΎμœΌμ‹œμ˜€!
select decode(status,'INACTIVE',username || ' ' || sid || ',' || serial#,'lock') as Holder,
       decode(status,'ACTIVE',  username || ' ' || sid || ',' || serial#,'lock') as waiter, sid, serial#, status
    from( select level as le, NVL(s.username,'(oracle)') AS username,
    s.osuser,   
    s.sid,
    s.serial#,
    s.lockwait,
    s.module,
    s.machine,
    s.status,
    s.program,
    to_char(s.logon_TIME, 'DD-MON-YYYY HH24:MI:SS') as logon_time
       from v$session s
      where level>1
                or EXISTS( select 1
    from v$session
    where blocking_session = s.sid)
      CONNECT by PRIOR s.sid = s.blocking_session
  START WITH s.blocking_session is null);

βœ… μœ„ κ²°κ³Όμ—μ„œ statusκ°€ μ•‘ν‹°λΈŒλ‘œ λ‚˜μ˜€λŠ” μ„Έμ…˜μ΄ λ°”λ‘œ waitingν•˜κ³ μžˆλŠ” μ„Έμ…˜μž…λ‹ˆλ‹€.

  1. μœ„ SQL을 μˆ˜μ •ν•΄μ„œ λ‹€μŒκ³Ό 같이 κ²°κ³Όκ°€ 좜λ ₯λ˜κ²Œν•˜μ‹œμ˜€.
    좜λ ₯κ²°κ³Ό : 2
select  count(*)
  from( select level as le, NVL(s.username,'(oracle)') AS username,
    s.osuser,   
    s.sid,
    s.serial#,
    s.lockwait,
    s.module,
    s.machine,
    s.status,
    s.program,
    to_char(s.logon_TIME, 'DD-MON-YYYY HH24:MI:SS') as logon_time
       from v$session s
      where level>1
                or EXISTS( select 1
    from v$session
    where blocking_session = s.sid) 
      CONNECT by PRIOR s.sid = s.blocking_session
      START WITH s.blocking_session is null)
      where status = 'ACTIVE';

  1. μœ„μ˜ 쿼리의 κ²°κ³Όλ₯Ό 좜λ ₯ν•˜λŠ” ν”„λ‘œμ‹œμ €λ₯Ό μƒμ„±ν•˜μ‹œμ˜€ !
create or replace procedure lock_find
( p_cnt out number )
is 
  begin
     select  count(*) into p_cnt
       from (select level as le, NVL(s.username,'(oracle)') AS username,
            s.osuser,   
            s.sid,
            s.serial#,
            s.lockwait,
            s.module,
            s.machine,
            s.status,
            s.program,
            to_char(s.logon_TIME, 'DD-MON-YYYY HH24:MI:SS') as logon_time
               from v$session s
              where level>1
                        or EXISTS( select 1
            from v$session
            where blocking_session = s.sid) 
              CONNECT by PRIOR s.sid = s.blocking_session
              START WITH s.blocking_session is null)
              where status = 'ACTIVE';
end;
/


v$sessionλ₯Ό λͺ»λ³Έλ‹€.

alter system set 07_DICTIONARY_ACCESSIBILIY = true

μ΄λ ‡κ²Œ ν•΄λ΄€λŠ”λ°, μ§€μ •λœ μ΄ˆκΈ°ν™” λ§€κ°œλ³€μˆ˜λ₯Ό μˆ˜μ •ν•  수 μ—†λ‹€λŠ” μ—λŸ¬λ©”μ„Έμ§€κ°€ λ‚œλ‹€. DBλ‚΄λ Έλ‹€ μ˜¬λ €μ•Όν•¨ !!

// sysμœ μ €μ—μ„œ B내리기
alter system set 07_DICTIONARY_ACCESSIBILIY = true
scope = spfile;
-------------------------------------
shutdown immediate
// 올리기
startup

⭐ ν”„λ‘œμ‹œμ € 생성을 μœ„ν•œ 사전 μž‘μ—… μˆ˜ν–‰!
βœ”οΈ λ¨Όμ € sysμœ μ €λ‘œ μ ‘μ†ν•©λ‹ˆλ‹€.

connect / as sysdba

βœ”οΈ 였라클 μ„€μ • νŒŒλΌλ―Έν„° νŒŒμΌμ„ λ°±μ—… λ°›μŠ΅λ‹ˆλ‹€.

// λ‚΄ μœ„μΉ˜ν™•μΈ
show parameter spfile 
// 이 κ²½λ‘œμ— μžˆλŠ” νŒŒμΌμ„ 바탕화면에 볡사
C:\APP\ITWILL\PRODUCT\18.0.0\DBHOMEXE\DATABASE\SPFILEXE.ORA 

βœ”οΈ select any tableκΆŒν•œμ„ c##scottμœ μ €μ—κ²Œ λΆ€μ—¬ν•©λ‹ˆλ‹€.

// 데이터베이터에 μžˆλŠ” μ–΄λ–€ ν…Œμ΄λΈ”μ΄λ˜ λ‹€ 읽을 수 μžˆλŠ” κΆŒν•œμ„ μ€€λ‹€. 
grant select any table to c##scott;

βœ”οΈ O7_DICTIONARY_ACCESSIBILITYλ₯Ό true둜 λ³€κ²½ν•©λ‹ˆλ‹€. 이 νŒŒλΌλ―Έν„°λŠ” ν”„λ‘œμ‹œμ € μ•ˆμ—μ„œ v$sessionκ³Ό 같은 dbaν…Œμ΄λΈ”μ„ μ…€λ ‰νŠΈ ν•  수 있게 ν•΄μ£ΌλŠ” νŒŒλΌλ―Έν„° μž…λ‹ˆλ‹€.

show parameter o7
alter system set O7_DICTIONARY_ACCESSIBILITY=true
  scope=spfile;

// μ‹œμŠ€ν…œμ΄ λ³€κ²½λ˜μ—ˆμŠ΅λ‹ˆλ‹€.  

βœ”οΈ db λ‚΄λ Έλ‹€ μ˜¬λ¦½λ‹ˆλ‹€.

shutdown immediate // 내리기

startup // 올리기

βœ”οΈ c##scott μœ μ €λ‘œ μ ‘μ†ν•΄μ„œ μ•„λž˜μ˜ ν”„λ‘œμ‹œμ € μƒμ„±ν•˜κΈ°! (μœ„ μ½”λ“œμ™€ κ°™μŒ)

connect c##scott/tiger
create or replace procedure lock_find
( p_cnt out number )
is 
  begin
     select  count(*) into p_cnt
       from (select level as le, NVL(s.username,'(oracle)') AS username,
            s.osuser,   
            s.sid,
            s.serial#,
            s.lockwait,
            s.module,
            s.machine,
            s.status,
            s.program,
            to_char(s.logon_TIME, 'DD-MON-YYYY HH24:MI:SS') as logon_time
               from v$session s
              where level>1
                        or EXISTS( select 1
            from v$session
            where blocking_session = s.sid) 
              CONNECT by PRIOR s.sid = s.blocking_session
              START WITH s.blocking_session is null)
              where status = 'ACTIVE';
end;
/


βœ”οΈ ν”„λ‘œμ‹œμ €λ₯Ό μ‹€ν–‰ν•΄μ„œ 숫자 0이 좜λ ₯λ˜λŠ”μ§€ ν™•μΈν•˜μ‹œμ˜€ (μ§€κΈˆ lock된게 μ—†λŠ”μƒνƒœμž„)

SQL> variable v_result number;
SQL> exec lock_find(:v_result);

PL/SQL μ²˜λ¦¬κ°€ μ •μƒμ μœΌλ‘œ μ™„λ£Œλ˜μ—ˆμŠ΅λ‹ˆλ‹€.

SQL> print v_result

  V_RESULT
----------
         0

βœ”οΈ νŒŒμ΄μ¬μ—μ„œ lock_find ν”„λ‘œμ‹œμ € ν˜ΈμΆœν•˜κΈ°

import  cx_Oracle  # 였라클과 νŒŒμ΄μ¬μ„ μ—°λ™ν•˜κΈ° μœ„ν•œ λͺ¨λ“ˆ
dsn = cx_Oracle.makedsn( 'localhost' , 1521, 'xe') 
db = cx_Oracle.connect('c##scott','tiger', dsn)
cursor  = db.cursor()

v_result = cursor.var(cx_Oracle.STRING)
cursor.callproc('lock_find',[v_result]) # [v_result] μ΄λ ‡κ²Œ 리슀트둜 λ°”κΎΈλ‹ˆκΉŒ 됨      
           
result = v_result.getvalue()
print(result)  

문제 108. μœ„μ˜ μ½”λ“œλ₯Ό ν•¨μˆ˜λ‘œ μƒμ„±ν•˜κ³  μ‹€ν–‰ν•˜κΈ°! ν•¨μˆ˜μ΄λ¦„μ€ find_lock

def find_lock ():              
    import  cx_Oracle  # 였라클과 νŒŒμ΄μ¬μ„ μ—°λ™ν•˜κΈ° μœ„ν•œ λͺ¨λ“ˆ
    dsn = cx_Oracle.makedsn( 'localhost' , 1521, 'xe') 
    db = cx_Oracle.connect('c##scott','tiger', dsn)
    cursor  = db.cursor()

    v_result = cursor.var(cx_Oracle.STRING)
    cursor.callproc('lock_find',[v_result])            
           
    result = v_result.getvalue()
    print(result ,'개의 락 waiting μ„Έμ…˜μ΄ λ°œκ²¬λ˜μ—ˆμŠ΅λ‹ˆλ‹€.')      
-------------------------------------------------------------------------
find_lock ()        

문제 109. dba μžλ™ν™” 슀크립트 2λ²ˆμ— 이 ν•¨μˆ˜λ₯Ό μ‹€ν–‰ν•˜λŠ” μ½”λ“œλ₯Ό μΆ”κ°€ν•˜κ³  잘 λ˜λŠ”μ§€ 확인

# 1. 였라클 연동 ν•¨μˆ˜

def   oracle_table(table_name):
    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()   
    
    query = f"SELECT * FROM {table_name}"
    
    cursor.execute(query )  

    row = cursor.fetchall()   

    colnames = cursor.description

    col = [ ] 
    for  i   in   colnames:
        col.append( i[0].lower()  )

    df = pd.DataFrame(row , columns = col )
    return ( df )



#2. dba μžλ™ν™” 슀크립트


def  find_lock():
    import  cx_Oracle  # 였라클과 νŒŒμ΄μ¬μ„ μ—°λ™ν•˜κΈ° μœ„ν•œ λͺ¨λ“ˆ
    dsn = cx_Oracle.makedsn( 'localhost' , 1521, 'xe') 
    db = cx_Oracle.connect('c##scott','tiger', dsn)
    cursor  = db.cursor()

    v_result =  cursor.var( cx_Oracle.STRING )
    cursor.callproc( 'lock_find',  [v_result]   )

    result = v_result.getvalue()
    return  str(result) + '개의 락 waiting μ„Έμ…˜μ΄ λ°œκ²¬λ˜μ—ˆμŠ΅λ‹ˆλ‹€.'


def  easy_dba():

    while   True:
        print( """ ===  dba μž‘μ—…μ„ νŽΈν•˜κ²Œ μˆ˜ν–‰ν•˜κΈ° μœ„ν•œ 슀크립트 총λͺ¨μŒ ====

            0.  ν”„λ‘œκ·Έλž¨μ„ μ’…λ£Œν•˜λ €λ©΄ 0λ²ˆμ„ λˆ„λ₯΄μ„Έμš”.
            1.  ν…Œμ΄λΈ” 슀페이슀  μ‚¬μš©λŸ‰μ„ ν™•μΈν•˜λ €λ©΄ 1λ²ˆμ„ λˆ„λ₯΄μ„Έμš”
            2.  ν˜„μž¬ λ°μ΄ν„°λ² μ΄μŠ€ 락(lock) λ°œμƒν–ˆλŠ”μ§€ ν™•μΈν•˜λ €λ©΄ 2λ²ˆμ„ λˆ„λ₯΄μ„Έμš”
            3.  μ˜€λΌν΄μ™€ μ—°λ™ν•˜κ²Œ μ‹ΆμœΌλ©΄ 3λ²ˆμ„ λˆ„λ₯΄μ„Έμš”
            4.  alert log file 을 λΆ„μ„ν•˜κ³  μ‹Άλ‹€λ©΄ 4λ²ˆμ„ λˆ„λ₯΄μ„Έμš”

            """)

        num =  int( input('μ›ν•˜λŠ” 번호λ₯Ό μž…λ ₯ν•˜μ„Έμš” ~' )  )
        
        if num == 0:
            print('μ’…λ£Œλ˜μ—ˆμŠ΅λ‹ˆλ‹€.')
            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:
            message = find_lock()
            print(message) 
            break
            
        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    
         

            q = """  select  col1, count(*)
                            from  df
                            group by  col1
                            order by 2 desc;   """

            print(sqldf(q) )
            break

ν΄λž˜μŠ€κ°€ μ™œ ν•„μš”ν•œκ°€?

import dba_auto as a
a.easy_dba()

μœ„ dba_auto.py μ•ˆμ— μ•„λž˜μ™€κ°™μ΄ 3개의 ν•¨μˆ˜κ°€ μžˆλ‹€.
1. orcle_table
2. find_lock
3. easy_dba

이 ν•¨μˆ˜λ“€μ΄ μ„œλ‘œ 데이터λ₯Ό μ£Όκ³ λ°›λŠ” κ΄€κ³Œλ©΄ 이 ν•¨μˆ˜λ“€μ„ λ¬Άμ–΄μ„œ 클래슀둜 λ§Œλ“€μ–΄ κ΄€λ¦¬ν•΄μ•Όν•œλ‹€. 그런데 κ·Έλ ‡μ§€ μ•Šλ‹€λ©΄ 클래슀둜 λ§Œλ“€ ν•„μš”λŠ” μ—†λ‹€. (μœ„λŠ” 클래슀둜 λ§Œλ“€ ν•„μš”κ°€ μ—†λŠ” ν•¨μˆ˜λ“€!)

λ¬Έλ²•μ˜ˆμ œ1.
총 클래슀λ₯Ό μƒμ„±ν•˜κ² μŠ΅λ‹ˆλ‹€. 콩의 κΈ°λŠ₯은 ν•¨μˆ˜λ‘œ λ§Œλ“€λ©΄ 2κ°€μ§€κ°€ μžˆμŠ΅λ‹ˆλ‹€.
1. 총을 μ˜λŠ” κΈ°λŠ₯ (shoot)
2. μ΄μ•Œμ„ μΆ©μ „ν•˜λŠ” κΈ°λŠ₯ (charge)

1. μ΄μ•Œμ„ μΆ©μ „ν•˜λŠ” ν•¨μˆ˜ 생성

def charge(num):
    bullet = num
    print(bullet,'발이 μž₯μ „λ˜μ—ˆμŠ΅λ‹ˆλ‹€.')
    
charge(3)    

2. μ΄μ•Œμ„ μ˜λŠ” ν•¨μˆ˜ 생성

def shoot(num):
    for i in range (1,num+1):
        print('탕!')
shoot(3)        

3. μœ„μ—μ„œ λ§Œλ“  chargeν•¨μˆ˜, shootν•¨μˆ˜λ₯Ό 각각 μ‹€ν–‰ν•˜λŠ”λ° λ‹€μŒκ³Ό 같이 μ΄μ•Œμ„ 2발 μž₯μ „ν•˜κ³  μ΄μ•Œμ„ 3발 μ΄μ§€λŠ”μ§€ μ‹€ν–‰

charge(2)
shoot(3)


βœ… 2발 μž₯μ „ν–ˆλŠ”λ°, 3발이 쏴진닀. κ·Έλž˜μ„œ μž₯μ „ν•œ 만큼 μ΄μ•Œμ΄ μ΄μ§€κ²Œ ν•˜λ €λ©΄ class둜 이 ν•¨μˆ˜λ“€μ„ ꡬ성해주어야 ν•œλ‹€.

4. 클래슀둜 λ§Œλ“€μ–΄μ„œ μΆ©μ „ν•œ 만큼만 μ΄μ§€κ²Œ ν•˜μ‹œμ˜€

# 총 클래슀 생성
class Gun(): # class이름은 μΉ΄λ©œμΌ€μ΄μŠ€λ‘œ μ•žκΈ€μž λŒ€λ¬Έμž !
    def charge(self,num):
        self.bullet = num
        print(self.bullet, '발이 μž₯μ „λ˜μ—ˆμŠ΅λ‹ˆλ‹€.')
        
    def shoot(self,num):
        for i in range(1, num + 1):
            if self.bullet > 0: # μΆ©μ „ν•œ μ΄μ•Œμ΄ μžˆλ‹€λ©΄ 
                print('탕!')    # 탕탕!
                self.bullet = self.bullet -1 # μ΄μ•Œ ν•˜λ‚˜ 깎고
            elif  self.bullet == 0: # μ΄μ•Œμ΄ 0개면(λ‹€μΌμœΌλ©΄)
                print('μ΄μ•Œμ΄ μ—†μŠ΅λ‹ˆλ‹€!')
                break
                
# 총 클래슀(섀계도)λ₯Ό κ°€μ§€κ³  총(μ œν’ˆ)을 λ§Œλ“­λ‹ˆλ‹€. 
gun1 = Gun() # μ œν’ˆμ΄λ¦„ = 섀계도

# gun1 μ œν’ˆμ— μ΄μ•Œμ„ 10발 μΆ©μ „ν•©λ‹ˆλ‹€.
gun1.charge(10) # 10 발이 μž₯μ „λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

# gun1 총을 ν•œλ°œμ”© 쏴보기
gun1.shoot(1)


γ…‹γ…‹γ…‹γ…‹γ…‹γ…‹γ…‹γ…‹γ…‹γ…‹γ…‹
βœ… 클래슀둜 λ§Œλ“€μ–΄μ„œ 총을 μƒμ‚°ν•΄λ³΄λ‹ˆ μΆ©μ „ν•œ 만큼만 μ΄μ•Œμ„ 쏠 수 있게 λ˜μ—ˆλ‹€ !

5. Gun() 클래슀둜 λ‹€λ₯Έ μ œν’ˆλ„ λ§Œλ“€ 수 μžˆλ‹€. λ§Œλ“€μ–΄λ³΄κΈ°!

gun2 = Gun()
gun2.charge(5)


βœ… μ…€ν”„κ°€ ν•˜λŠ” μ—­ν• . μ΄λ ‡κ²Œ Gun() 클래슀둜 λ‹€λ₯Έ μ œν’ˆμ„ λ§Œλ“€μ—ˆμ„ λ•Œ λ‘κ°œκ°€ κ΅¬λΆ„λ˜λ„λ‘ ν•΄μ€€λ‹€. μ•„κΉŒ gun1은 μ΄μ•Œ 닀썼고 gun2에 좩전해놓은 μƒνƒœμ—μ„œ gun1둜 쏴보면 μ•„κΉŒμ²˜λŸΌ μ΄μ•Œμ΄ μ—†λ‹€κ³  λ‚˜μ˜¨λ‹€. 같은 클래슀둜 λ‘κ°œλ₯Ό λ§Œλ“€μ—ˆμ§€λ§Œ λ‘κ°œκ°€ λ‹€λ₯΄λ‹€.

문제 110. 고릴라 클래슀λ₯Ό λ‹€μŒκ³Ό 같이 μƒμ„±ν•˜μ‹œμ˜€! (클래슀λͺ… : Gorilla)
1. λ°”λ‚˜λ‚˜λ₯Ό λ¨ΉλŠ” κΈ°λŠ₯ (ν•¨μˆ˜λͺ… : eat)
2. μ†Œλ¦¬μ§€λ₯΄λŠ” κΈ°λŠ₯ (ν•¨μˆ˜λͺ… : shaut)

class Gorilla(): 
    def eat(self,num):
        self.bullet = num
        print('λ°”λ‚˜λ‚˜', self.bullet,'개λ₯Ό λ¨Ήμ—ˆμŠ΅λ‹ˆλ‹€.')
      
    def shaut(self,num):
        for i in range(1, num + 1):
            if self.bullet > 0: # μΆ©μ „ν•œ μ΄μ•Œμ΄ μžˆλ‹€λ©΄ 
                print('μš°μ™€~')    # 탕탕!
                self.bullet = self.bullet -1 # μ΄μ•Œ ν•˜λ‚˜ 깎고
            elif  self.bullet == 0: # μ΄μ•Œμ΄ 0개면(λ‹€μΌμœΌλ©΄)
                print('λ°”λ‚˜λ‚˜λ₯Ό λ‹€λ¨ΉμœΌλ©΄ μ†Œλ¦¬λ₯Ό μ§€λ₯Ό 수 μ—†μ–΄μš”!')
                break
               
#총 클래슀(섀계도)λ₯Ό κ°€μ§€κ³  총(μ œν’ˆ)을 λ§Œλ“­λ‹ˆλ‹€. 

gorilla1 = Gorilla() # μ œν’ˆμ΄λ¦„ = 섀계도

#gun1 μ œν’ˆμ— μ΄μ•Œμ„ 10발 μΆ©μ „ν•©λ‹ˆλ‹€.
gorilla1.eat(10) # 10 발이 μž₯μ „λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

#gun1 총을 ν•œλ°œμ”© 쏴보기
gorilla1.shaut(1)                

문제 110. (λ§ˆμ§€λ§‰ 문제)μ•„λž˜μ™€ 같이 ν…Œμ΄λΈ” 슀페이슀 이름과 ν…Œμ΄λΈ” 슀페이슀 μ‚¬μš©λŸ‰μ„ 좜λ ₯ν•˜λŠ” ν”„λ‘œμ‹œμ €λ₯Ό μƒμ„±ν•˜μ‹œμ˜€
exec ts_space;

set serveroutput on

create or replace procedure ts_space
is
      cursor ts_cursor is
        select  t.tablespace_name tablespaceName,
                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(+);
    begin
      for ts_recode in ts_cursor loop
          dbms_output.put_line(ts_recode.tablespaceName || chr(9) || ts_recode.usedspace);
        end loop;
    end;
    /
 
 exec ts_space;


βœ… 읡λͺ…λΈ”λŸ­μ΄ μ•„λ‹λ•ŒλŠ” declareλ₯Ό μ“°μ§€ μ•ŠλŠ”λ‹€ ! -> ν”„λ‘œμ‹œμ € λ§Œλ“€λ•ŒλŠ” μ•ˆμ“΄λ‹€.
βœ… for ts_recode in ts_cursor loop 둜 이미 선언이 λ˜μ—ˆλ‹€.
βœ… declareμ‚¬μš©ν•˜λŠ” λ•Œ!


πŸ’‘ 읡λͺ…블둝이 μ•„λ‹Œκ²ƒλ“€


πŸ’‘ 읡λͺ…λΈ”λ‘μ΄λž€?

읡λͺ… 블둝(Anonymous Block)은 λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ μ‹€ν–‰λ˜λŠ” PL/SQL μ½”λ“œ 덩어리λ₯Ό λ§ν•©λ‹ˆλ‹€. PL/SQL(Procedural Language/Structured Query Language)은 Oracle λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ μ‚¬μš©λ˜λŠ” ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄λ‘œ, SQL 문을 ν¬ν•¨ν•˜μ—¬ ν”„λ‘œκ·Έλž˜λ° λ‘œμ§μ„ μž‘μ„±ν•˜κ³  μ‹€ν–‰ν•  수 μžˆλŠ” κΈ°λŠ₯을 μ œκ³΅ν•©λ‹ˆλ‹€. 읡λͺ… 블둝은 이름 없이 μ‹€ν–‰λ˜λŠ” PL/SQL μ½”λ“œ 블둝을 μ˜λ―Έν•©λ‹ˆλ‹€.

읡λͺ… 블둝은 주둜 λ‹€μŒκ³Ό 같은 λͺ©μ μœΌλ‘œ μ‚¬μš©λ©λ‹ˆλ‹€:

μΌμ‹œμ μΈ μž‘μ—…: νŠΉμ • μž‘μ—…μ„ μˆ˜ν–‰ν•˜κΈ° μœ„ν•΄ μž„μ‹œλ‘œ PL/SQL μ½”λ“œλ₯Ό μ‹€ν–‰ν•΄μ•Ό ν•  λ•Œ 읡λͺ… 블둝을 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, 데이터 μ‘°μž‘, 처리, 계산 등을 μΌνšŒμ„±μœΌλ‘œ μˆ˜ν–‰ν•  λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€.

ν…ŒμŠ€νŠΈ: μ½”λ“œ 블둝을 μ‚¬μš©ν•˜μ—¬ μ–΄λ–€ μ½”λ“œκ°€ μ˜ˆμƒλŒ€λ‘œ λ™μž‘ν•˜λŠ”μ§€ ν…ŒμŠ€νŠΈν•  수 μžˆμŠ΅λ‹ˆλ‹€. SQL λ¬Έκ³Ό ν”„λ‘œκ·Έλž˜λ° λ‘œμ§μ„ ν…ŒμŠ€νŠΈν•˜κ³  디버깅할 λ•Œ μœ μš©ν•©λ‹ˆλ‹€.

슀크립트 μž‘μ„±: λ°μ΄ν„°λ² μ΄μŠ€ 객체λ₯Ό 생성, μˆ˜μ •, μ‚­μ œν•˜λŠ” 슀크립트λ₯Ό μž‘μ„±ν•  λ•Œ 읡λͺ… 블둝을 μ‚¬μš©ν•˜μ—¬ λ³΅μž‘ν•œ μž‘μ—…μ„ μˆ˜ν–‰ν•˜κ±°λ‚˜ 쑰건에 따라 μž‘μ—…μ„ λ‹€λ₯΄κ²Œ μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

읡λͺ… 블둝은 λ‹€μŒκ³Ό 같은 ν˜•νƒœλ‘œ μž‘μ„±λ©λ‹ˆλ‹€:

DECLARE
  -- λ³€μˆ˜λ‚˜ μƒμˆ˜ μ„ μ–Έ
BEGIN
  -- PL/SQL μ½”λ“œ μž‘μ„±
  -- SQL λ¬Έ μ‹€ν–‰
  -- λ³€μˆ˜ μ‚¬μš©
  -- μ˜ˆμ™Έ 처리 λ“±
END;
/

읡λͺ… 블둝은 DECLARE μ„Ήμ…˜κ³Ό BEGIN ~ END; 사이에 PL/SQL μ½”λ“œλ₯Ό μž‘μ„±ν•©λ‹ˆλ‹€. DECLARE μ„Ήμ…˜μ€ 선택적이며, λ³€μˆ˜λ‚˜ μƒμˆ˜λ₯Ό μ„ μ–Έν•  λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€. BEGINμ—μ„œλŠ” μ‹€μ œ PL/SQL μ½”λ“œλ₯Ό μž‘μ„±ν•˜κ³  SQL 문을 μ‹€ν–‰ν•˜λ©°, ν•„μš”ν•œ 경우 μ˜ˆμ™Έ 처리λ₯Ό ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λΈ”λ‘μ˜ λμ—λŠ” / κΈ°ν˜Έκ°€ μœ„μΉ˜ν•˜μ—¬ 싀행을 μ‹œμž‘ν•©λ‹ˆλ‹€.

읡λͺ… 블둝은 ν”„λ‘œμ‹œμ €λ‚˜ ν•¨μˆ˜μ™€ 달리 이름이 μ—†κΈ° λ•Œλ¬Έμ— λ‹¨μˆœν•œ μž‘μ—…μ„ μ²˜λ¦¬ν•˜κ±°λ‚˜ ν…ŒμŠ€νŠΈλ₯Ό μœ„ν•΄ κ°„λ‹¨ν•˜κ²Œ μ‚¬μš©ν•  수 μžˆλŠ” μž₯점이 μžˆμŠ΅λ‹ˆλ‹€.

profile
Slow and steady wins the race.

0개의 λŒ“κΈ€