2009-07-10 8 views
17

मुझे पता है कि हम दुर्लभ हैं, हम गरीब लोक जो डीबी 2/एएस 400 के लिए आईएसरीज़ का उपयोग कर रहे हैं, लेकिन मुझे उम्मीद है कि कोई इस सरल प्रश्न का उत्तर दे सकता है। एसक्यूएल की दो पंक्तियों का उपयोग किए बिना एक सम्मिलित कथन से पहचान मान वापस करने का कोई तरीका है? मुझे एक डालने के लिए सी # में इनलाइन एसक्यूएल का उपयोग करने के लिए मजबूर किया जा रहा है, और फिर मुझे बाद में कुछ के लिए डालने के लिए उत्पन्न पहचान का उपयोग करने की आवश्यकता है। सीधे शब्दों में कहें, मुझे ओरेकल के "रिटर्निंग" के बराबर iSeries डीबी 2 की आवश्यकता है। आईई,iSeries डीबी 2 - क्या किसी सम्मिलन कथन से पहचान मान का चयन करने का कोई तरीका है?

INSERT INTO AwesomeTable (column1, column2, etc.) 
    VALUES (value1, value2, etc.) 
    RETURNING something; 

कोई भी? अग्रिम में धन्यवाद।

संपादित करें: जब तक किसी को एक तरह से मैं एक IBM.Data.DB2.iSeries.iDB2Command (नहीं एक संग्रहीत proc) में एसक्यूएल की दो पंक्तियाँ निष्पादित कर सकते हैं की जानता है, मैं सभी एसक्यूएल की एक पंक्ति में ऐसा करना चाहते हैं

+0

+1 अच्छा प्रश्न –

+0

क्या आपने इसे हल करने में कामयाब रहे? यदि हां कृपया अपना उत्तर पोस्ट करें। –

+0

@DamienJoe मैं अब iSeries का उपयोग नहीं कर रहा हूं और मेरे पास इन उत्तरों का परीक्षण करने के लिए उपयोग की जा सकने वाली किसी भी प्रणाली तक पहुंच नहीं है। यदि आप पाते हैं कि उनमें से एक काम करता है, तो कृपया यहां टिप्पणी करें और मैं उत्तर को स्वीकार के रूप में चिह्नित करूंगा। –

उत्तर

7

आपको IDENTITY_VAL_LOCAL स्केलर फ़ंक्शन का उपयोग करने की आवश्यकता है। IBM documentation से:

IDENTITY_VAL_LOCAL एक गैर नियतात्मक समारोह है कि रिटर्न एक पहचान स्तंभ के लिए सबसे हाल ही में सौंपा मूल्य है।

उदाहरण:

CREATE TABLE EMPLOYEE 
    (EMPNO INTEGER GENERATED ALWAYS AS IDENTITY, 
    NAME CHAR(30), 
    SALARY DECIMAL(5,2), 
    DEPT SMALLINT) 

INSERT INTO EMPLOYEE 
    (NAME, SALARY, DEPTNO) 
    VALUES('Rupert', 989.99, 50) 

SELECT IDENTITY_VAL_LOCAL() FROM SYSIBM.SYSDUMMY1 
+1

सी # प्रोग्राम में, मैं शायद दूसरे SQL कमांड के रूप में निम्नलिखित जोड़ दूंगा: "ऊपर दिए गए उदाहरण में VALUES INTO कथन के बजाय sysibm.sysdummy1 से पहचान_val_local() का चयन करें। –

+0

धन्यवाद, ट्रेसी - अच्छा सुझाव। मैंने जवाब अपडेट कर लिया है। –

+0

वह किसी भी तालिका पर किए गए नवीनतम ऑपरेशन द्वारा डाले गए पहचान फ़ील्ड को वापस करेगा और वह विशिष्ट तालिका नहीं। कई पहचान कॉलम टेबल में डालने वाले कई उपयोगकर्ताओं के साथ एक पर्यावरण की कल्पना करें? –

13

मैं iSeries के बारे में सुनिश्चित नहीं हूँ, लेकिन db2v8.1 पर काम किया है:

पर विचार करें 'आईडी' अपनी पहचान स्तंभ का नाम है।

SELECT ID FROM FINAL TABLE (
    INSERT INTO AwesomeTable (column1, column2, etc.) 
      VALUES (value1, value2, etc.)  
    ) 

कुछ स्पष्टीकरण मैं publib साइट पर पाया: निम्नलिखित stmt नई जनरेट आईडी (एक ही एक है कि डालने stmt द्वारा डाला जाता है) वापस आ जाएगी (मैं इसे इस्तेमाल किया संदर्भ मेरी क्वेरी का परीक्षण करने के लिए इसके बाद के संस्करण)

 /* The following SELECT statement references an INSERT statement in its 
      FROM clause. It inserts an employee record from host variables into 
      table company_b. The current employee ID from the cursor is selected 
      into the host variable new_id. The keywords FROM FINAL TABLE 
      determine that the value in new_id is the value of ID after the 
      INSERT statement is complete. 

      Note that the ID column in table company_b is generated and without 
      the SELECT statement an additional query would have to be made in 
      order to retreive the employee's ID number. 
     */ 
     EXEC SQL SELECT ID INTO :new_id 
       FROM FINAL TABLE(INSERT INTO company_b 
       VALUES(default, :name, :department, :job, :years, :salary, 
         :benefits, :id)); 

आशा इस मदद करता है :)

+1

हां, मैंने इसे सार्वजनिक साइट पर भी पाया है और इसे iSeries के साथ काम करने के लिए नहीं मिल सकता है। आपकी प्रतिक्रिया के लिए बहुत बहुत धन्यवाद। –

+1

आपका मतलब है कि अंतिम तालिका iSeries द्वारा समर्थित नहीं है? –

+1

अंतिम तालिका संस्करण 6.1 के साथ शुरू करने का समर्थन किया जाता है। एक सम्मिलित कथन द्वारा उपयोग किए जाने वाले पहचान मान को निर्धारित करने के लिए यह अनुशंसित दृष्टिकोण है। –

0

यहाँ एक उदाहरण है:

CREATE TABLE AUTOINC (          
    AUTO91 INTEGER  GENERATED ALWAYS AS IDENTITY,   
    SCDS91 CHAR(35)  NOT NULL DEFAULT '',     
    MCLD91 DECIMAL(3,0) NOT NULL DEFAULT 0,      
    CONSTRAINT PK_AUTOINC PRIMARY KEY(AUTO91)); 

// डिफ़ॉल्ट कीवर्ड पर ध्यान दें जहां ऑटो वृद्धि फ़ील्ड है।

insert into AUTOINC Values(default ,'SYSC' , 0) 

// और अंतिम पहचान कॉलम मान वापस करने के लिए फ़ंक्शन का उपयोग करना।

// नोट: केवल पहली पंक्ति प्राप्त करें।

select **IDENTITY_VAL_LOCAL**() from AUTOINC **fetch first row only** 
+0

में काम नहीं कर रहा है ... यह अनिवार्य रूप से एक उत्तर का डुप्लिकेट है जो यहां पोस्ट किया गया था ** 2 साल पहले **। उस से आपका जवाब क्या अंतर करता है? –

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

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