में cx_Oracle उपयोग करने के साथ पार्स एसक्यूएल फ़ाइल मैं एक एसक्यूएल फ़ाइल जो मैं पार्स और cx_Oracle
अजगर लाइब्रेरी का उपयोग कर ओरेकल में निष्पादित करने के लिए चाहते हैं। एसक्यूएल फ़ाइल में क्लासिक डीएमएल/डीडीएल और पीएल/एसक्यूएल दोनों शामिल हैं, उदाहरण के लिए। इसे इस तरह देख सकते हैं:PL/SQL और DML/DDL अजगर
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);
अगर मैं SQLDeveloper या SQL * प्लस में इस फ़ाइल का उपयोग, यह 3 प्रश्नों में विभाजित और निष्पादित किया जाएगा।
हालांकि, cx_Oracle.connect (...)। कर्सर()। निष्पादित (...) एक समय में केवल एक क्वेरी, नहीं एक पूरी फ़ाइल ले सकते हैं। मैं बस string.split(';')
(जैसा कि यहां बताया गया है execute a sql script file from cx_oracle?) का उपयोग करके स्ट्रिंग को विभाजित नहीं कर सकता है, क्योंकि दोनों टिप्पणियां विभाजित होंगी (और एक त्रुटि होगी) और पीएल/एसक्यूएल ब्लॉक को एकल कमांड के रूप में निष्पादित नहीं किया जाएगा, इस प्रकार एक त्रुटि हो सकती है।
ओरेकल फ़ोरम (https://forums.oracle.com/forums/thread.jspa?threadID=841025) पर मुझे पता चला है कि cx_Oracle स्वयं पूरी फ़ाइल को पार्स की तरह समर्थन नहीं करता है। मेरा सवाल है - क्या यह मेरे लिए ऐसा करने का एक उपकरण है? उदाहरण के लिए। एक पायथन पुस्तकालय मैं अपनी फाइल को प्रश्नों में विभाजित करने के लिए कह सकता हूं?
संपादित करें: सबसे अच्छे समाधान सीधे SQL * प्लस का उपयोग करना प्रतीत होता है। मैं इस कोड का उपयोग किया है:
# 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))
। असल में, ओरेकल ब्राइंडेड है और वास्तव में बहु-कथन एसक्यूएल स्क्रिप्ट्स को पार्स करने के लिए * किसी * अंतर्निहित क्षमता में नहीं है, इसलिए एसक्यूएल * प्लस और एसक्यूएल डेवलपर और TOAD सभी अपने * अपने * पार्सर्स को लागू करते हैं :-( –