複数のステートメントを同時に実行することは可能ですが、それはややハッキーです。ステートメントをラップして、一度に1つずつ実行する必要があります。
>>> 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()
>>>
お気づきのとおり、これではセミコロンの問題は解決されません。セミコロンの問題については、簡単な答えはありません。私が見ているように、3つのオプションがあります:
-
複雑すぎるパーサーを作成しますが、これはまったく良い選択肢ではないと思います。
-
PythonからSQLスクリプトを実行しないでください。解析が簡単になるように、コードを個別のSQLスクリプトに含めるか、個別のPythonファイルに含めるか、Pythonコードに埋め込むか、データベースのプロシージャに含めるかなどです。これはおそらく私の推奨オプションです。
-
subprocess
を使用する そのようにスクリプトを呼び出します。これは最も簡単で迅速なオプションですが、cx_Oracle
を使用しません まったく。>>> 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 >>>