2011-12-21 11 views
7

मेरे पास मेरे प्रोग्राम के परिणामों को स्पूल करने के बारे में एक प्रश्न है। मेरा नमूना एसक्यूएल स्क्रिप्ट इस तरह दिखता है।ऑरैकल एसक्यूएल स्क्रिप्ट स्पूल फ़ाइल कैसे बनाएं

whenever sqlerror exit failure rollback 
    set heading off 
    set arraysize 1 
    set newpage 0 
    set pages 0 
    set feedback off 
    set echo off 
    set verify off 

declare 
ab varchar2(10) := 'Raj'; 
cd varchar2(10); 
a number := 10; 
c number; 
d number; 
begin 
c := a+10; 
select ab,c into cd,d from dual; 
end; 

SPOOL 
select cd,d from dual; 
SPOOL OFF 
EXIT; 

ऊपर स्क्रिप्ट काम नहीं करता है, लेकिन मैं शुरू अंत ब्लॉक हम कुछ मूल्यों की गणना में इस जहां की तरह कुछ करना चाहते हैं और मैं उन परिणामों स्पूल करना चाहते हैं।

धन्यवाद।

उत्तर

15

यह output_<YYYYMMDD>.txt स्थानीय पीसी सी की जड़ में स्थित कहा जाता है एक फ़ाइल में गुमनाम ब्लॉक से उत्पादन स्पूल जाएगा: ड्राइव जहां <YYYYMMDD> आज की तारीख है:

SET SERVEROUTPUT ON FORMAT WRAPPED 
SET VERIFY OFF 

SET FEEDBACK OFF 
SET TERMOUT OFF 

column date_column new_value today_var 
select to_char(sysdate, 'yyyymmdd') date_column 
    from dual 
/
DBMS_OUTPUT.ENABLE(1000000); 

SPOOL C:\output_&today_var..txt 

DECLARE 
    ab varchar2(10) := 'Raj'; 
    cd varchar2(10); 
    a number := 10; 
    c number; 
    d number; 
BEGIN 
    c := a+10; 
    -- 
    SELECT ab, c 
    INTO cd, d 
    FROM dual; 
    -- 
    DBMS_OUTPUT.put_line('cd: '||cd); 
    DBMS_OUTPUT.put_line('d: '||d); 
END; 

SPOOL OFF 

SET TERMOUT ON 
SET FEEDBACK ON 
SET VERIFY ON 

PROMPT 
PROMPT Done, please see file C:\output_&today_var..txt 
PROMPT 

आशा है कि यह मदद करता है ...

संपादित करें:

उत्पादन के लिए अपनी टिप्पणी एक कर्सर के हर यात्रा के लिए एक मूल्य के बाद (मुझे पता है प्रत्येक मान इस उदाहरण में ही होगा लेकिन आप मैं क्या कर रहा का सार मिलना चाहिए):

BEGIN 
    c := a+10; 
    -- 
    FOR i IN 1 .. 10 
    LOOP 
     c := a+10; 
     -- Output the value of C 
     DBMS_OUTPUT.put_line('c: '||c); 
    END LOOP; 
    -- 
END; 
+0

क्या होता है यदि ब्लॉक में कर्सर होता है और यह प्रारंभ-अंत में लूप होता है। 'लूप सी: = ए +10; सी में चयन करें: डी से दोहरी; एंड लूप; अंत; SPOOL चयन करें: दो से दोहरी; स्पूल ऑफ़ एक्स्टिट; ' तो, अब यह सभी परिणाम देगा या फिर अंतिम आउटपुट में संग्रहीत होगा: डी। लूप होने पर स्पूल कैसे करें। – user987900

+1

कर्सर के प्रत्येक पुनरावृत्ति पर मान को आउटपुट करने के लिए आप कर्सर लूप के भीतर DBMS_OUTPUT का उपयोग कर सकते हैं। संपादन देखें .. – Ollie

+0

हाय ओली, मेरे पास एक और सवाल है। जब मैं SQL * प्लस से चलाता हूं तो उपरोक्त कोड ठीक काम करता है। लेकिन, मेरे पास एक शेल स्क्रिप्ट है जो इस SQL ​​स्क्रिप्ट को आमंत्रित करती है और आउटपुट को टेक्स्ट फ़ाइल में स्पूल करती है। मैंने ओरेकल ऐप्स में शेल स्क्रिप्ट पंजीकृत की, और जब मैं ऐप्स से चलाने के लिए अनुरोध सबमिट करता हूं। यह सामान्य और चल रहा है लेकिन यह कभी पूरा नहीं हो जाता है। क्या, मुझे शैल स्क्रिप्ट से आविष्कार करते समय उपरोक्त स्क्रिप्ट में कोई भी परिवर्तन करना होगा। – user987900

2
स्पूल के साथ

:

set heading off 
    set arraysize 1 
    set newpage 0 
    set pages 0 
    set feedback off 
    set echo off 
    set verify off 

variable cd varchar2(10); 
variable d number; 

declare 
ab varchar2(10) := 'Raj'; 
a number := 10; 
c number; 
begin 
c := a+10; 
select ab,c into :cd,:d from dual; 
end; 

SPOOL 
select :cd,:d from dual; 
SPOOL OFF 
EXIT; 
+0

क्या होता है यदि ब्लॉक में कर्सर है और यह स्टार्ट-एंड के अंदर loops। 'लूप सी की तरह: = ए +10; सी में चयन करें: डी दोहरी से; अंत लूप; समाप्त; SPOOL का चयन करें: दोहरी से डी; स्पूल ऑफ एक्स्टिट; ' तो, अब यह सभी परिणाम देगा या फिर अंतिम आउटपुट में संग्रहीत होगा: डी। लूप होने पर स्पूल कैसे करें। – user987900

+0

इस तरह से काम नहीं करेगा। आप पीएल/एसक्यूएल नहीं, एसक्यूएल चयन स्पूल कर सकते हैं। पीएल/एसक्यूएल कोड में आउटपुट के लिए, आप dbms_output पैकेज का उपयोग कर सकते हैं, क्योंकि ओली ने संकेत दिया है। –

+0

आपकी मदद फ्लोरिन के लिए धन्यवाद .. – user987900

-3

आदेश plsql में एक स्पूल फ़ाइल निष्पादित करने के लिए जाओ फ़ाइल के लिए> New-> कमांड विंडो में -> अपने code-> पर अमल पेस्ट करें। निर्देशिका में मिला और आपको फ़ाइल मिल जाएगी।

0

BEGINEND ब्लॉक से स्पूल करने के लिए बहुत आसान है। उदाहरण के लिए यदि आपको दो टेबलों से फ़ाइल में परिणाम स्पूल करने की आवश्यकता है, तो बस for loop का उपयोग करें। नमूना कोड नीचे दिया गया है।

BEGIN 

FOR x IN 
(
    SELECT COLUMN1,COLUMN2 FROM TABLE1 
    UNION ALL 
    SELECT COLUMN1,COLUMN2 FROM TABLEB 
)  
LOOP 
    dbms_output.put_line(x.COLUMN1 || '|' || x.COLUMN2); 
END LOOP; 

END; 
/

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

  • कोई संबंधित समस्या नहीं^_^