Oracle
 sql >> Base de données >  >> RDS >> Oracle

Analyser le fichier SQL avec PL/SQL et DML/DDL en utilisant cx_Oracle en python

Il est possible d'exécuter plusieurs instructions en même temps, mais c'est semi-hacky. Vous devez envelopper vos instructions et les exécuter une par une.

>>> import cx_Oracle
>>>
>>> a = cx_Oracle.connect('schema/[email protected]')
>>> curs = a.cursor()
>>> SQL = (("""create table tmp_test ( a date )"""),
... ("""insert into tmp_test values ( sysdate )""")
... )
>>> for i in SQL:
...     print i
...
create table tmp_test ( a date )
insert into tmp_test values ( sysdate )
>>> for i in SQL:
...     curs.execute(i)
...
>>> a.commit()
>>>

Comme vous l'avez noté, cela ne résout pas le problème du point-virgule, pour lequel il n'y a pas de réponse facile. Comme je le vois, vous avez 3 options :

  1. Écrivez un analyseur trop compliqué, ce qui, à mon avis, n'est pas du tout une bonne option.

  2. N'exécutez pas de scripts SQL à partir de Python ; avoir le code dans des scripts SQL séparés pour que l'analyse soit facile, dans un fichier Python séparé, intégré dans votre code Python, dans une procédure de la base de données... etc. C'est probablement mon option préférée.

  3. Utiliser subprocess et appelez le script de cette façon. C'est l'option la plus simple et la plus rapide mais n'utilise pas cx_Oracle du tout.

    >>> import subprocess
    >>> cmdline = ['sqlplus','schema/[email protected]','@','tmp_test.sql']
    >>> subprocess.call(cmdline)
    
    SQL*Plus: Release 9.2.0.1.0 - Production on Fri Apr 13 09:40:41 2012
    
    Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.
    
    
    Connected to:
    Oracle Database 11g Release 11.2.0.1.0 - 64bit Production
    
    SQL>
    SQL> CREATE TABLE FOO(id number);
    
    Table created.
    
    SQL>
    SQL> BEGIN
      2    INSERT INTO FOO VALUES(1);
      3    INSERT INTO FOO VALUES(2);
      4    INSERT INTO FOO VALUES(3);
      5  END;
      6  /
    
    PL/SQL procedure successfully completed.
    
    SQL> CREATE TABLE BAR(id number);
    
    Table created.
    
    SQL>
    SQL> quit
    Disconnected from Oracle Database 11g Release 11.2.0.1.0 - 64bit Production
    0
    >>>