Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Przeanalizuj plik SQL z PL/SQL i DML/DDL przy użyciu cx_Oracle w pythonie

Możliwe jest wykonanie wielu instrukcji jednocześnie, ale jest to trochę hackowe. Musisz opakować swoje oświadczenia i wykonać je pojedynczo.

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

Jak zauważyłeś, nie rozwiązuje to problemu średnika, na który nie ma łatwej odpowiedzi. Jak widzę masz 3 opcje:

  1. Napisz zbyt skomplikowany parser, co moim zdaniem wcale nie jest dobrą opcją.

  2. Nie wykonuj skryptów SQL z Pythona; mieć kod w oddzielnych skryptach SQL, więc parsowanie jest łatwe, w oddzielnym pliku Pythona, osadzonym w kodzie Pythona, w procedurze w bazie danych... itd. Jest to prawdopodobnie moja preferowana opcja.

  3. Użyj subprocess i nazwij skrypt w ten sposób. Jest to najprostsza i najszybsza opcja, ale nie używa cx_Oracle w ogóle.

    >>> 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Lista terytoriów obsługiwanych przez bazę danych Oracle

  2. Otwórz kursor dla dynamicznej nazwy tabeli w procedurze PL/SQL

  3. Pobieranie następnej wartości z sekwencji z hibernacją wiosenną

  4. Jak mogę zdefiniować typ w oracle11g, który odwołuje się do kolekcji tego typu?

  5. Importowanie plików w Oracle Apex za pomocą wwv_flow_files