2011-02-10 17 views
6

के परिणाम को संग्रहीत करने के लिए मेरी आवश्यकता है एक स्क्लप्लस ऑपरेशन के परिणाम को मेरी खोल स्क्रिप्ट में एक चर में संग्रहीत करना है। मैं निम्नलिखित आपरेशन के परिणाम जो मेरे .sh फ़ाइल में हैSQLPlus से एक shell variable

sqlplus 'user/pwd' @test.sql 

मैं पहले से ही

testvar = 'sqlplus 'user/pwd' 
@test.sql' 

की कोशिश की है, लेकिन वह काम नहीं करता की जरूरत है।

संपादित ::

मैं इसे

testvar=sqlplus foo/[email protected] @test.sql 

लिए बदल गया और यह कहते हैं

SQL*Plus:: not found [No such file or directory]

मैं

के साथ करने की कोशिश की

और यह वही त्रुटि देता है। मैं की तरह

नीचे
sqlplus foo/[email protected] @test.sql 

यह ठीक काम करता है

+0

बोर्न-प्रकार के खोल (जैसे बैश) में, वाक्यविन्यास '=' के आस-पास की जगहों की अनुमति नहीं देता है। –

उत्तर

9

रोजगार बैकटिक चर काम बिना प्रयास करते हैं:

testvar=`sqlplus foo/bar @test.sql` 

या कि वाक्य-नाक में दम का होना चाहिए:

testvar=$(sqlplus foo/bar @test.sql) 

आप सुपरफ्लू को सीमित करने के लिए सही एसक्यूएल * प्लस कमांड लेने के लिए स्पष्ट रूप से जानें ous आउटपुट, हाँ? :) और निश्चित रूप से बैकटिंग से सावधान रहें आउटपुट के व्हाइटस्पेस को ध्वस्त कर देगा।

+1

"बैकटीटिंग आउटपुट के व्हाइटस्पेस को ध्वस्त कर देगा" - यह नहीं होगा। यह सिर्फ पिछली न्यूलाइन को हटा देगा। इसके अलावा, '$()' का उपयोग करने में पुरानी स्कूली शिक्षा नहीं है, बल्कि यह दूसरी तरफ है। –

+1

यह दूसरी तरफ है: बैकटीक्स "पुराना स्कूल" है। असाइनमेंट पर व्हाइटस्पेस खो नहीं गया है। यदि चर को उद्धृत नहीं किया गया है तो यह आउटपुट पर खो जाता है। –

+0

हां, आप '$()' के बारे में सही हैं, मैंने वास्तव में अन्य विकल्प जोड़ने के लिए बाद में संपादित किया था और चारों ओर स्विच करना भूल गया था। – Xailor

1

$() के भीतर आदेशों को कम से कम निष्पादित किया जाता है, सुनिश्चित करें कि आपके पास निर्यात की गई एसक्लप्लस के आमंत्रण के लिए आवश्यक सब कुछ है। अभी आप स्पष्ट रूप से PATH समस्या में ठोकर खाई हैं।

13

ऐसा करें:

testvar=`sqlplus -s foo/[email protected] <<EOF 
set pages 0 
set head off 
set feed off 
@test.sql 
exit 
EOF` 

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

+0

पास पैरामीटर – agonen

+0

धन्यवाद के मामले में सत्यापित करना चाहिए। मैं इस तरह एक वाक्यविन्यास की तलाश में था। मैं एक एसक्यूएल फ़ाइल का उपयोग नहीं करना चाहता था। –

0

यहां समाधान सभी हैक्स हैं।

आपका एसक्यूएल फ़ाइल इस तरह दिखना चाहिए ...

set termout off 
set showmode off 
set heading off 
set echo off 
set timing off 
set time off 
set feedback 0 
set pagesize 0 
set embedded ON 
set verify OFF 

spool courses.sh 
SELECT 'term="' || sfrstcr_term_code || '";', 'subj="' || sfrstcr_subj_code || '";' FROM sfrstcr WHERE sfrstcr_pidm = 1234567; 
spool off 

निम्नलिखित खोल स्क्रिप्ट पढ़ सकते हैं और खोल वातावरण चर बाहर प्रिंट होगा।

while read -r row; do 
    eval "$row" 
    echo "term=$term"; 
    echo "subj=$subj"; 
done < courses.sh 

यह महत्वपूर्ण है कि सभी चर, एक पंक्ति में कर रहे हैं के रूप में पढ़ें आदेश सुनिश्चित करता है कि आप पाश प्रति प्रत्येक डीबी पंक्ति पढ़ सकते हैं।

+0

@ ट्रेंटन-डी-एडम्स टर्मआउट ऑफ - टर्मिनल पर कोई डिस्प्ले नहीं है। मुझे लगता है कि जब तक आप स्पूल कमांड का उपयोग नहीं करते, तब तक इसे छोड़ना बेहतर होता है – agonen

संबंधित मुद्दे