SQLPlus के साथ एक स्क्रिप्ट निष्पादित करें जिसमें रिक्तियां, अर्ध-कॉलोन और आगे स्लैश शामिल हैं


15

कभी-कभी मुझे एक स्क्रिप्ट मिलेगी जो SQL डेवलपर या टॉड में ठीक चलेगी, लेकिन एसक्यूएल या प्लस से सफलतापूर्वक चलाने के लिए संशोधन की आवश्यकता होती है। यहाँ एक सबसे खराब स्थिति उदाहरण है जिसमें खाली लाइनों, अर्धविरामों और आगे की स्लैश के साथ कई कथन हैं:

INSERT INTO t1 VALUES ('a

;
/
');

INSERT INTO t1 VALUES ('b

;
/
');

DELETE FROM t1 WHERE c1 = 'c

;
/
';

विभिन्न कारणों से इन कथनों को SQL * प्लस से चलाने की आवश्यकता है। रिक्त लाइनों को एक सरल के साथ हल करना आसान है ...

set sqlblanklines on

मुझे पता है कि sqlterminatorबदला जा सकता है और / या बंद किया जा सकता है, लेकिन दोनों को कोड में संशोधन की आवश्यकता होगी, पूर्व समस्या को हल किए बिना ले जाता है और न ही एम्बेडेड स्लैश मुद्दे को हल करता है।

सबसे अच्छा उत्तर यह होगा कि इन बयानों को किसी तरह से पर्यावरण में बदलाव के बिना संशोधन के बिना चलाने की अनुमति दी जाए (जैसा कि sqlblanklines करता है)। यदि यह संभव नहीं है, तो शायद प्रोग्राम को स्क्रिप्ट को संशोधित करने का एक तरीका है। मैं मैनुअल बदलावों से बचने की कोशिश कर रहा हूं।


SQLPLUS के कमांड लाइन निष्पादन का उपयोग करते समय यह समस्या आसानी से हो सकती है। जब आप SQLPLUS प्रोग्राम के अंदर होते हैं, तो कमांड लाइन एडिटर भी सक्रिय रहता है। परिणामस्वरूप, आइटम जो कमांड लाइन संपादक के लिए प्रासंगिक हैं (रिक्त स्थान कमांड / चर के रूप में व्याख्या किए जाते हैं, अर्ध-कॉलोन को कमांड के अंत के रूप में देखा जाता है)। इसीलिए पासवर्ड में '@' होने पर साइन इन करने की कोशिश के दौरान दिल के दर्द के अलावा कुछ नहीं होता है (@ के दाईं ओर सब कुछ एक डीबी के नाम के रूप में देखा जाता है)। एक प्रमुख परिनियोजन के दौरान, हमें रिक्त स्थानों के साथ समस्या मिली जिसने हमें TOAD के माध्यम से सामान तैनात करने के लिए मजबूर किया। SQLPLUS बेकार था
TomV

आपके विचारों के लिए धन्यवाद। तो, स्पष्ट करने के लिए आपका जवाब है कि मैं जो अनुरोध कर रहा हूं वह असंभव है?
लेह रिफ़ेल

क्या आप गाड़ी के रिटर्न को स्ट्रिंग के भीतर chr (10) के इंसर्ट में एक लाइन पर सूचीबद्ध कर सकते हैं?
क्रिस सैक्सन

@ChrisSaxon मैं कर सकता हूं, लेकिन यह मुद्दा है कि रिटर्न को कैसे अलग किया जाए, जिसे एन्कोड किया जाए और रिटर्न जो सिंटैक्स के हिस्से के रूप में अकेला छोड़ दिया जाए। यदि आपके पास ऐसा करने का कोई तरीका है तो कृपया इसे उत्तर के रूप में पोस्ट करें।
लेह रिफ़ेल

जवाबों:


8

आप इसका ज्यादातर उपयोग login.sql का उपयोग करके कर सकते हैं। login.sql के दौरान निष्पादित किया जाता है - आश्चर्यजनक - लॉगिन और आपके SQLPATH या वर्तमान निर्देशिका से लोड किया जाता है। आपके द्वारा दिए गए उदाहरणों के लिए, आपके वास्तव में सबसे खराब स्थिति को चुना गया है।

समस्या चक्रवर्ती है। जो कुछ भी आप वहां डालते हैं, आगे स्लैश को एक नि: शुल्क sqlterminator के रूप में बनाए रखा जाता है। इसके बाद, sqlplus पहले sqlterminator के लिए स्कैन करता है और स्ट्रिंग टर्मिनेटर पर स्कैन करने से पहले ऐसा करता है। एक बग यदि आप मुझसे पूछें। फॉरवर्ड स्लैश का उपयोग एक स्ट्रिंग में किया जा सकता है जब तक कि यह एक अलग लाइन पर अकेला न हो। जैसे ही sqlplus को sqlterminator के रूप में निर्दिष्ट वर्ण का पता चलता है, यह सब कुछ अनदेखा कर देता है और पढ़ना बंद कर देता है।

फ़ॉरवर्ड स्लैश को तब तक संभाला जा सकता है, जब तक वह एक लाइन पर अकेला न हो।

login.sql में शामिल हैं:

prompt run login.sql
show sqlterminator
show sqlblanklines
set sqlblanklines on
set sqlterminator ';'
show sqlterminator
show sqlblanklines
prompt ready login.sql
set echo on

leigh.sql में शामिल हैं:

INSERT INTO t1 VALUES ('fail bc semicolon
a;a
/
'); 

INSERT INTO t1 VALUES ('fail bc solo /


aa
/
');

INSERT INTO t1 VALUES ('ok / not solo


aa
/a
');

DELETE FROM t1 WHERE a = 'c


a/
';

स्क्रिप्ट चलाएँ:

sqlplus leigh/leigh@orcl @leigh
SQL*Plus: Release 10.2.0.4.0 - Production on Thu Aug 9 22:36:20 2012

Copyright (c) 1982, 2007, Oracle.  All Rights Reserved.


Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
Data Mining and Real Application Testing options

run login.sql
sqlterminator ";" (hex 3b)
sqlblanklines OFF
sqlterminator ";" (hex 3b)
sqlblanklines ON
ready login.sql
SQL> INSERT INTO t1 VALUES ('fail bc semicolon
  2  a;a
  3  /
ERROR:
ORA-01756: quoted string not properly terminated


SQL> ');
SP2-0042: unknown command "')" - rest of line ignored.
SQL> 
SQL> INSERT INTO t1 VALUES ('fail bc solo /
  2  
  3  
  4  aa
  5  /
ERROR:
ORA-01756: quoted string not properly terminated


SQL> ');
SP2-0042: unknown command "')" - rest of line ignored.
SQL> 
SQL> INSERT INTO t1 VALUES ('ok / not solo
  2  
  3  
  4  aa
  5  /a
  6  ');

1 row created.

SQL> 
SQL> DELETE FROM t1 WHERE a = 'c
  2  
  3  
  4  a/
  5  ';

0 rows deleted.

शुरू / अंत ब्लॉक के साथ बेला करने की कोई जरूरत नहीं है। कमांड के अंदर sqlterminator को संभाल नहीं सकते, चाहे वह किसी भी प्रकार का हो, स्ट्रिंग में हो या नहीं, एक स्ट्रिंग में लाइन पर आगे स्लैश के साथ लाइनों को संभाल नहीं सकता है।


1
सबूत के लिए धन्यवाद। मैं पहले से ही login.sql फ़ाइल सेटअप का उपयोग कर रहा हूँ। इसलिए मूल रूप से यह पुष्टि करता है कि मैं ऐसा क्यों करना चाहूंगा।
लेह रिफ़ेल

1
थोड़ी भिन्नता एक रनर स्क्रिप्ट का उपयोग करना है जो सेटिंग्स करता है और वास्तविक स्क्रिप्ट को कॉल करता है। Sqlplus leigh / leigh @ orcl @runner leigh बन जाएगा। यह login.sql की तुलना में थोड़ा अधिक लचीला है
ik_zelf

1

BEGIN ... END ब्लॉक्स के अंदर रखे जाने पर रिक्त लाइनों और अर्ध-कॉलनों के साथ बयान डालें। यह परिवर्तन स्क्रिप्ट का उपयोग करके किया जा सकता है, लेकिन अगर यह DDL कथन सम्‍मिलित नहीं किया जा सकता है, तो स्क्रिप्ट विफल हो जाएगी, जिसे तत्‍काल निष्पादित किए बिना किसी ब्लॉक के अंदर नहीं चलाया जा सकता है।

यह समाधान भी एम्बेडेड / समस्या का समाधान नहीं करता है।


अतीत में मैंने sqlplus से बचने के लिए ऐसा करने के लिए एक perl / DBD स्क्रिप्ट का उपयोग किया है। साझा करने के लिए खुश ...
फिल्प

@Phil धन्यवाद, लेकिन SQLPlus 99.9% स्थितियों में ठीक काम करता है, इसलिए मैं मिश्रण में एक और उपकरण नहीं जोड़ूंगा।
लेह रिफ़ेल

1

मेरा समाधान:

         begin
             INSERT INTO t1 VALUES ('a

             ;
             ');
         end;
         /

ऐसा लगता है कि बॉडी स्टेटमेंट के अंदर कमांड टर्मिनेटर को नजरअंदाज किया जाता है।


डीडीएल बयानों या एम्बेडेड स्लैश के लिए यह एक अच्छा समाधान क्यों नहीं है, इसके लिए मेरा जवाब देखें।
लीघ रिफ़ेल

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.