Grundsätzlich wird, wie in Teil 3 erläutert, nach dem Aufrufen der Methode execute () des Cursor-Objekts eine Schleife gegen das Cursor-Objekt ausgeführt. Sie können Datensätze mit abrufen.
sample03b.py(Auszug)
with cx_Oracle.connect(USERID, PASSWORD, DESTINATION) as connection:
with connection.cursor() as cursor:
for row in cursor.execute(SQL):
print(row)
Andererseits ist auch das Abrufen mit der folgenden Methode möglich, die auf PEP 249 (Python Database API Specification v2.0) basiert.
fetchone()
Wie Sie sich aus dem Namen vorstellen können, ist es eine Methode, die nur eine Zeile abruft. Anstatt Zeile für Zeile in einer Schleife abzurufen, wie im folgenden Beispiel
select 1+1 from dual
Für SELECT-Anweisungen, von denen bekannt ist, dass sie nur eine Zeile zurückgeben, z. B. oder für unten beschriebene scrollbare Cursor.
sample04a.py(Auszug)
with cx_Oracle.connect(USERID, PASSWORD, DESTINATION) as connection:
with connection.cursor() as cursor:
cursor.execute(SQL)
while True:
row = cursor.fetchone()
if row is None:
break
print(row)
fetchall() Im Gegensatz zu fetchone () ruft diese Methode alle Zeilen gleichzeitig ab.
sample04b.py(Auszug)
with cx_Oracle.connect(USERID, PASSWORD, DESTINATION) as connection:
with connection.cursor() as cursor:
cursor.execute(SQL)
rows = cursor.fetchall()
for row in rows:
print(row)
fetchmany() Eine Methode, die die Anzahl der im Argument zwischen fetchone () und fetchall () angegebenen Zeilen abruft. Im folgenden Beispiel werden 3 Elemente abgerufen.
sample04c.py(Auszug)
with cx_Oracle.connect(USERID, PASSWORD, DESTINATION) as connection:
with connection.cursor() as cursor:
cursor.execute(SQL)
while True:
rows = cursor.fetchmany(3)
if not rows:
break
for row in rows:
print(row)
Wenn Sie eine Abrufmethode ausgeben, wird die Anzahl der Abrufe, die Sie abrufen möchten, nicht jedes Mal abgerufen, wenn Sie die einzelnen Methoden ausführen. Die Anzahl der in der Variablen arraysize des Cursor-Objekts angegebenen Elemente (Standard ist 100) wird in den Oracle-Client-Puffer eingelesen, und cx_Oracle wird basierend auf diesem Puffer abgerufen. Dies ist eine Maßnahme zur Reduzierung der Anzahl der Roundtrips zur Datenbank und ein Mechanismus, der in vielen Zugriffstreibern der Oracle-Datenbank bereitgestellt wird und nicht auf cx_Oracle beschränkt ist. Wenn Sie einfach denken, scheint es die höchste Rate zu sein, die mit fetchall () abgerufen werden kann, indem die Arraysize angegeben wird, mit der die geplante Anzahl von Abrufen gleichzeitig abgerufen werden kann. In der Realität ist jedoch selten die Anzahl der Akquisitionen bekannt. Darüber hinaus muss die Arraysize auf einen Wert festgelegt werden, der diese berücksichtigt, da sie Einschränkungen wie der Verarbeitungsleistung und dem SQL-Gewicht der Serverseite, der Menge an CPU-Auslastung und Speicher, die von der Anwendung verwendet werden können, und der Netzwerkbandbreite unterliegt. .. Das Folgende ist ein Beispiel für die Ausgabe von SQL mit der Arraysize 1000. Ich versuche, mit fetchmany () dieselbe Nummer wie Arraysize abzurufen.
sample04d.py(Auszug)
with cx_Oracle.connect(USERID, PASSWORD, DESTINATION) as connection:
with connection.cursor() as cursor:
cursor.arraysize = 1000
cursor.execute(SQL)
while True:
rows = cursor.fetchmany(cursor.arraysize)
if not rows:
break
for row in rows:
print(row)
Normalerweise geht das Abrufen nur rückwärts. Auf der anderen Seite implementiert cx_Oracle einen scrollbaren Cursor, mit dem jeder Datensatz, einschließlich der Vorderseite, seine aktuelle Position ändern kann. Um einen scrollbaren Cursor zu verwenden, muss das scrollbare Argument beim Erstellen des Cursor-Objekts auf True gesetzt werden. Verwenden Sie die scroll () -Methode, um den Cursor zu scrollen. Diese Methode hat ein Argument namens value und ein Argument namens mode. Die Bedeutung des Wertarguments ändert sich abhängig von dem im Argument mode angegebenen Wert. Unten finden Sie eine Liste der Aktionen, die basierend auf dem Argument mode ausgeführt werden können.
Der Wert des Modusarguments | Bedeutung und Bewegung des Wertarguments |
---|---|
first | Scrollen Sie zur ersten Zeile. Das Wertargument wird ignoriert. |
last | Scrollen Sie zur letzten Zeile. Das Wertargument wird ignoriert. |
absolute | Verschiebt sich zu der im Werteargument angegebenen Anzahl von Zeilen. |
relative | Der Standardwert für das Modusargument. Verschiebt die Anzahl der im Wertargument angegebenen Zeilen. Geben Sie einen negativen Wert an, der zurückgegeben werden soll. |
Unten ist ein Beispiel. Beachten Sie, dass scrollbare Cursor eine höhere Last als normale Cursor haben. Verwenden Sie sie daher nur, wenn dies erforderlich ist.
sample04e.py
import cx_Oracle
USERID = "admin"
PASSWORD = "FooBar"
DESTINATION = "atp1_low"
SQL = """
select object_id - 1, owner, object_name, object_type
from all_objects
order by object_id
fetch first 10 rows only
"""
with cx_Oracle.connect(USERID, PASSWORD, DESTINATION) as connection:
with connection.cursor(scrollable=True) as cursor:
cursor.execute(SQL)
print("********Alle 10 Zeilen anzeigen********")
for row in cursor:
print(row)
print("********Erste Zeile anzeigen(Wertargument wird ignoriert) ********")
cursor.scroll(8, "first")
print(cursor.fetchone())
print("********Letzte Zeile anzeigen********")
cursor.scroll(mode="last")
print(cursor.fetchone())
print("********3. Zeile anzeigen********")
cursor.scroll(3, "absolute")
print(cursor.fetchone())
print("********Nach 4 Zeilen anzeigen********")
cursor.scroll(4)
print(cursor.fetchone())
print("********2 Zeilen vorher anzeigen********")
cursor.scroll(-2, "relative")
print(cursor.fetchone())
$ python sample04e.py
********Alle 10 Zeilen anzeigen********
(1, 'SYS', 'C_OBJ#', 'CLUSTER')
(2, 'SYS', 'I_OBJ#', 'INDEX')
(3, 'SYS', 'TAB$', 'TABLE')
(4, 'SYS', 'CLU$', 'TABLE')
(5, 'SYS', 'C_TS#', 'CLUSTER')
(6, 'SYS', 'I_TS#', 'INDEX')
(7, 'SYS', 'C_FILE#_BLOCK#', 'CLUSTER')
(8, 'SYS', 'I_FILE#_BLOCK#', 'INDEX')
(9, 'SYS', 'C_USER#', 'CLUSTER')
(10, 'SYS', 'I_USER#', 'INDEX')
********Erste Zeile anzeigen(Wertargument wird ignoriert) ********
(1, 'SYS', 'C_OBJ#', 'CLUSTER')
********Letzte Zeile anzeigen********
(10, 'SYS', 'I_USER#', 'INDEX')
********3. Zeile anzeigen********
(3, 'SYS', 'TAB$', 'TABLE')
********Nach 4 Zeilen anzeigen********
(7, 'SYS', 'C_FILE#_BLOCK#', 'CLUSTER')
********2 Zeilen vorher anzeigen********
(5, 'SYS', 'C_TS#', 'CLUSTER')
Recommended Posts