Sunteți pe pagina 1din 18

PYTHON

PYTHON 4 - ORACLE
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 193.226.34.57 cu
service_name oradb, nume utilizator ms_dba și parola oracle se inițializează conexiunea următoare:
• connection = cx_Oracle.connect("ms_dba", "oracle", "193.226.34.57/oradb")
• 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 SQL, Execută comanda SQL specificată împreună cu lista de parametrii. Ca rezultat,
parametri) î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 obicei în liste de
cursor.fetchmany(n) 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(), 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 ms_dbs.
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 date
Cursor T_CLIENTI_LEASING
Setul de date returnat de Oracle
Database T_CLIENTI_DAUNE
CX_ORACLE IN GOOGLE COLAB
1. Descarcati clientul de Oracle - Oracle Instant client basic lite RPM
https://download.oracle.com/otn_software/linux/instantclient/193000/oracle-instantclient19.3-basicl
ite-19.3.0.0.0-1.x86_64.rpm

2. Incarcati fisierul RPM in Google Drive


3. Mount Google Drive. Rulati urmatoarea comanda:
from google.colab import drive
drive.mount('/content/drive’)
4. Instalati pachetul cx_Oracle:
!pip install cx_Oracle
!apt install alien
!alien -i /content/drive/MyDrive/…./oracle-instantclient19.3-basiclite-19.3.0.0.0-1.x86_64.rpm
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)
EXEMPLUL 3 INTEROGARI CU PARAMETRU
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 executii succesive.
import cx_Oracle
from pprint import pprint
connection = cx_Oracle.connect("student_ps", "oracle", "37.120.250.20/oracle")
cursor = connection.cursor()
#pregatirea interogarii cu parametru
cursor.prepare("""SELECT marca, sum(valoare_dauna) Total_daune FROM t_clienti_daune
group by marca having sum(valoare_dauna)>:p_val""")
#prima executie
v_val = input("Introduceti valoarea: ")
cursor.execute(None, {'p_val': v_val})
lista_daune=cursor.fetchall()
#afisare lista marci cu daune
pprint (lista_daune)
#a doua executie
v_val = input("Introduceti valoarea: ")
cursor.execute(None, {'p_val': v_val})
lista_daune=cursor.fetchall()
#afisare lista marci cu daune
pprint (lista_daune)
#inchidere cursor si conexiune
cursor.close()
connection.close()
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 4 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()
E X E M P L U L 5 U P D AT E
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 6 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 7 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 8 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"]])
• Using Python with Oracle Database 11g,
https://www.oracle.com/technetwork/articles/dsl/python-
091105.html
SURSE • Developing a Python Web Application with Oracle Database 11g,
BIBLIOGRAFICE https://www.oracle.com/webfolder/technetwork/tutorials/obe/db/O
OW11/python_django/python_django.htm
• https://learncodeshare.net/2015/06/26/insert-crud-using-cx_oracle/

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