sql >> Base de Datos >  >> RDS >> Oracle

Analice el archivo SQL con PL/SQL y DML/DDL usando cx_Oracle en python

Es posible ejecutar varias declaraciones al mismo tiempo, pero es semi-hacky. Debe envolver sus declaraciones y ejecutarlas una a la vez.

>>> 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()
>>>

Como ha notado, esto no resuelve el problema del punto y coma, para el cual no hay una respuesta fácil. Como yo lo veo tienes 3 opciones:

  1. Escriba un analizador demasiado complicado, que no creo que sea una buena opción en absoluto.

  2. No ejecute scripts SQL desde Python; tenga el código en scripts SQL separados para que el análisis sea fácil, en un archivo Python separado, incrustado en su código Python, en un procedimiento en la base de datos... etc. Esta es probablemente mi opción preferida.

  3. Usar subprocess y llame al script de esa manera. Esta es la opción más simple y rápida pero no usa cx_Oracle en absoluto.

    >>> 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
    >>>