100% au considerat acest document util (1 vot)
152 vizualizări21 pagini

Curs 3 - Python Oracle

Încărcat de

Mihai
Drepturi de autor
© © All Rights Reserved
Respectăm cu strictețe drepturile privind conținutul. Dacă suspectați că acesta este conținutul dumneavoastră, reclamați-l aici.
Formate disponibile
Descărcați ca PPTX, PDF, TXT sau citiți online pe Scribd
100% au considerat acest document util (1 vot)
152 vizualizări21 pagini

Curs 3 - Python Oracle

Încărcat de

Mihai
Drepturi de autor
© © All Rights Reserved
Respectăm cu strictețe drepturile privind conținutul. Dacă suspectați că acesta este conținutul dumneavoastră, reclamați-l aici.
Formate disponibile
Descărcați ca PPTX, PDF, TXT sau citiți online pe Scribd
Sunteți pe pagina 1/ 21

PYTHON

- ORACLE
CURS
CONECTAREA LA BAZE DE DATE ORACLE – PACHETUL
CX_ORACLE

• Pachetul cx_Oracle conține metode pentru realizarea unei conexiuni cu o bază de date
Oracle, pentru gestiunea interogărilor și a tranzacțiilor (comenzile
SELECT/INSERT/UPDATE/DELETE/MERGE și COMMIT/ROLLBACK).
• Lista completă a metodelor pachetului cx_Oracle este disponibilă aici:
https://cx-oracle.readthedocs.io/en/latest/user_guide/introduction.html
• Pentru realizarea conexiunii cu o bază de date Oracle este necesar clientul
pentru Oracle Database (Oracle Instant Client), iar in cadrul conexiunii se precizează:
- userul, parola, serverul (host/ip) și denumirea bazei de date (service name/SID).

De exemplu, pentru realizarea conexiunii cu serverul oracle care rulează pe IP-ul


37.120.250.20 cu service_name oracle, nume utilizator student_ps și parola oracle se
inițializează conexiunea următoare:
• connection = cx_Oracle.connect("student_ps", "oracle", "37.120.250.20/oracle")
• Pentru gestiunea interogărilor sau a
tranzacțiilor este necesară utilizarea unui
cursor:
cursor = connection.cursor()
CURSORUL • Variabila de tip cursor dispune de toate
metodele necesare gestiunii tranzacțiilor și
procesării interogărilor.
METODE ALE CURSORULUI
Metoda Explicații
cursor.execute(comanda Execută comanda SQL specificată împreună cu lista de
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 (de
cursor.fetchmany(n) obicei în liste de tupluri);
cursor.fetchall()
cursor.prepare(comanda Transmite comanda SQL către cursor fără a o executa;
SQL)
cursor.rowcount Returnează numărul de înregistrări parcurse din cursor, inițial
este 0, iar pe măsură ce se utilizează comanda fetch(),
numărul crește.
cursor.bindarraysize Precizează dimensiunea cursorului, utilizată în special la
comanda INSERT;
cursor.setinputsizes() Precizează tipul de date, utilizată în special la comanda INSERT.
REALIZAREA INTEROGĂRILOR

• Instrucțiunile SELECT sunt executate în cadrul cursorului astfel:


cursor.execute("""SELECT * FROM t_clienti_leasing""")
• Cursorul este încărcat cu tuplurile returnate de interogare, parcurgerea sa
se poate realiza în cadrul unui for:
for rec in cursor:
print("Values:", rec)
• După prelucrarea cursorului se recomandă închiderea sa, iar la final
închiderea conexiunii cu baza de date:
cursor.close()
connection.close()

Pentru exemplificare se utilizează tabelele T_CLIENTI_DAUNE și


T_CLIENTI_LEASING din schema utilizatorului STUDENT_PS.
REALIZAREA INTEROGĂRILOR

Python

connection = cx_Oracle.connect("student_ps",
"oracle", "37.120.250.20/oracle")
cursor = connection.cursor()
cursor.execute("""SELECT nume_client, profesia,
venit_anual FROM T_CLIENTI_LEASING""")
lista_clienti=cursor.fetchall()
cursor.close() Oracle Database
connection.close() 1. Autentificare utilizator
2. Execuție comandă
SQL
3. Returnare set activ de
Cursor T_CLIENTI_LEASING
date
Setul de date returnat de
Oracle Database T_CLIENTI_DAUNE
METODELE FETCH, INTEROGARI CU PARAMETRI

• Pentru prelucrarea unui cursor se pot utiliza listele de tupluri, înregistrările putând fi
încărcate cu ajutorul metodelor cursorului (exemplul1):
fetchone() – încarcă o singură înregistrare;
fetchmany(n) – încarcă n înregistrări;
fetchall() – încarcă toate înregistrările din cursor.
• Interogări cu parametri:
- Parametrii se pot specifica direct în cadrul metodei execute() (a se vedea exemplul
2);
- O altă variantă presupune utilizarea metodei prepare() pentru realizarea interogării
cu parametru (a se vedea exemplul 3).
EXEMPLUL 1 INTEROGARI
Să se returneze numele, profesia, venitul anual și suma solicitată în cazul clienților care au solicitat mai mult de
5000 lei credit.
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")
cursor = connection.cursor()
cursor.execute("""SELECT nume_client, profesia, venit_anual FROM
t_clienti_leasing WHERE suma_solicitata>5000""")
lista_clienti=cursor.fetchall()
# Inchidere cursor si conexiune
cursor.close()
connection.close()
# Afisare lista clienti
pprint (lista_clienti)
EXEMPLUL 2 INTEROGARI CU PARAMETRU
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

# 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")
cursor = connection.cursor()
v_marca = input("Introduceti marca: ");
cursor.execute("""SELECT marca, sum(valoare_dauna) Total_daune FROM
t_clienti_daune where lower(marca) like :p_marca group by marca""",
p_marca='%'+v_marca.lower()+'%')
lista_daune=cursor.fetchall()
#inchidere cursor si conexiune
cursor.close()
connection.close()
#afisare lista marci cu daune
pprint (lista_daune)
CONTROLUL TRANZACTIILOR

• Operațiile de INSERT, UPDATE și DELETE sunt realizate tot prin


intermediul unui cursor cu ajutorul metodei execute().
• Î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()
• Se poate seta modul de gestiune a tranzacțiilor prin metoda
connection.autocommit=True
EXEMPLUL 3 INSERT
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. Să se finalizeze tranzacția și apoi să se returneze înregistrările
noi adăugate. Modificați secvența de cod și anulați tranzacția.
import cx_Oracle
from pprint import pprint
connection = cx_Oracle.connect("student_ps", "oracle", "37.120.250.20/oracle")
lista_clienti_noi = [(100, "Popa Marcel", "Inginer", "m", 34, "C", 230),
(101, "Popa Vasilica", "Coafeza", "f", 32, "C", 200),
(102, "Popa Ion", "Instalator", "m", 64, "C", 120)]
cursor = connection.cursor()
#adaugarea listei de clienti noi in tabela
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()
#interogarea bazei de date pentru vizualizarea inregistrarilor noi adaugate
cursor2 = connection.cursor()
cursor2.execute("""SELECT * from clienti_noi where nume_client like 'Popa%'""")
lista_clienti=cursor2.fetchall()
pprint(lista_clienti)
cursor2.close()
connection.close()
EXEMPLUL 4 UPDATE
Să se majoreze cu 10% suma solicitată de clienții al căror nume este introdus de utilizator
de la tastatură. Actualizările se vor realiza pe tabela CLIENTI_NOI. Să se finalizeze/anuleze
tranzacția și să se re-deschidă un cursor pentru verificarea rezultatelor tranzacției.
import cx_Oracle
from pprint import pprint
connection = cx_Oracle.connect("student_ps", "oracle", "37.120.250.20/oracle"
cursor = connection.cursor()
#adaugarea listei de clienti noi in tabela
statement="update clienti_noi set suma_solicitata=suma_solicitata*1.10 where
lower(nume_client) like :p_nume"
v_nume=input("Introduceti numele clientului:")
cursor.execute(statement,p_nume='%'+v_nume.lower()+'%')
cursor.close()
#finalizarea tranzactiei
connection.commit()
#interogarea bazei de date pentru vizualizarea inregistrarilor noi adaugate
cursor2 = connection.cursor()
cursor2.execute("""SELECT * from clienti_noi where lower(nume_client) like :p_nume""",
p_nume='%'+v_nume.lower()+'%')
lista_clienti=cursor2.fetchall()
pprint(lista_clienti)
cursor2.close()
connection.close()
EXEMPLUL 7 DELETE
Să se șteargă din tabela CLIENTI_NOI clienții cu numele de familie Popa. Să se finalizeze
tranzacția.
import cx_Oracle

# 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")

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 8 INCARCARE IN PANDAS
• Înregistrările returnate de o interogare SQL se pot încărca direct într-un DataFrame Pandas prin metoda
pandas.read_sql(comanda SQL, conexiunea, lista de parametri).
• În acest caz nu mai este necesară încărcarea înregistrărilor în cursor, acestea fiind gestionate automat
de către DataFrame.
Să se selecteze din tabela T_CLIENTI_DAUNE marca, modelul, anul de fabricație, componenta, prețul
manoperei și valoarea daunei pentru autoturismele mai noi de 2010.
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")
#incarcam in DataFrame inregistrarile returnate de SELECT
an=2010
query ="""Select marca, model, an_fabricatie, componenta, pret_manopera,
valoare_dauna
from t_clienti_daune
where an_fabricatie>:an"""
df = pd.read_sql(query, con=connection, params={'an': an})
pprint(df)
connection.close()
EXEMPLUL 9 PRELUCRARE IN PANDAS
Pornind de la exemplul anterior, î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 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")
#incarcam in DataFrame inregistrarile returnate de SELECT
an=2010
query ="""Select marca, model, an_fabricatie, componenta, pret_manopera,
valoare_dauna
from t_clienti_daune
where an_fabricatie>:an"""
df = pd.read_sql(query, con=connection, params={'an': an})
connection.close()

df["PROCENT"]=df["VALOARE_DAUNA"]/df["PRET_MANOPERA"]
pprint(df.loc[(df["PROCENT"]>30), ["MARCA","COMPONENTA"]])
EXERCIȚII PROPUSE (I)
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.
EXERCIȚII PROPUSE (II)
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.
EXERCIȚII PROPUSE (III)
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).
EXERCIȚII PROPUSE (IV)
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).
EXERCIȚII PROPUSE (V)
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 afișati înregistrările returnate.
• Using Python with Oracle Database 11g,
https://www.oracle.com/technetwork/articles/dsl/pyth
on-091105.html
• Developing a Python Web Application with Oracle
SURSE Database 11g,
BIBLIOGRAFICE https://www.oracle.com/webfolder/technetwork/tutor
ials/obe/db/OOW11/python_django/python_django.ht
m
• https://learncodeshare.net/2015/06/26/insert-crud-
using-cx_oracle/

S-ar putea să vă placă și