Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Analysieren Sie die SQL-Datei mit PL/SQL und DML/DDL unter Verwendung von cx_Oracle in Python

Es ist möglich, mehrere Anweisungen gleichzeitig auszuführen, aber es ist halb hackig. Sie müssen Ihre Anweisungen umschließen und einzeln ausführen.

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

Wie Sie bemerkt haben, löst dies nicht das Semikolon-Problem, für das es keine einfache Antwort gibt. Wie ich es sehe, haben Sie 3 Möglichkeiten:

  1. Schreiben Sie einen zu komplizierten Parser, was meiner Meinung nach überhaupt keine gute Option ist.

  2. Führen Sie keine SQL-Skripte von Python aus; den Code entweder in separaten SQL-Skripten haben, damit das Parsen einfach ist, in einer separaten Python-Datei, eingebettet in Ihren Python-Code, in einer Prozedur in der Datenbank ... usw. Dies ist wahrscheinlich meine bevorzugte Option.

  3. Verwenden Sie subprocess und rufen Sie das Skript so auf. Dies ist die einfachste und schnellste Option, verwendet aber nicht cx_Oracle überhaupt.

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