Série: Introduction à cx_Oracle Contents
--Utilisation d'Oracle Cloud
Créez le tableau suivant.
SQL> create table sample16(col1 number, col2 blob);
Si les données font jusqu'à 1 Go, elles peuvent être traitées comme str pour le type CLOB et octet pour BLOB sans aucune considération particulière comme le type VARCHAR2 et le type RAW. S'il dépasse 1 Go, il doit être traité dans un format de traitement de flux qui traite un montant fixe à la fois. Les performances sont meilleures sans passer par un flux, mais même si une donnée est inférieure à 1 Go, fetchmany () consommera rapidement de la mémoire, donc les ressources mémoire et la quantité de données à récupérer (moyenne) En fonction de l'équilibre taille x nombre d'enregistrements), envisagez le traitement de flux même pour les LOB de petite taille.
Dans tous les cas, veuillez préparer les données (fichier) à traiter séparément. Si vous souhaitez exécuter l'exemple de source dans votre propre environnement, veuillez corriger soit le nom du fichier dans la source, soit le nom du fichier préparé. Vous trouverez ci-dessous un exemple de type INSERT to BLOB.
sample16a.py
import cx_Oracle
USERID = "admin"
PASSWORD = "FooBar"
DESTINATION = "atp1_low"
SQL = """
insert into sample16 values(1, :blobdata)
"""
with open('screenshot1.png', 'rb') as f:
image = f.read()
with cx_Oracle.connect(USERID, PASSWORD, DESTINATION) as connection:
with connection.cursor() as cursor:
cursor.execute(SQL, blobdata=image)
cursor.execute("commit")
Les références ne sont pas aussi faciles que la mise à jour, et vous devez définir le gestionnaire de type de sortie décrit dans 9th. L'exemple suivant fait référence à l'enregistrement enregistré précédemment et l'enregistre dans un fichier sous un nom différent.
sample16b.py
import cx_Oracle
def OutputTypeHandler(cursor, name, defaultType, size, precision, scale):
if defaultType == cx_Oracle.DB_TYPE_BLOB:
return cursor.var(cx_Oracle.DB_TYPE_LONG_RAW, arraysize=cursor.arraysize)
USERID = "admin"
PASSWORD = "FooBar"
DESTINATION = "atp1_low"
SQL = """
select col2 from sample16 where col1 = 1
"""
with cx_Oracle.connect(USERID, PASSWORD, DESTINATION) as connection:
connection.outputtypehandler = OutputTypeHandler
with connection.cursor() as cursor:
cursor.execute(SQL)
lobdata, = cursor.fetchone()
with open('screenshot2.png', 'wb') as f:
f.write(lobdata)
Bien entendu, le contenu des deux fichiers est le même.
$ cmp screenshot1.png screenshot2.png
$
Je vais expliquer basé sur BLOB. La procédure est à peu près la suivante.
sample16c.py
import cx_Oracle
USERID = "admin"
PASSWORD = "FooBar"
DESTINATION = "atp1_low"
SQL = """
insert into sample16 values(2, empty_blob())
returning col2 into :blobdata
""" # [1.]
with cx_Oracle.connect(USERID, PASSWORD, DESTINATION) as connection:
with connection.cursor() as cursor:
blobdata = cursor.var(cx_Oracle.DB_TYPE_BLOB) # [2.]
cursor.execute(SQL, [blobdata])
blob, = blobdata.getvalue()
offset = 1
bufsize = 65536 # [3.]
with open('screenshot1.png', 'rb') as f: # [4.]
while True:
data = f.read(bufsize)
if data:
blob.write(data, offset)
if len(data) < bufsize:
break
offset += bufsize
connection.commit()
En dessous, il correspond au numéro du commentaire.
Le déroulement de l'instruction UPDATE est le même, seule l'instruction SQL change. Mettez à jour la colonne LOB avec EMPTY_BLOB ().
Je vais expliquer basé sur BLOB. La procédure est à peu près la suivante. C'est plus facile que de mettre à jour.
sample16d.py
import cx_Oracle
USERID = "admin"
PASSWORD = "FooBar"
DESTINATION = "atp1_low"
SQL = """
select col2 from sample16 where col1 = 2
""" # [1.]
with cx_Oracle.connect(USERID, PASSWORD, DESTINATION) as connection:
with connection.cursor() as cursor:
cursor.execute(SQL)
blob, = cursor.fetchone()
offset = 1
bufsize = 65536 # [2.]
with open('screenshot3.png', 'wb') as f: # [3.]
while True:
data = blob.read(offset, bufsize)
if data:
f.write(data)
if len(data) < bufsize:
break
offset += bufsize
En dessous, il correspond au numéro du commentaire.
Recommended Posts