sql >> Database >  >> RDS >> Oracle

SQL-bestand ontleden met PL/SQL en DML/DDL met cx_Oracle in python

Het is mogelijk om meerdere instructies tegelijkertijd uit te voeren, maar het is semi-hacky. U moet uw verklaringen inpakken en ze een voor een uitvoeren.

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

Zoals je hebt opgemerkt, lost dit het puntkommaprobleem niet op, waarvoor geen eenvoudig antwoord bestaat. Zoals ik het zie heb je 3 opties:

  1. Schrijf een te ingewikkelde parser, wat volgens mij helemaal geen goede optie is.

  2. Voer geen SQL-scripts uit vanuit Python; de code in afzonderlijke SQL-scripts hebben, zodat het parseren eenvoudig is, in een apart Python-bestand, ingebed in uw Python-code, in een procedure in de database... enz. Dit is waarschijnlijk mijn voorkeursoptie.

  3. Gebruik subprocess en noem het script op die manier. Dit is de eenvoudigste en snelste optie, maar maakt geen gebruik van cx_Oracle helemaal niet.

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



  1. Verwijder dubbele rijen in een tabel zonder primaire sleutel

  2. JPA op Java SE:Object:[email-protected] is geen bekend entiteitstype

  3. Star Trek 3D-schaakgegevensmodel

  4. Er is een JNI-fout opgetreden, controleer uw installatie en probeer het opnieuw in Eclipse x86 Windows 8.1