S2 - Python - Oracle
S2 - Python - Oracle
Pentru realizarea conexiunii este necesară instalarea clientului Oracle Client 12c
(https://www.oracle.com/database/technologies/instant-client/downloads.html). Versiunea de
Oracle Client trebuie să corespundă versiunii de Oracle Database (a se vedea lista de
compatibilități pe site-ul Oracle) dar și versiunii de Python instalată (32 sau 64 biți).
Instrucțiunile sunt detaliate aici:
https://cx-oracle.readthedocs.io/en/latest/user_guide/installation.html
Pentru gestiunea interogărilor sau a tranzacțiilor este necesară utilizarea unui cursor:
cursor = connection.cursor()
Obiectul de tip cursor dispune de toate metodele necesare gestiunii tranzacțiilor și procesării
interogărilor.
Metoda Explicații
cursor.execute(comand Execută comanda SQL specificată împreună cu lista de
a SQL, parametri) parametrii. Ca rezultat, în cazul SELECT cursorul este
încărcat cu înregistrările returnate
cursor.close() Închide cursorul și eliberează zona de memorie alocată
cursor.fetchone() Încarcă înregistrările din cursor în variabile locale Python
cursor.fetchmany(n) (de obicei în liste de tupluri)
cursor.fetchall()
cursor.prepare(comanda SQL) Transmite comanda SQL către cursor fără a o executa
cursor.rowcount Returnează numărul de înregistrări parcurse din cursor,
inițial este 0, iar pe măsură ce se utilizează comanda fetch(),
1
Seminar 2 – Prelucrarea datelor în Python. Connexiunea cu Oracle Database
numărul crește.
cursor.bindarraysize Precizează dimensiunea cursorului, utilizată în special la
comanda INSERT
cursor.setinputsizes() Precizează tipurile de date ale parametrilor, utilizată în
special la comanda INSERT
Lista completă a metodelor acestuia este disponibilă aici:
https://cx-oracle.readthedocs.io/en/latest/
Realizarea interogărilor
Pentru exemplificare se utilizează tabelele T_CLIENTI_DAUNE și T_CLIENTI_LEASING
din schema utilizatorului STUDENT_PS.
Vă conectați în SQL Developer utilizând următoarele informații:
Connection Name: Seminar 2
Username: student_ps
Parola: oracle
Server
Host: 37.120.250.20
Port 1521
Service_name: oracle
După prelucrarea cursorului se recomandă închiderea sa, iar la final închiderea conexiunii cu
baza de date:
cursor.close()
connection.close()
Pentru prelucrarea unui cursor se pot utiliza listele de tupluri, înregistrările putând fi încărcate
cu ajutorul metodelor cursorului:
- fetchone() – încarcă o singură înregistrare;
- fetchmany(n) – încarcă n înregistrări;
- fetchall() - încarcă toate înregistrările din cursor.
2
Seminar 2 – Prelucrarea datelor în Python. Connexiunea cu Oracle Database
Interogări cu parametrii
Parametrii se pot specifica direct în
cadrul metodei execute() sub forma
cursor.execute(comanda SQL, parametri). În cadrul interogării, parametrii se specifica
sub forma :param.
Exemplul 2. Să se returneze valoarea totală a daunelor înregistrate pentru o anumită marcă
auto introdusă de utilizator de la tastatură.
import cx_Oracle
from pprint import pprint
Exemplul 3. Să se returneze valoarea totală a daunelor pe fiecare marcă auto, dacă această
valoare este mai mare decât o anumită valoare prag. De la tastatură se va introduce
valoarea prag pentru 2 apeluri succesive.
import cx_Oracle
from pprint import pprint
3
Seminar 2 – Prelucrarea datelor în Python. Connexiunea cu Oracle Database
#primul apel
v_val = input("Introduceti valoarea: ")
cursor.execute(None, {'p_val': v_val})
lista_daune=cursor.fetchall()
#afisare lista marci cu daune
pprint (lista_daune)
Gestiunea tranzacțiilor
Operațiile DML (INSERT, UPDATE și DELETE) sunt realizate tot prin intermediul unui
cursor cu ajutorul metodei execute() sub forma cursor.execute(comanda SQL
INSERT/UPDATE/DELETE, parametri).
În cazul INSERT, se pot transmite mai multe înregistrări prin metoda executemany(). În acest
caz se recomandă să se precizeze numărul de înregistrări prin proprietatea bindarraysize și
tipul parametrilor prin metoda setinputsizes.
Tranzacțiile se pot finaliza sau anula prin precizarea opțiunilor COMMIT sau ROLLBACK
ale conexiunii: connection.commit() sau connection.rollback()
Exemplul 4. Să se adauge o listă de tupluri în tabela CLIENTI_NOI care are următoarea
structură: id_client number, nume_client varchar2(150), profesia varchar2(150), sex
varchar2(3), varsta number, stare_civila varchar2(1),suma_solicitata number.
cursor = connection.cursor()
#adaugarea listei de clienti noi in tabela
4
Seminar 2 – Prelucrarea datelor în Python. Connexiunea cu Oracle Database
cursor.bindarraysize = 3
cursor.setinputsizes(int, 150, 150, 3, int, 1, float)
cursor.executemany("insert into clienti_noi(id_client, nume_client, profesia,
sex, varsta, stare_civila,suma_solicitata) values (:1, :2, :3, :4, :5, :6, :7)",
lista_clienti_noi)
cursor.close()
#finalizarea tranzactiei
connection.commit()
cursor = connection.cursor()
#precizarea instructiunii update cu parametru
statement="update clienti_noi set suma_solicitata=suma_solicitata*1.10 where
lower(nume_client) like :p_nume"
#finalizarea tranzactiei
connection.commit()
5
Seminar 2 – Prelucrarea datelor în Python. Connexiunea cu Oracle Database
cursor = connection.cursor()
#stergerea clientilor cu numele Popa
statement="delete from clienti_noi where nume_client like 'Popa%'"
cursor.execute(statement)
cursor.close()
#finalizarea tranzactiei
connection.commit()
connection.close()
Exemplul 7.
1. În SQL Developer selectați clientul cu numele ‘Hosu%’ din tabela CLIENTI_NOI.
Observați valoarea solicitată.
2. În Python, deschideți conexiunea cu baza de date și vizualizați informațiile referitoare la
clientul cu numele ‘Hosu%’.
import cx_Oracle
from pprint import pprint
# Realizarea conexiunii cu serverul Oracle
#Conexiunea - user student_ps, parola oracle, host 37.120.250.20, service_name
oracle
connection = cx_Oracle.connect("student_ps", "oracle", "37.120.250.20/oracle")
5. Închideți conexiunea:
connection.close()
6. În SQL Developer rulați din nou interogarea pentru vizualizarea clientului cu numele
‘Hosu%’ . Observați că valoarea sumei este nemodificată, chiar dacă ultima interogare din
Python a afișat valoarea actualizată. În concluzie, instrucțiunile DML nu sunt finalizate
6
Seminar 2 – Prelucrarea datelor în Python. Connexiunea cu Oracle Database
Exemplul 8:
1.Deschideți conexiunea cu baza de date Oracle și adăugați un nou client în tabela
CLIENTI_NOI, introducând id-ul de la tastatură:
import cx_Oracle
from pprint import pprint
4. Folosind o interogare SQL vizualizați printr-o listă datele referitoare la clientul nou
introdus:
#interogarea bazei de date pentru vizualizarea inregistrarilor noi adaugate
cursor3 = connection.cursor()
cursor3.execute("""SELECT * from clienti_noi where id_client =:p_id""",
p_id=v_id)
lista_clienti=cursor3.fetchall()
pprint(lista_clienti)
cursor3.close()
connection.close()
7
Seminar 2 – Prelucrarea datelor în Python. Connexiunea cu Oracle Database
import cx_Oracle
from pprint import pprint
# Realizarea conexiunii cu serverul Oracle
#Conexiunea - user student_ps, parola oracle, host 37.120.250.20, service_name
oracle
connection = cx_Oracle.connect("student_ps", "oracle", "37.120.250.20/oracle")
8
Seminar 2 – Prelucrarea datelor în Python. Connexiunea cu Oracle Database
begin
return p_suma_solicitata/ (p_venit_anual_ron-abs(p_val_credite_ron)
+p_suma_depozit);
end f_grad_indatorare;
9
Seminar 2 – Prelucrarea datelor în Python. Connexiunea cu Oracle Database
# Connect to oracle.
connection = cx_Oracle.connect("student_ps", "oracle", "37.120.250.20/oracle")
connection.close()
Exemplul 12. În exemplul de mai sus să se adauge o nouă coloană în df pentru a calcula
ponderea manoperei din valoarea totală a daunei. Să se afișeze marca și componentele
înlocuite în cazul în care ponderea manoperei depășește 30% din valoarea daunei.
import pandas as pd
import cx_Oracle
from pprint import pprint
# Connect to oracle.
connection = cx_Oracle.connect("student_ps", "oracle", "37.120.250.20/oracle")
10
Seminar 2 – Prelucrarea datelor în Python. Connexiunea cu Oracle Database
where an_fabricatie>:an"""
df = pd.read_sql(query, con=connection, params={'an': an})
connection.close()
Varianta 1:
Rețineți într-o variabilă timpul curent (se va importa pachetul time).
Încărcați într-un df numele, venitul anual, valoarea creditelor, suma din depozite și suma
solicitată pentru clienții cu venitul anual mai mare decât 150000.
În df adăugați o nouă coloană pentru a calcula gradul de îndatorare.
Afișați setul de date din df.
Calculați timpul de execuție
#varianta 1
start = time.time()
#incarcam in DataFrame inregistrarile returnate de SELECT
venit=150000
query ="""select nume_client, suma_solicitata,venit_anual_ron, val_credite_ron,
suma_depozit, varsta from t_clienti_leasing
where venit_anual>:venit"""
df = pd.read_sql(query, con=connection, params={'venit': venit})
df["GRAD_INDATORARE"]=round(df["SUMA_SOLICITATA"]/ (df["VENIT_ANUAL_RON"]-
abs(df["VAL_CREDITE_RON"])+df["SUMA_DEPOZIT"]),2)
pprint(df)
timp_executie = (time.time() - start)
print (timp_executie, " seconds")
Varianta 2:
Rețineți într-o variabilă timpul curent
Încărcați într-un df numele, venitul anual, valoarea creditelor, suma din depozite, suma
solicitată și gradul de îndatorare calculat cu funcția PL/SQL f_grad_indatorare pentru
clienții cu venitul anual mai mare decât 150000.
Afișați setul de date din df.
Calculați timpul de execuție.
#varianta 2
start = time.time()
#incarcam in DataFrame inregistrarile returnate de SELECT
venit=150000
query ="""select nume_client, suma_solicitata, venit_anual_ron, val_credite_ron,
suma_depozit, varsta, round(f_grad_indatorare (venit_anual_ron ,
val_credite_ron , suma_depozit , suma_solicitata),2) grad_indatorare from
t_clienti_leasing
where venit_anual>:venit"""
11
Seminar 2 – Prelucrarea datelor în Python. Connexiunea cu Oracle Database
Închideți conexiunea.
connection.close()
Varianta 2 se execută mai repede dacă funcția PL/SQL este deja încărcată în SGA (System
Global Area - memoria internă a SGBD). Încărcarea funcției în SGA se realizează automat
la primul apel al acesteia.
Varianta 1:
Rețineți într-o variabilă timpul curent
Încărcăm într-un df numele, vârsta, profesia, venitul anual, suma solicitată și prescoringul
din tabela T_CLIENTI_LEASING..
Folosind metoda loc din pandas afișați numele, suma solicitată și prescoringul doar pentru
clienții cu vârsta < 40 ani, au venitul anual > 10000 și profesia Inginer sau Profesor.
Calculați timpul de execuție.
#varianta 1
start = time.time()
#incarcam in DataFrame inregistrarile returnate de SELECT
Varianta 2:
Rețineți într-o variabilă timpul curent
Folosind clauza WHERE din instrucțiunea SELECT încărcăm într-un df numele, vârsta,
profesia, venitul anual, suma solicitată și prescoringul doar pentru clienții cu vârsta < 40
ani, au venitul anual > 10000 și profesia Inginer sau Profesor.
Folosind metoda loc din pandas afișați numele, suma solicitată și prescoringul pentru setul
de date.
Calculați timpul de execuție.
#varianta 2
start = time.time()
#incarcam in DataFrame inregistrarile returnate de SELECT
query ="""select nume_client, varsta , profesia, venit_anual_ron,
suma_solicitata, prescoring from t_clienti_leasing
where varsta<40 and venit_anual_ron>10000 and profesia in ('Inginer',
'Profesor')"""
df = pd.read_sql(query, con=connection)
12
Seminar 2 – Prelucrarea datelor în Python. Connexiunea cu Oracle Database
Închideți conexiunea:
connection.close()
Pentru a reduce timpul de execuție, se recomandă limitarea setului de date adus din baza de
date prin utilizarea instrucțiunilor specifice SQL.
Exerciții propuse:
1. Să se returneze într-un df componenta, anul de fabricatie și pretul manoperei pentru
autoturismele Ford și Jeep. Pe setul din df, majorați cu 10% pretul manoperei pentru
autoturismele fabricate inainte de 2010 și care au componenta BATTERY defectă.
Salvați modificările într-un fișier .csv.
2. Încărcați într-un df marca, modelul, valoarea medie și numărul de daune pe fiecare
model și marcă. Afișați numărul de autoturisme pentru care valoarea medie depășește
400 lei. Reprezentați grafic modelele care au înregistrat mai mult de 200 de daune.
3. Încărcați într-un df numele, suma solicitată, suma din depozite și fidelitatea clienților
cu vârsta > 30 de ani care au solicitat un credit mai mare de 10.000 lei. Verificați în df
dacă suma din depozit este mai mare decât suma solicitată și pentru acești clienți
modificați fidelitatea în 5 (doar în df).
4. Încărcați într-un df profesia, venitul anual, suma din depozite și suma solicitată pe
fiecare profesie. În df adăugați o nouă coloană pentru a calcula gradul de îndatorare
pe fiecare profesie (suma_solicitata/(venit_anual+suma_depozit)*100).
5. Încărcați într-un df starea civilă, profesia și suma totală solicitată grupată în funcție de
aceste atribute. Introduceți de la tastatură profesia și pentru aceasta reprezentați grafic
suma solicitată în funcție de starea civilă.
13
Seminar 2 – Prelucrarea datelor în Python. Connexiunea cu Oracle Database
Referințe
1 Using Python with Oracle Database 11g
- https://www.oracle.com/technetwork/articles/dsl/python-091105.html
2 Developing a Python Web Application with Oracle Database 11g
https://www.oracle.com/webfolder/technetwork/tutorials/obe/db/OOW11/
python_django/python_django.htm
3 https://learncodeshare.net/2015/06/26/insert-crud-using-cx_oracle/
4 https://cx-oracle.readthedocs.io/en/latest/user_guide/sql_execution.html
14