2011-01-18 10 views
5

मैं एमएस एसक्यूएल चालक संस्करण 3.0 का उपयोग कर मानक जेडीबीसी कनेक्शन के माध्यम से संग्रहीत प्रक्रिया निष्पादित कर रहा हूं।शून्य परिणाम के साथ जेडीबीसी का उपयोग कर अस्थायी सारणी

मुझे पता चला है कि जब मैं एक अस्थायी तालिका में डेटा बना और डालता हूं तो संग्रहित प्रक्रिया ठीक से निष्पादित नहीं होती है।

जावा कोड अपवाद नहीं फेंक देगा, लेकिन javax.sql.ResultSetnull होगा।

संग्रहीत प्रक्रिया में विफलता की बात है जब मैं संयुक्त राष्ट्र-टिप्पणी INSERT INTO #TBL CLM_NAME VALUES('VAL')

जब मैं बयान एसक्यूएल स्टूडियो प्रबंधक यह परेशानी और डेटा के बिना निष्पादित करता है की उम्मीद के रूप में प्रयोग को अंजाम है।

क्या कोई इस पर आ गया है या पता है कि इसका मामला क्यों है?

शुरू में मैं अपने एसक्यूएल चालक की वजह से सोचा और मुझे अभी भी लगता है?

धन्यवाद।

+0

क्या आप सुनिश्चित कर सकते हैं कि आप टेम्पलेट टेबल बना रहे हैं और लोड कर रहे हैं और सभी एक ही कनेक्शन में पढ़ रहे हैं? – CoolBeans

+0

हां, अस्थायी तालिका बनाई गई संग्रहित प्रक्रिया से बनाई गई है। मैं केवल जावा कोड से संग्रहित प्रक्रिया को कॉल करता हूं, उदाहरण connect.executeQuery ("{procName (?)}")। – Koekiebox

+1

क्या एक ही संग्रहीत प्रक्रिया में स्थित अपमानजनक 'INSERT' निर्देश है जो अस्थायी तालिका बनाता है? –

उत्तर

13

शायद this will help:

यह अनुशंसित है कि आप अस्थायी तालिकाओं का उपयोग करना चाहते हैं, तो आप "prepareStatement" नहीं बुलाना चाहिए। आप सीधे कथन ऑब्जेक्ट से क्वेरी निष्पादित कर सकते हैं।

उदाहरण के लिए:

String sql = "select uuid, name from Component"; 

Statement stmt = dbCon.createStatement(); 
ResultSet rs = stmt.executeQuery(sql); 

यदि आप "prepareStatement" कॉल करना होगा, तो आप एक वास्तविक तालिका बनाने के लिए और, यदि आवश्यक हो तो, टेबल बाद में हटाना की आवश्यकता होगी।

+0

बेशक, यदि आपके पास कोई पैरामीटर है, तो आपको createStatement का उपयोग करना चाहिए, निर्माण नहीं करना चाहिए, या आपको एसक्यूएल इंजेक्शन के बारे में बहुत सावधान रहना चाहिए: http://stackoverflow.com/questions/1582161/how-does-a-preparedstatement- टालना-या-रोकथाम-एसक्यूएल-इंजेक्शन –

2

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

+0

मैंने अस्थायी तालिकाओं या तालिका चर के बजाय उप क्वेरी को छोड़ दिया और उपयोग किया। –

6

executeQuery() का उद्देश्य उन प्रश्नों के साथ उपयोग किया जाना है जो परिणामसेट, आमतौर पर चयन विवरण लौटाते हैं।

executeUpdate() INSERT, UPDATE, DELETE या DDL स्टेटमेंट्स के लिए है जो अपडेट मायने रखता है।

उपरोक्त दोनों (परिणामसेट्स और अपडेट गणना) जेडीबीसी द्वारा "परिणाम" के रूप में माना जाता है। उन प्रश्नों के लिए जो कई परिणामों को लौटते हैं, इसके लिए हमें निष्पादन() का आह्वान करना आवश्यक है।

यदि संग्रहीत प्रक्रिया temp तालिकाओं का उपयोग करती है, तो शायद यह पहले अपडेट गिनती देता है, जिसके बाद परिणामसेट होता है। आपको क्वेरी चलाने के लिए execute() का उपयोग करना चाहिए, अद्यतन गिनती को छोड़ने के लिए getMoreResults() पर कॉल करें और फिर प्राप्त करने के लिए getResultSet() को कॉल करें परिणाम आप चाहते हैं। यहां समस्या यह है कि हमें getResultSet() को कॉल करके परिणाम सेट लाने के लिए getMoreResults() को कई बार कॉल करके परीक्षण और त्रुटि करना है।

परीक्षण और त्रुटि के ऊपर के तरीके के बजाय, आप पर सेट एनओसीटीटी निर्दिष्ट करके सभी अतिरिक्त "क्वेरी परिणाम" दबा सकते हैं।

परिवर्तन की आवश्यकता है,

  1. सपा में "SPCHILD" अपने तर्क रखो। इस संग्रहीत प्रक्रिया में अस्थायी तालिका निर्माण के साथ तर्क होगा।

  2. नीचे के रूप में एक सपा "SPPARENT" बनाएँ,

    CREATE PROCEDURE [dbo].[SPPARENT] @Id int = NULL 
    AS 
    BEGIN 
    SET NOCOUNT ON; 
    EXEC(' SPCHILD @Id = ' + @Id) 
    END 
    

    से माता-पिता सपा "SPPARENT" आप अपने वास्तविक सपा अर्थात "SPCHILD" कॉल करने के लिए की है।

  3. अपने जेडीबीसी कोड से "SPPARENT" पर एक एसपी कॉल करें।

+0

महान जवाब! टेबल टेम्पलेट टेबल घोषित करने के साथ भी काम करता है। –

+0

महान जवाब! मैं तुमसे प्यार करता हूँ! – Benyamin

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