[PYTHON] [Introduction à cx_Oracle] (Partie 4) Récupération et défilement du jeu de résultats

Environnement de vérification

--Utilisation d'Oracle Cloud

Extraction de l'ensemble de résultats

Fondamentalement, comme expliqué dans Partie 3, après avoir appelé la méthode execute () de l'objet Cursor, en boucle contre l'objet Cursor. Vous pouvez récupérer des enregistrements avec.

sample03b.py(Extrait)


with cx_Oracle.connect(USERID, PASSWORD, DESTINATION) as connection:
        with connection.cursor() as cursor:
                for row in cursor.execute(SQL):
                        print(row)

D'autre part, la récupération par la méthode suivante basée sur PEP 249 (Python Database API Specification v2.0) est également possible.

fetchone() Comme vous pouvez l'imaginer d'après le nom, c'est une méthode qui ne récupère qu'une seule ligne. Plutôt que de récupérer ligne par ligne dans une boucle comme dans l'exemple ci-dessous select 1+1 from dual Pour les instructions SELECT connues pour ne renvoyer qu'une seule ligne, telles que, ou pour les curseurs à défilement décrits ci-dessous.

sample04a.py(Extrait)


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() Contrairement à fetchone (), cette méthode récupère toutes les lignes à la fois.

sample04b.py(Extrait)


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() Une méthode qui récupère le nombre de lignes spécifié dans l'argument entre fetchone () et fetchall (). Dans l'exemple ci-dessous, 3 éléments sont récupérés.

sample04c.py(Extrait)


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)

Ajustement de la taille des tableaux

Lorsque vous lancez une méthode d'extraction, le nombre d'exécutions que vous essayez d'obtenir n'est pas réellement récupéré à chaque fois que vous exécutez chaque méthode. Le nombre d'éléments spécifié dans la variable arraysize de l'objet Cursor (la valeur par défaut est 100) est lu dans la mémoire tampon du client Oracle et cx_Oracle est extrait en fonction de cette mémoire tampon. Il s'agit d'une mesure pour réduire le nombre d'allers-retours vers la base de données et est un mécanisme fourni dans de nombreux pilotes d'accès d'Oracle Database, non limité à cx_Oracle. Si vous pensez simplement, cela semble être le taux le plus élevé à récupérer par fetchall () en spécifiant la taille du tableau qui peut récupérer le nombre de récupérations prévu à la fois. Cependant, en réalité, il est rare que le nombre d'acquisitions soit connu. En outre, arraysize doit être défini sur une valeur qui prend en compte ces paramètres car il est soumis à des restrictions telles que la puissance de traitement et le poids SQL du côté serveur, la quantité d'utilisation du processeur et de mémoire pouvant être utilisée par l'application et la bande passante du réseau. .. Ce qui suit est un exemple lors de l'émission de SQL avec arraysize défini sur 1000. J'essaye de récupérer le même nombre que arraysize avec fetchmany ().

sample04d.py(Extrait)


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)

Ensemble de résultats de défilement

Normalement, la récupération ne va que vers l'arrière. D'autre part, cx_Oracle implémente un curseur à défilement qui permet à n'importe quel enregistrement, y compris le front, de changer sa position actuelle. Pour utiliser un curseur de défilement, l'argument de défilement doit être défini sur True lorsque l'objet Cursor est créé. Utilisez la méthode scroll () pour faire défiler le curseur. Cette méthode a un argument appelé valeur et un argument appelé mode. La signification de l'argument valeur change en fonction de la valeur spécifiée dans l'argument mode. Vous trouverez ci-dessous une liste de ce qui peut être fait en fonction de l'argument mode.

La valeur de l'argument mode Signification et mouvement de l'argument de la valeur
first Faites défiler jusqu'à la première ligne.
L'argument de valeur est ignoré.
last Faites défiler jusqu'à la dernière ligne.
L'argument de valeur est ignoré.
absolute Passe au nombre de lignes spécifié dans l'argument valeur.
relative La valeur par défaut de l'argument mode.
Déplace le nombre de lignes spécifié dans l'argument valeur.
Spécifiez une valeur négative à renvoyer.

Voici un exemple. Notez que les curseurs à défilement ont une charge plus élevée que les curseurs normaux, ne les utilisez donc que si nécessaire.

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("********Afficher les 10 lignes********")
                for row in cursor:
                        print(row)
                print("********Afficher la première ligne(l'argument de valeur est ignoré) ********")
                cursor.scroll(8, "first")
                print(cursor.fetchone())
                print("********Afficher la dernière ligne********")
                cursor.scroll(mode="last")
                print(cursor.fetchone())
                print("********Afficher la 3e ligne********")
                cursor.scroll(3, "absolute")
                print(cursor.fetchone())
                print("********Afficher après 4 lignes********")
                cursor.scroll(4)
                print(cursor.fetchone())
                print("********Afficher 2 lignes avant********")
                cursor.scroll(-2, "relative")
                print(cursor.fetchone())
$ python sample04e.py
********Afficher les 10 lignes********
(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')
********Afficher la première ligne(l'argument de valeur est ignoré) ********
(1, 'SYS', 'C_OBJ#', 'CLUSTER')
********Afficher la dernière ligne********
(10, 'SYS', 'I_USER#', 'INDEX')
********Afficher la 3e ligne********
(3, 'SYS', 'TAB$', 'TABLE')
********Afficher après 4 lignes********
(7, 'SYS', 'C_FILE#_BLOCK#', 'CLUSTER')
********Afficher 2 lignes avant********
(5, 'SYS', 'C_TS#', 'CLUSTER')

Recommended Posts

[Introduction à cx_Oracle] (Partie 4) Récupération et défilement du jeu de résultats
[Introduction à cx_Oracle] (Partie 2) Principes de base de la connexion et de la déconnexion à Oracle Database
[Cx_Oracle Primer] (Partie 3) Bases de la navigation dans les tableaux
[Introduction à cx_Oracle] (Partie 7) Gestion des variables de liaison
[Introduction à cx_Oracle] Présentation de cx_Oracle
[Introduction à cx_Oracle] (Partie 11) Bases de l'exécution PL / SQL
[Introduction à cx_Oracle] (Partie 6) Mappage des types de données DB et Python
[Introduction à cx_Oracle] (16ème) Gestion des types LOB
[Introduction à cx_Oracle] (5e) Gestion des données japonaises
[Introduction à cx_Oracle] (Partie 9) Mappage des types de données DB et Python (version 8 ou ultérieure)
[Introduction à cx_Oracle] (15e) Création d'un jeu de résultats dans un format autre que tapple
Introduction à PyQt4 Partie 1
[Introduction à cx_Oracle] (13e) Connexion utilisant le pool de connexions (côté client)
[Introduction à cx_Oracle] (10e) Instruction Update DML et DDL / DCL
[Introduction à Scipy] Calcul de la courbe de Lorenz et du coefficient de Gini ♬
[Introduction to Data Scientists] Bases de Python ♬ Fonctions et classes
Apprentissage automatique pour apprendre avec Nogisaka 46 et Keyakizaka 46 Partie 1 Introduction
Introduction de DataLiner ver.1.3 et comment utiliser Union Append
[Introduction à cx_Oracle] (8e) version de cx_Oracle 8.0
Introduction à Ansible Part «Inventaire»
Série: Introduction à cx_Oracle Contents
Introduction et astuces de mlflow.
Introduction à Ansible Part ④'Variable '
Résolution de l'introduction d'AOJ aux algorithmes et aux structures de données en Python -Partie1-
[Introduction à Python] J'ai comparé les conventions de nommage de C # et Python.
Résolution de l'introduction d'AOJ aux algorithmes et aux structures de données en Python -Partie2-
Résolution de l'introduction d'AOJ aux algorithmes et aux structures de données en Python -Partie4-
[Introduction à Udemy Python3 + Application] 69. Importation du chemin absolu et du chemin relatif
[Introduction à l'application Udemy Python3 +] 12. Indexation et découpage des chaînes de caractères
Introduction à TensorFlow - Résumé de quatre règles et fonctions mathématiques de base
Convertissez le résultat de python optparse en dict et utilisez-le
[Introduction au modèle SIR] Considérez le résultat de l'ajustement de Diamond Princess ♬
Résolution de l'introduction d'AOJ aux algorithmes et aux structures de données en Python -Partie3-
[Introduction to Data Scientists] Bases de Python ♬ Branchements conditionnels et boucles
[Introduction aux Data Scientists] Bases de Python ♬ Fonctions et fonctions anonymes, etc.
Introduction à Ansible Partie 2 'Grammaire de base'
[Introduction à Python3 Jour 1] Programmation et Python
Introduction et mise en œuvre de la fonction d'activation
Introduction à Python Hands On Partie 1
Introduction à Ansible Partie 1 Hello World !! '
Introduction et utilisation de la bouteille Python ・ Essayez de configurer un serveur Web simple avec une fonction de connexion
[Introduction aux data scientists] Bases de la probabilité et des statistiques ♬ Variable de probabilité / probabilité et distribution de probabilité
Introduction du cadre de cybersécurité "MITRE CALDERA": utilisation et formation
Introduction au Deep Learning ~ Pliage et mise en commun ~
Web-WF Python Tornado Partie 3 (Introduction à Openpyexcel)
[Introduction à cx_Oracle] (12e) Gestion des exceptions DB
[Introduction à cx_Oracle] (17e) Gestion du type de date
[Introduction à AWS] Conversion de texte-voix et lecture ♪
Introduction facile de la série python3 et d'OpenCV3
[Introduction à Udemy Python3 + Application] 29. Méthode Set
Introduction à Scapy ① (De l'installation à l'exécution de Scapy)
[Introduction au Data Scientist] Bases de Python ♬
Kaggle: Introduction à l'ingénierie manuelle des fonctionnalités, partie 1
[GKE] Définissez les réplicas de déploiement sur 0 et informez l'application Go du signal du système d'exploitation SIGTERM
Utilisez Pillow pour rendre l'image transparente et en superposer une partie seulement