2009-12-21 11 views
7

पर एक कर्सर घोषित करें मैं एक सारणी पर एक कर्सर घोषित करना चाहता हूं जो मौजूद नहीं है। बेशक, मेरी प्रक्रिया संकलित नहीं है।ओरेकल पीएलएसक्यूएल - एक गैर-मौजूदा तालिका

यह तालिका एक अस्थायी तालिका है, और एक पूर्व प्रक्रिया द्वारा बनाई गई है। यह रनटाइम पर मौजूद होगा, लेकिन संकलन समय पर इसकी एक और कहानी होगी।

मेरे चयन के लिए/अपडेट करती है, अन्य DML कार्रवाई, मैं

EXECUTE IMMEDIATE 'operation from tmp_table'

का उपयोग किया है, लेकिन मैं कर्सर के लिए एक समाधान नहीं मिल रहा।

क्या कोई तरीका है?

SQL> declare 
    2 c sys_refcursor; 
    3 BEGIN 
    4 open c for 'select * from pepito'; -- 'pepito' does not exist 
    5 close c; 
    6 end; 
    7/
declare 
* 
ERROR at line 1: 
ORA-00942: table or view does not exist 
ORA-06512: at line 4 

प्रक्रिया बनाएं, धन्यवाद का उपयोग करना चाहिए:

मूल रूप से, मैं इस संकलन करने

drop table test; 

/*from this on should compile*/ 
DECLARE 
cursor c is select * from test; 

BEGIN 
    for reg in c LOOP 
    /*...*/ 
    END LOOP; 
END; 

अद्यतन

अब तक संकलन नहीं चाहते हैं।

अग्रिम धन्यवाद।

+0

का कारण नहीं है, क्योंकि आप वास्तव में कोड को चलाने के लिए आप अपवाद मिल में अच्छा अभ्यास माना जाता है। कोड को संकलित करने के लिए 'प्रक्रिया प्रक्रिया test_cursor AS' बनाएं' द्वारा अपना 'घोषित करें' बदलें। –

+0

: फेसपाल्म 15cccc – Tom

+0

TOAD में कोई संकलन बटन नहीं है। : एस यह छोटा होना चाहिए !!! – Tom

उत्तर

7

आप इस तरह अपने कर्सर को परिभाषित करने में सक्षम होना चाहिए:

DECLARE 
    c SYS_REFCURSOR; 
BEGIN 
    OPEN c FOR 'SELECT * FROM dual'; 
    CLOSE c; 
END; 

तुम भी तर्क बाध्य कर सकते हैं:

OPEN c FOR 'SELECT * FROM dual WHERE DUMMY = :1' USING 'X'; 

के लिए और अधिक जानकारी के OPEN-FOR Statement के ओरेकल दस्तावेज़ देखें।

एक संग्रहीत प्रक्रिया

CREATE OR REPLACE PROCEDURE test IS 
    c SYS_REFCURSOR; 
BEGIN 
    OPEN c FOR 'SELECT * FROM fdfdfdfdfd'; 
    CLOSE c; 
END; 
/
+0

धन्यवाद, लेकिन दोहरी एक मौजूदा तालिका है। मुझे इसे करने की ज़रूरत है रन टाइम पर मौजूदा टेबल नहीं। – Tom

+0

टाइपो, इसके संकलन समय। – Tom

+0

मुझे यकीन नहीं है कि आपका क्या मतलब है। आप 'SELECT * से कुछ_not_existing_table' से प्रदत्त स्रोत भी बदल सकते हैं। यह ठीक से संकलित होगा और रनटाइम पर तोड़ देगा तालिका अभी भी मौजूद नहीं है। –

3

का उपयोग कर उदाहरण आप DBMS_SQL का उपयोग पीटर लैंग द्वारा वर्णित रेफरी कर्सर विधि की तुलना में और भी अधिक लचीलापन लाने के लिए कर सकते हैं। लेकिन इसका मतलब है कि और भी काम है।

5

अस्थायी टेबल बनाना के रूप में आवश्यक आमतौर पर ओरेकल, जहां वैश्विक अस्थायी टेबल्स बेहतर कर रहे हैं और इस समस्या को

+0

मैं इसे ध्यान में रखूंगा, लेकिन समय कम है। शायद अगली बार। – Tom

+1

+1 ग्लोबल अस्थायी टेबल्स फ्लाई पर टेबल बनाने/नष्ट करने से कहीं ज्यादा बेहतर हैं। फ्लाई पर टेबल बनाना बहुत अधिक त्रुटि-प्रवण और बनाए रखने के लिए कठिन है। –