Tôi có một tệp SQL mà tôi muốn phân tích cú pháp và thực hiện trong oracle bằng cách sử dụng thư viện python cx_Oracle
. Tệp SQL chứa cả DML/DDL và PL/SQL cổ điển, ví dụ: nó có thể trông như thế này:Phân tích tệp SQL bằng PL/SQL và DML/DDL bằng cách sử dụng cx_Oracle trong python
create.sql
:
-- This is some ; malicious comment
CREATE TABLE FOO(id numeric);
BEGIN
INSERT INTO FOO VALUES(1);
INSERT INTO FOO VALUES(2);
INSERT INTO FOO VALUES(3);
END;
/
CREATE TABLE BAR(id numeric);
nếu tôi sử dụng tập tin này trong SQLDeveloper hoặc SQL * Plus, nó sẽ được chia thành 3 truy vấn và thực hiện.
Tuy nhiên, cx_Oracle.connect (...). Cursor(). Execute (...) chỉ có thể thực hiện MỘT truy vấn tại một thời điểm, không phải toàn bộ tệp. Tôi không thể đơn giản tách chuỗi bằng cách sử dụng string.split(';')
(như được đề xuất ở đây execute a sql script file from cx_oracle?), vì cả nhận xét sẽ được tách ra (và sẽ gây ra lỗi) và khối PL/SQL sẽ không được thực hiện dưới dạng lệnh đơn, do đó gây ra lỗi.
Trên diễn đàn Oracle (https://forums.oracle.com/forums/thread.jspa?threadID=841025) Tôi đã tìm thấy rằng chính cx_Oracle không hỗ trợ những thứ như phân tích cú pháp toàn bộ tệp. Câu hỏi của tôi là - có một công cụ để làm điều này cho tôi không? Ví dụ. một thư viện python tôi có thể gọi để chia tập tin của tôi thành các truy vấn?
Chỉnh sửa: Các giải pháp tốt nhất dường như sử dụng SQL * Plus trực tiếp. Tôi đã sử dụng mã này:
# open the file
f = open(file_path, 'r')
data = f.read()
f.close()
# add EXIT at the end so that SQL*Plus ends (there is no --no-interactive :(
data = "%s\n\nEXIT" % data
# write result to a temp file (required, SQL*Plus takes a file name argument)
f = open('tmp.file', 'w')
f.write(data)
f.close()
# execute SQL*Plus
output = subprocess.check_output(['sqlplus', '%s/%[email protected]%s' % (db_user, db_password, db_address), '@', 'tmp.file'])
# if an error was found in the result, raise an Exception
if output.find('ERROR at line') != -1:
raise Exception('%s\n\nStack:%s' % ('ERROR found in SQLPlus result', output))
Cùng một vấn đề ở đây. Về cơ bản, Oracle là braindead và không thực sự có khả năng * tích hợp sẵn để phân tích cú pháp các kịch bản lệnh SQL nhiều câu lệnh, vì vậy SQL * Plus và SQL Developer và TOAD thực hiện tất cả các trình phân tích cú pháp * riêng của họ :-( –