2011-09-23 44 views

答えて

7

PEP-249(cx_oracleが準拠しようとする)には、実際にはそのような方法はありません。

ただし、プロセスはかなり簡単です。ファイルの内容を文字列に引っ張り、 ";"で分割します。結果の配列の各メンバーで.executeを呼び出します。私は、 ";"文字は、ファイル内のoracle SQL文を区切るためにのみ使用されます。

f = open('tabledefinition.sql') 
full_sql = f.read() 
sql_commands = full_sql.split(';') 

for sql_command in sql_commands: 
    curs.execute(sql_command) 
+3

セミコロンを含む文字列リテラルがある場合、 ';'で分割すると失敗します。これは簡単なスキャンの少しを取るかもしれません。 – 9000

+1

合意 - それは私が "私は"; "文字がファイル内のOracle SQL文を区切るためにのみ使用されていると仮定していると言いました。あなたは明白な問題をより明確に述べました。ありがとう! – chipchilders

9

また、SQL * Plus(Oracleのコマンドライン・ツール)を使用してスクリプトを実行することもできます。 subprocessモジュールを使ってこれをPythonから呼び出すことができます。ここにはウォークスルーがあります:http://moizmuhammad.wordpress.com/2012/01/31/run-oracle-commands-from-python-via-sql-plus/tables.sqlようなスクリプトについては

(意図的なエラーを注意してください):

CREATE TABLE foo (x INT); 

CREATE TABLER bar (y INT); 

次のような機能を使用することができます。

from subprocess import Popen, PIPE 

def run_sql_script(connstr, filename): 
    sqlplus = Popen(['sqlplus','-S', connstr], stdin=PIPE, stdout=PIPE, stderr=PIPE) 
    sqlplus.stdin.write('@'+filename) 
    return sqlplus.communicate() 

connstrcx_Oracleのために使用したのと同じ接続文字列です。 filenameはスクリプトの完全なパスです(例:'C:\temp\tables.sql')。この関数はSQL Plusセッション(開始メッセージをサイレントにするために '-S')を開き、 "@filename"をキューに入れて送信します。これはSQL Plusにスクリプトの実行を指示します。

sqlplus.communicateは、コマンドをstdinに送信し、SQL * Plusセッションが終了するのを待ってから、(stdout、stderr)をタプルとして返します。場合は、ユーザーに全体の出力を示すことができる - これはあなたのプログラムの残りの部分に戻りたいものに応じて、少し解析がかかります

>>> output, error = run_sql_script(connstr, r'C:\temp\tables.sql') 
>>> print output 

Table created. 

CREATE TABLER bar (
     * 
ERROR at line 1: 
ORA-00901: invalid CREATE command 

>>> print error 

:上記tables.sqlでこの関数を呼び出すと、次のような出力が得られますインタラクティブであるか、OKであるかどうかを確認したい場合は「ERROR」という単語をスキャンします。

+0

PL/SQLの場合、受け入れられた回答は機能しません。この場合、このsqlplusビットは正常です。 –

関連する問題