2016-04-13 9 views
1

cx_oracleを介していくつかの.sqlファイルを実行する際に実際の問題が発生しています。たとえば、Oracle Developerを実行すると、以下のtest_table2.sqlが完全に実行されます。cx_oracleを使用してPython 2.7で複数のクエリを使用してSQLファイルを実行する

declare 
c int; 
begin 
select count(*) into c from user_tables where table_name = upper('TEST2'); 
if c = 1 then 
    execute immediate 'drop table TEST2'; 
end if; 

EXECUTE IMMEDIATE 'CREATE TABLE MURRAYLR.test2 as 
select * from Dans_Table'; 

EXECUTE IMMEDIATE'CREATE TABLE MURRAYLR.test1 
(customer_id number(10) NOT NULL, 
customer_name varchar2(50) NOT NULL, 
city varchar2(50) 
)'; 

end; 

Pythonコードは通常、単純なクエリで機能しますが、既存のテーブルスクリプトのチェックをしようとすると、エラーが発生します。 ORA-06550:行1、列15: PLS-00103:遭遇

パイソン2.7.11コード

import sys 
import cx_Oracle 

connection = cx_Oracle.connect('user','password','serv') 
cursor = connection.cursor() 

filename="C:\Users\desktop\Test_table2.sql" 

f = open(filename) 
full_sql = f.read() 
sql_commands = full_sql.replace('\n', '').split(';')[:-1] 

for sql_command in sql_commands: 
cursor.execute(sql_command) 

connection.close() 

エラーメッセージ

cursor.execute(sql_command) DatabaseError下記参照次のいずれかを予期している場合は、「ファイルの終わり」を示すシンボル:

= =。 (@%; null以外のデフォルトの文字)

答えて

1

あなたのコードを実行しようとはしていませんが(cxOracleでPythonをインストールしていないため)、匿名のPL/SQLブロックを複数の別々の文:。

sql_commands = full_sql.replace('\n', '').split(';')[:-1] 

したがって、あなたが実行しようとしている最初のSQLコマンドを使用すると、すでに単一無名PLであなたのすべてのコマンドを入れているのでどんな意味がありません

declare 
    c int; 

です/ SQLブロックでは、分割する必要はありません。全体を実行するだけです1つのコマンドとしてロックすると、うまくいくはずです。

UPDATE

完全なソリューション(未テスト):

import sys 
import cx_Oracle 

connection = cx_Oracle.connect('user','password','serv') 
cursor = connection.cursor() 

filename="C:\Users\desktop\Test_table2.sql" 

f = open(filename) 
full_sql = f.read() 
cursor.execute(full_sql) 

connection.close() 
+0

フランク、私はあなたのソリューションを理解していません。あなたは私にコードを渡してくれますか? –

+0

@LeeMurray私の更新答えを見てください。私はそれをテストすることができませんでしたが、それは動作するはずです(少し修正して、私は最近Pythonをあまり行っていません) –

関連する問題